对话框的skin
前段时间有些学生问我,怎么给我们做的对话框加上漂亮的skin,特别是就像qq游戏的登录以及游戏界面一样(qq游戏的登录界面就是一个对话框)。
经过一些曲折,我在www.codeproject.com中找到了一些给对话框及控件加skin的方式,在下面我通过一个例子给出了其中一种最简单的方法,通过这种方式作出的对话框会根据skin图片的大小调整。
在我的例子中,我用了首先做了一个简单的基于对话框的程序。然后给我们的工程插入一个图片资源。给这个bitmap资源一个资源ID号IDB_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,