一.绘制线条&使用画刷
绘制线条和使用画刷等都是先获得窗口设备环境句柄,然后选取一个绘图的工具,使用绘图工具在设备环境中绘图
下面有线条和画刷的使用方法:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
COLORREF color = RGB(0, 255, 0);
HPEN hpen = CreatePen(PS_SOLID, 20, color);
HBRUSH hbrush = CreateSolidBrush(color);
PAINTSTRUCT ps;
switch (message)
{
<p> case WM_PAINT:</p> //采用BeginPaint方法获取设备环境句柄
hdc = BeginPaint(hWnd, &ps);
//选取绘图使用的工具
SelectObject(hdc, hpen);
//移动焦点
MoveToEx(hdc, 0, 0, NULL);
//画线
LineTo(hdc, 1000, 1000);
//选择画刷作为绘图工具
SelectObject(hdc, hbrush);
//绘制方形函数
Rectangle(hdc, 150, 200, 200, 250);
//绘图结束释放设备环境
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
CleanUp();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
运行程序,结果如下:
二.绘制位图
位图,即bitmap类型的图像,在windows平台下结尾为.bmp。GDI支持最好的就是位图。据说GDI+支持png等格式的图像,但是GDI+是对GDI的封装,效率不怎么样。所以在这里还是使用GDI绘制位图。
绘制位图有4个步骤:
1)加载位图
HANDLE LoadImage(
HINSTANCE hinst,//如果是从硬盘加载可以置为NULL
LPCTSTR lpszName,//图像的路径及文件名
UINT uType,//类型
int cxDesired,//宽度(如果为0则按照图像原大小加载)
int cyDesired,//高度(如果为0则按照图像原大小加载)
UINT fuLoad//加载方式
);
2)建立兼容DC
HDC CreateCompatibleDC(HDC hdc);
在内存中建立一个和屏幕DC兼容的内存环境
3)选取位图对象
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
前面使用画笔画刷时也使用过这个函数,其实就是选取一个用来绘图的工具,在这里就是选取位图作为画笔
4)绘图
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);//光栅操作标示符,详情可以查阅MSDN
代码如下:
void Init(HWND hwnd)//加载部分
{
g_hdc = GetDC(hwnd);//获得设备环境句柄
g_hbitmap = (HBITMAP)LoadImage(NULL, L"xie.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//加载位图,步骤(1)
g_mdc = CreateCompatibleDC(g_hdc);//建立兼容内存设备环境步骤(2)
ReleaseDC(hwnd, g_hdc);//释放设备
}
void Paint(HWND hwnd)//贴图部分
{
g_hdc = GetDC(hwnd);
SelectObject(g_bufdc, g_hbitmap);//选取位图作为绘图工具,步骤(3)
BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);//贴图操作,步骤(4)
ReleaseDC(hwnd, g_hdc);
}
运行结果如下: