65.9K
CodeProject 正在变化。 阅读更多。
Home

CDialogSK - 一个可皮肤化的对话框类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (35投票s)

2003年7月8日

3分钟阅读

viewsIcon

228608

downloadIcon

8823

本文讨论了 CDialogSK 类,该类扩展了 CDialog MFC 类,可用于创建可换肤的对话框。

引言

这个类派生自 MFC 的 CDialog。它支持以下功能:-

  1. 如果在 Windows 2000 或 Windows XP 上运行,使任何一种颜色透明,以便您可以透过对话框的某些区域
  2. 如果在 Windows 2000 或 Windows XP 上运行,使整个对话框半透明
  3. 向背景添加一个位图。位图可以是资源、BMP 文件或 HBITMAP
  4. 设置背景样式:平铺、居中、拉伸,将对话框调整为位图的大小
  5. 可以启用/禁用通过在对话框内的任何位置单击来移动对话框

在 Windows 2000 之前,创建换肤对话框有点困难。您需要编写可以解析背景图像并创建定义皮肤形状的 CRgn 的函数。这可以通过使用对图像中您希望在对话框上看到的区域的 CRgn::CombineRgn 的重复调用来完成。在创建整个区域后,您需要使用组合的 CRgn 对象的句柄调用 CWnd::SetWindowRgn

从 Windows 2000 开始,一个新的 API SetLayeredWindowAttributes 被添加到 User32.dll 中。这个类使用它来创建换肤对话框。然而,背景位图功能不依赖于操作系统版本,可以在任何版本的 Windows 上使用。

使用代码

可以使用以下步骤使用该类

  1. 将文件 CDialogSK.hCDialogSK.cpp 添加到您的项目中。

  2. 在您的对话框类的 .h 文件中包含 CDialogSK.h

  3. 在您的对话框类的 .h 和 .cpp 文件中将所有 "CDialog" 替换为 "CDialogSK"

  4. 如果您计划使用背景图像(位图),请转到对话框属性、样式选项卡,并将样式设置为“弹出”,边框设置为“无”,并取消选中“标题栏”复选框。

  5. 在您的对话框类的 OnInitDialog 结束时,添加对 CDialogSK 中的相应方法的调用

    BOOL CSkinDialog_DemoDlg::OnInitDialog()
    {
        ...
        EnableEasyMove();  // enable moving of the dialog 
                           // by clicking anywhere in the dialog
        SetBitmap (IDB_BACKGROUND); // set background bitmap
        SetStyle (LO_RESIZE); // resize dialog to the size of the bitmap
        SetTransparentColor(RGB(0, 255, 0)); // set green as the 
                                             // transparent color
    
        return TRUE;
    }
    
  6. 如果您想稍后更改窗口样式,您可以在代码中的任何地方在运行时调用这些方法中的任何一个。
  7. 例如,如果您想创建一个圆形对话框。创建一个图像,该图像具有一个绿色背景上的蓝色圆圈。然后使用图像的路径调用 SetBitmap 并调用 SetTransparentColor,传入背景色(绿色)。这将从视图中删除背景,您将获得一个圆形窗口。

方法

CDialogSK 类中存在以下方法

  1. DWORD SetBitmap (HBITMAP hBitmap); 基于 HBITMAP 设置背景位图。
  2. DWORD SetBitmap (int nBitmap); 基于资源 ID 设置背景位图。
  3. DWORD SetBitmap (LPCTSTR lpszFileName); 基于 Windows 位图 (.bmp) 文件设置背景位图。
  4. void SetStyle (LayOutStyle style); 设置位图布局样式。可以是 LO_DEFAULTLO_TILE(平铺图像)、LO_CENTER(居中图像)、LO_STRETCH(拉伸图像以适应对话框)、LO_RESIZE(调整对话框大小以适应图像)中的任何一个。
  5. void EnableEasyMove (BOOL pEnable = TRUE); 如果使用 TRUE 调用,则可以通过单击对话框的客户区中的任何位置来移动对话框。
  6. BOOL SetTransparent (BYTE bAlpha); 将整个对话框设为透明。范围是 0(透明)- 255(不透明)。这仅适用于 Windows2000 及以上版本 (WinXP)。
  7. BOOL SetTransparentColor (COLORREF col, BOOL bTrans = TRUE); 使特定颜色透明。这仅适用于 Windows2000 及以上版本 (WinXP)。这可以用来创建对话框,在该对话框中您可以看到对话框的某些部分。

历史

  • 这是初始版本。发布日期:2003 年 7 月 1 日
© . All rights reserved.