那么本文就用实际开发中使用的方法来讲述和使用一下图片画刷。我们选用了一个美女头像(希望不构成肖像侵权哈,如果侵权,很高兴美女前来通告,哈哈哈)和一个圣诞红苹果图片来当成图片画刷,以示庆祝圣诞节吧。
win32的GDI绘图中,有一种画刷就是图片画刷了。这种画刷允许你用自己的图片来创建一个图形画刷,从而就可以用这个画刷来填充一个区域。图形画刷比起系统提供的几种画刷自然漂亮多了,而且可以选择各种各样的图案哦。此处要的就是创造力咯,需要美感哈。
那么我们要使用图像画刷,最先需要准备的就是一张位图,使用bmp格式图片。如果是jpg图片,请先用画板打开,然后另存为选择24位bmp图片格式保存。因为是作为画刷,所以,将图片裁小哦。不要问我为什么直接用jpg图片等,这里不就是为了方便嘛,把焦点放在图像画刷上,而不是其他地方。
准备好图片后,然后导入项目。在VS的资源视图中,添加资源,然后选择导入,然后选择你的bmp图片,导入后就有了一个Bitmap分类,这分类下有一个默认命名为IDB_BITMAP1的一个位图资源了。这样就表示资源准备完毕。如果你还想导入其他图片,也按照这个步骤即可。
导入图片资源之后,我们就开始写代码了。我们在WM_PAINT中画画就好了。首先我们要将图片资源加载到内存,所以要用LoadBitmap函数,LoadBitmap的第一个参数是实例句柄,因为我们的图片资源是属于我们自己的程序内部的,所以要传入我们程序实例的句柄,也就是WinMain函数的第一个参数,在WinMain函数中,我们就用全局的实例句柄变量存储了这个实例句柄。这样在窗口过程函数中就可以直接使用。LoadBitmap的第一个参数就传入这个全局的实例句柄。第二个参数是一个图片资源的字符串ID,而我们导入进来后,默认使用了整型数字的ID,所以我们使用MAKEINTRESOURCE宏将数字ID转成了字符串类型的ID。LoadBitmap成功加载了位图资源,则返回位图资源的句柄。代码如下:
HBITMAP hBrush = LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
然后我们用CreatePatternBrush函数创建一个图形画刷,这个函数需要的唯一一个参数就是位图的句柄,我们已经准备好了。创建好图形画刷后,该函数就返回一个画刷句柄,我们使用SelectObject选入设备描述表,这样我们填充区域的时候就是用刚才创建的图形画刷了。代码如下:SelectObject(hdc,CreatePatternBrush(hBrush));
为了让图形充满整个客户区,所以用GetClientRect获取客户区大小,然后调用Rectangle函数画矩形。画完之后,记得删除自己创建的画刷,这是一个好习惯。这个程序当然无关紧要,好的习惯总会在关键时刻发挥重要的作用哦。下面就是用美女图片创建的画刷:
【使用美女图片创建的画刷绘制的客户区】
下面就是用圣诞红苹果图片创建的画刷:
【使用美女图片创建的画刷绘制的客户区】
程序员的快乐,总是在代码中得到体现,这不就是一个用代码庆祝圣诞节的嘛!挺好。下面是完整的源代码:
#include "windows.h"
#include "resource.h"
#include <tchar.h>
// - 项目是Unicode字符集
HINSTANCE g_hInstance=NULL;
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR Info[100]=_T("【C++技术网http://www.cjjjs.com】背景透明模式");
switch (message)
{
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
HBITMAP hBrush = LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));//加载位图
SelectObject(hdc,CreatePatternBrush(hBrush));//创建并选择画刷
RECT rect;
GetClientRect(hwnd,&rect);//获得客户区大小
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);//绘制矩形,并用位图画刷填充矩形
DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH)));//删除画刷
EndPaint(hwnd,&ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(LTGRAY_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndClass)) return 0;
g_hInstance = hInstance;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,440,440,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}