当前位置 博文首页 > 文章内容

    一个带有可选自定义框架的透明对话框类

    作者: 栏目:未分类 时间:2020-08-11 9:00:29

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    介绍 CodeProject上有几个透明的对话框;但是,它们都没有提供一个通用的对话框来允许您在透明区域上绘制。这样做的原因首先是因为Windows不能有效地支持透明的CWnd对象。 上图显示了StyleDialog与Style Toolkit[^] 1.1版本一起使用。但是,StyleDialog可以与工具箱一起使用,也可以不与工具箱一起使用,也可以与透明一起使用。 创建透明对话框的问题 StyleDialog的关键功能是使用透明区域。这意味着,您可以在它上面画画,在它上面作画,并向它添加控件。 下面是一些典型的方法,以及与之相关的缺点: 在OnCtlColor中返回一个HOLLOW_BRUSH——这对于控件来说是可行的,因为应用程序控制了背景。它也适用于对话框,只要你不移动它,这使得它相对无用。它还会导致儿童控制停止接收他们的OnCtlColor信息。使用一个区域——这个解决方案相当有效;但是,您不能使用透明区域。此外,因为你不能反锯齿的边界,边缘看起来有点粗糙。分层窗口——这是创建一个真正透明窗口的唯一方法。这可以很好地创建一个淡入效果,但是由于透明度应用于整个CWnd,你不能有一些透明的和其他不透明的东西。分层cwnd——这些解决方案看起来和表现最好,但它们不是通用的,而且您也不能在透明区域上绘制。 StyleDialog设计注意事项 其他难以克服的问题是拖动窗口时的抖动,以及在应用程序不是活动的时候保持正确的背景。 为了克服这些问题,StyleDialog强加了以下设计规则: 在非活动应用程序时显示备用背景。这克服了应用程序可见但不活动时后台改变的问题。拖动应用程序时显示备用背景。实际上,StyleDialog可以在拖动时显示正确的背景,但分层窗口会出现不希望出现的抖动。 StyleDialog通过使用不透明的分层窗口来实现透明度,并利用了它在屏幕外位图中维护的优势。 使用StyleDialog 步骤1 -在StyleDialog.h中配置用法 隐藏,复制Code

    // comment out this line if Style Toolkit is not used
    #define USE_STYLE_TOOLKIT
    
    // comment out this line if transparency is not supported 
    #define USE_LAYERED_WINDOWS

    步骤2 -从StyleDialog派生一个对话框 像往常一样使用向导创建一个基于对话框的应用程序。用StyleDialog替换CDialog的所有实例。注意:在替换时跳过CAboutDlg,除非您希望它也是一个StyleDialog。 对于子对话框,只需将它们声明为StyleDialog。有关示例,请参阅演示程序。 步骤3 -配置StyleDialog 在调用OnInitDialog或DoModal之前执行以下操作。 隐藏,复制Code

    // configure StyleDialog before calling the init function
    SetTransparent(TRUE);
    SetControls(ALL_CONTROLS);
    SetTitle(_T("Style Dialog Demo"));

    SetTransparent使透明度。它默认是禁用的,因为它只会浪费带宽,如果它不被使用。SetControls告诉StyleDialog在有自定义框架时使用哪些控件。下面将对此进行更详细的描述。默认是没有控件。SetTitle是使用自定义框架时在任务栏中显示的标题。默认值是一个空字符串。 步骤4 -为对话框添加样式[可选] 用AddBackGroundStyle(style)加载一个样式到对话框中。 StyleDialog的最小实现 下面的图像和代码来自演示程序的对话框3按钮。 隐藏,复制Code

    StyleDialog dlg(IDD_DIALOG3);
    dlg.SetTransparent(TRUE);
    dlg.SetTitle(_T("Standard Frame"));
    dlg.DoModal();

    本例使用了标准框架,但没有使用Style工具包。实际上没有必要设置标题,但如果不设置标题,它就会说“Dialog”。 控制交替背景 如果透明度是启用的,StyleDialog将显示一个备用背景时,它不是活动的应用程序或当窗口被移动。备用背景将在可能已经绘制在透明区域上的任何东西的下面。 默认情况下,备用背景将是桌面背景色的实线填充。这可以覆盖与下列之一: 将实线填充改为另一种颜色。addopaquestyle(样式)-将填充改为样式。 Dialog 2按钮演示了背景样式的使用。 这个例子使用了一个没有控件的自定义框架,以及带有半透明PNG图像的背景样式。 这显示了非活动状态。它为不透明样式使用同一图像的完全不透明版本。 创建自定义框架 StyleDialog在创建自定义框架时需要知道客户端矩形的大小。这是对标题栏区域进行命中测试和支持覆盖函数GetClientRect()所需要的。 StyleDialog维护一个可以用GetFrameRect检索的外部框架和一个可以用GetClientRect检索的客户端框架。注意,Windows does不认为这是客户端矩形。有些情况下,当绘画或擦除,你应该使用GetFrameRect或CDialog::GetClientRect来获得窗口定义的客户端矩形。 方法1 -使用SetClientRect 调用GetFrameRect()来获得外部框架的矩形,调整它的边框和标题栏大小,然后调用SetClientRect()。 方法2 -使用资源编辑器 使用资源编辑器并创建带有静态控件的客户端矩形。这样做的好处是可以在设计对话框时调整标题和边框大小。使用静态图片控件,因为它没有任何偏移。 将控件的ID设置为SytleDialog的关键字ID之一—IDC_SC_CLIENT。当StyleDialog在resource.h文件中检测到这个ID时,它将自动创建客户端矩形。 控件还有关键字id,如下图所示。 如果StyleDialog看到任何控件id,它将为它们创建StyleButtons,并将它们与相关的图像一起加载。它还将为每个按钮创建预期的功能。 其他的考虑 StyleDialog不支持最大化;事实上,它使它失去功能。原则上,这是可以支持的,但是我不打算在将来添加这个特性。 我并没有真正计划支持一个透明的对话框和透明的子对话框;然而,它似乎工作正常,演示程序实际上做到了这一点。 为了在打开子对话框时不产生烧穿效果,父对话框的透明度可以被禁用,然后重新启用。但是,在打开和关闭分层窗口时可能会出现时间问题,所以要谨慎使用此特性。 问题 使用自定义框架时最小化和恢复-如果你点击任务栏图标,StyleDialog将进入适当的活动或非活动状态,但它不会最小化和恢复。我认为这与系统菜单没有这个功能有关,我希望在未来的版本中修复这个问题。VC6用户- StyleDialog将工作,如果你注释了分层窗口的功能。分层窗口将工作在Win2K SP3和更新,但您需要获得winuser的新版本。h, user32。自由,user32.dll。 修订历史 版本1.0 - 2008年8月3日首次发布。 本文转载于:http://www.diyabc.com/frontweb/news12070.html