给对话框加上背景皮肤

本文介绍了一种在Windows对话框上添加皮肤的简单方法,通过使用DIBToRgn函数将位图转换为区域,实现对话框背景跟随皮肤图片自动调整大小。该方法涉及创建DIBSection、处理颜色差异、创建区域以及处理WM_ERASEBKGND消息等步骤。
摘要由CSDN通过智能技术生成

对话框的skin

前段时间有些学生问我,怎么给我们做的对话框加上漂亮的skin,特别是就像qq游戏的登录以及游戏界面一样(qq游戏的登录界面就是一个对话框)。

经过一些曲折,我在www.codeproject.com中找到了一些给对话框及控件加skin的方式,在下面我通过一个例子给出了其中一种最简单的方法,通过这种方式作出的对话框会根据skin图片的大小调整。

在我的例子中,我用了首先做了一个简单的基于对话框的程序。然后给我们的工程插入一个图片资源。给这个bitmap资源一个资源IDIDB_MAIN。为对话框类加入以下的数据成员和成员函数。

 

CSkinDlg : public CDialog

{

public:

        CSkinDlg();

    HBITMAP m_hBmp;

    HRGN m_hWndRgn;

    HRGN DIBToRgn(HBITMAP hBmp,COLORREF BkColor,BOOL Direct); // Handle the Skin

//…

};

 

在构造函数中加入以下代码:

CSkinDlg::CSkintDlg(CWnd* pParent /*=NULL*/)

    : CDialog(CSkinDlg::IDD, pParent)

{

    //{ {AFX_DATA_INIT(CSkinDlg)

    //}}AFX_DATA_INIT

    m_hBmp=(HBITMAP)LoadImage(AfxGetApp()->m_hInstance,

                                   MAKEINTRESOURCE(IDB_MAIN),

                                   IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);

 

    m_hWndRgn=DIBToRgn(m_hBmp,0x00ff00,FALSE);

}

 

在你的对话框类中插入函数HRGN DIBToRgn(HBITMAP hBmp, COLORREF BkColor, BOOL Direct)并加入以下的代码:

HRGN CSkinDlg ::DIBToRgn(HBITMAP hBmp, COLORREF BkColor, BOOL Direct)

{

    // use to return the handle of the HGRN

      HRGN hRgn = NULL;                   

    #define MAX_ALLOC_RECTS  100

    //the difference of the color

    COLORREF  Tolerance=0x00101010;

    if (hBmp)

    {

        //creat the dib to save the dc

        HDC hMemDC = CreateCompatibleDC(NULL);       

        if (hMemDC)

        {

            BITMAP bm;

            //get the info of the bitmap

            GetObject(hBmp, sizeof(bm), &bm);   

 

            BITMAPINFOHEADER BmpInfoh = {      // the struct of the bitmap

                    sizeof(BITMAPINFOHEADER), // biSize

                    bm.bmWidth,               // biWidth;

                    bm.bmHeight,              // biHeight;

                    1,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值