Windows核心编程笔记(7)

1.绘图编程

绘图基础

· 绘图设备DC,绘图上下文/绘图描述表
· HDC - DC句柄,表示绘图设备
· GDI - Windows graphics device interface(Win32提供的绘图API)
· 颜色:R G B,每一个颜色是3个字节24位保存0-2^24-1
16位:5,5,6
32位:8,8,8,8绘图 透明度

颜色的使用
COLORREF - 时间DWORD
例如:COLORREF nColor = 0;

赋值使用RGB宏
例如: nColor = RGB(0,0,255);

获取RGB值
GetRValue/GetGValue/GetBValue
例如:BYTE nRed = GetRValue(nColor);

基本图形绘制

//绘制点
COLORREF SetPixel(
HDC hdc,//DC句柄
int X,//X坐标
int Y,//Y坐标
COLORREF crColor//设置的颜色
);//返回值为点原来的颜色
//绘制线
MoveToEx()//指明窗口当前点
LineTo()//从窗口当前点到指定点绘制一条直线
//封闭图形
Rectangle/Elliose()

一定要在WM_PAINT消息下绘制

2.GDI绘图对象

1.画笔
作用: 线的颜色、线型、线粗
HPEN - 画笔句柄

画笔的使用

//创建画笔
HREN CreatePen(
int fnPenStyle,//画笔的样式
int nWidth,//画笔的粗细
COLORREF crColor//画笔的颜色
)
PS_SOILD()//实心线,可以支持多个像素宽其他线型只能是一个像素宽
//将画笔应用到DC中
HGDIOBJ SelectObject(
HDC hdc,//绘图设备句柄
HGDIOBJ hgdiobj//GDI绘图对象句柄,画笔句柄
)
//绘图
//取出DC中的画笔,将原来的画笔,使用SelectObject函数,放入到设备DC中,就会将我们创建的画笔取出
//释放画笔
BOOL DeleteObject(
HDGIOBJ hObject //GDI绘图对象句柄,画笔句柄//只能删除不被DC使用的画笔,所以在释放前,必须将画笔从DC中1取出 
void DrawEll(HDC hdc)
{
    Ellipse(hdc, 200, 200, 100, 100);
}
void ON_DRAW(HWND hwnd)
{
    PAINTSTRUCT ps = { 0 };//绘图句柄
    HDC hdc = BeginPaint(hwnd, &ps);//DC句柄
    HPEN Rpen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));//创建红色实心画笔
    HGDIOBJ Oldpen = SelectObject(hdc, Rpen);//交换画笔
    DrawEll(hdc);//画圆
    SelectObject(hdc, Oldpen);//再次交换画笔,新建画红色笔自动销毁
    DeleteObject(Rpen);
    EndPaint(hwnd, &ps);//结束绘制
}

在这里插入图片描述
2.画刷
给封闭图形的填充的颜色、图案
1.创建画刷

CreateSolidBrush()//创建实心画刷
CreateHatchBrush()//创建纹理画刷

2.将画刷应用到DC中

SelectObject()

3.绘图
4.将画刷从DC中取出

SelectObject()

5.删除画刷

DeleteObject()
void ON_DRAW(HWND hwnd)
{
    PAINTSTRUCT ps = { 0 };//绘图句柄
    HDC hdc = BeginPaint(hwnd, &ps);//DC句柄
    HPEN Rpen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));//创建红色实心画笔
    HGDIOBJ Oldpen = SelectObject(hdc, Rpen);//交换画笔
    
    HBRUSH hBrush = CreateSolidBrush(RGB(0, 255, 0));
    HGDIOBJ oldBrush = SelectObject(hdc, hBrush);
   
    DrawEll(hdc);//画圆
    SelectObject(hdc, Oldpen);//再次交换画笔
    DeleteObject(Rpen);//销毁新建画红色笔
    SelectObject(hdc, oldBrush);
    DeleteObject(hBrush);
    EndPaint(hwnd, &ps);//结束绘制
}

在这里插入图片描述
可以使用GetStockObject函数获取系统维护的画刷、画笔等。如果不使用画刷填充,需要使用NULL_BRUSH参数,获取透明画刷,GetStockObject返回的画刷不需要DeleteObject

3.位图

1.位图的绘制
HBITMAP - 位图句柄
添加位图资源
从资源中加载位图LoadBitmap
创建一个与当期DC相匹配的DC(内存DC)

HDC CreateCompatibleDC(
HDC hdc//当前DC句柄,可以为NULL
)

将位图放入匹配的DC中SelectObject
成像

BOOL BitBlt(
HDC hdcDest,//目的DC
int nXDest,//目的左上X坐标
int nYDest,//目的左上Y坐标
int nWidth,//目的宽度
int nHeight,//目的高度
HDC hdcSrc,//源DC
int nXSrc,//源左上X坐标
int nYSrc,//源左上Y坐标
DWORD dwRop//成像方法
)

取出位图
释放位图
释放匹配的DC
在这里插入图片描述在这里插入图片描述

void DrawBMP(HDC hdc)
{
    HBITMAP hbmp = LoadBitmap(G_HINS, (LPCWSTR)IDB_BITMAP1);//加载位图
    HDC hMendc = CreateCompatibleDC(hdc);//创建一个内存DC,并构建一个虚拟区域,并且内存DC在虚拟区域中绘图
    HGDIOBJ Old = SelectObject(hMendc, hbmp);//将位图送给内存DC,内存DC在虚拟区域中将位图绘制出来
    BitBlt(hdc, 0, 0, 67, 62, hMendc, 0, 0, SRCCOPY);//虚拟取和窗口重合
    SelectObject(hMendc, Old);
    DeleteObject(hbmp);
    DeleteDC(hMendc);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值