当前位置:C++技术网 > 精选软件 > 用美女和圣诞红苹果图片创建位图画刷来绘制漂亮的窗口背景

用美女和圣诞红苹果图片创建位图画刷来绘制漂亮的窗口背景

更新时间:2015-12-25 15:03:12浏览次数:1+次

    在文章《win32自定义丰富多彩的画刷实现(组图)》中,我们自己实现了各种各样的自定义画刷。实际上就是类似于位图的二维数组而已。当然,那只是用于提供一种自定义画刷的思路,然而只是实验性的。而在实际开发中,则不会这么苦逼去自己一个个设置二维数组的每一个位,来创造一个漂亮的图案。当时我为了画出红心图案,可是损耗了半只火眼金睛呀。
    那么本文就用实际开发中使用的方法来讲述和使用一下图片画刷。我们选用了一个美女头像(希望不构成肖像侵权哈,如果侵权,很高兴美女前来通告,哈哈哈)和一个圣诞红苹果图片来当成图片画刷,以示庆祝圣诞节吧。
    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;
}