酷,半透明和形状对话框与标准的控制Windows 2000及以上

介绍 首先,让我向你展示一些截图捕获的演示程序。 程序演示了半透明兼容Windows 2000和更高的对话框。 背景 分层的窗户,从windows NT 5.0支持,提供一种方法来创建windows有复杂的形状与α混合效果。主要的挑战是如何在分层显示标准控件窗口。 下面显示了机制: 当创建对话框,一个假窗是由CreateWindowEx风格WS_EX_LAYERED, WS_EX_TRANSPARENT, WS_EX_NOACTIVATE。真正的窗口的alpha值将被修改为5 SetLayeredWindowAttributes这样真实窗户几乎是透明的。 真正的窗口负责处理用户输入事件和Windows消息;假的一个负责演讲。假窗口总是保持同样的大小/真正的地位。 我们如何显示标准控制假窗吗?表示需要刷新时,背景图像画。然后,所有子控件将被发送WM_PRINT消息,和画在同一位置假窗。特别是对于编辑控件,EditBox /可编辑的组合框等,我们需要画出自己脱字符号。 我们应该刷新显示?我们需要刷新假窗户上有一个更新UI。在演示中,递归地它钩到所有子控件,和改变指向地址通过SetWindowLongPtr GWLP_WNDPROC参数。 你可以得到更多的细节查看源代码。 使用本机c++ / MFC的代码 第一步 复制所有文件/ Src / *。*您的项目。 第二步 你需要一个图像文件的对话框背景。你最好选择PNG或TIFF支持alpha通道。图像文件可以嵌入到一个资源或放在磁盘,评判自己。 最后一步 取代基类从CDialog CImgDialogBase所示的对话框。 隐藏,复制Code

// Load from disk file
CDemo2Dlg::CDemo2Dlg(CWnd* pParent /*=NULL*/)
    : CImgDialogBase( CDemo2Dlg::IDD
    , CUtility::GetModulePath() + _T("background.png")
    , pParent
    )
{

}

// Or load from resource
CDemo3Dlg::CDemo3Dlg(CWnd* pParent /*=NULL*/)
    : CImgDialogBase(CDemo3Dlg::IDD
    , IDB_PNG_DLG2
    , _T("PNG")
    , AfxGetResourceHandle()
    , pParent
    )
{

}

在WinForms / net中使用的代码 第一步 复制文件/ Src / *。*目录到您的项目。 第二步 你需要一个图像文件的对话框背景。你最好选择PNG或TIFF支持alpha通道。 最后一步 取代基类从形式到ImageDlgBase所示的对话框。 隐藏,复制Code

public partial class Form2 : CoolImageDlg.ImageDlgBase
{
    public Form2()
    {
        base.DlgBgImg = ImgDlgSample.Properties.Resources.DemoDlgBg2;
        //......
    }
}

一些重要的事情 对话框,如果有工作需要更新一个像素,整个窗口将被刷新。因此,如果对话框非常大而复杂的,或者有很多子控件,它可能会导致性能问题。 的一些控件无法使用WM_PRINT;在这种情况下,控制不会正确显示。换句话说,并不是所有的控件都支持。 示例代码使用GDI +从Zoltan Csizmadia助手类。对于那些不想使用GDIPlus。dll, CxImage是另一个选择。 Image 5 大多数的机器使用96 DPI的显示器设置。这些机器的使用一个不寻常的DPI设置,请注意演示并不意味着这样的设置和子控件将是错误的。您需要添加自己的代码重新布局的子控件,如果你需要支持不同寻常的dpi。 本文转载于:http://www.diyabc.com/frontweb/news11995.html

原文地址:https://www.cnblogs.com/Dincat/p/13473448.html