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);
}