zoukankan      html  css  js  c++  java
  • 本机Win32主题感知所有者绘制控件没有MFC

    内容 摘要 讨论 的 对话框模板 什么 一个国家! 热 跟踪 得到 的消息 双 点击 主题 画 这个按钮 一个变化 的主题 重用 示例代码 学分 摘要 随着XP的出现,微软已经试图确保许多 呈现用户界面的责任现在由操作人员承担 系统而不是程序员。大多数情况下还好,但仍有一些 当你想自己画控制的时候。其中的一个 最常见的情况是一个按钮上有一个图像,在本文中我们 讨论使用本机Win32 API实现这样的控件。虽然 讨论特别关注所有者绘制按钮,即这里所涵盖的主题 将适用于所有所有者抽签控件。在本文中,我们将讨论如何 实现一个简单的本地Win32应用程序,其中包含一个主题感知 业主绘制按钮,将运行在主题化和非主题化的Microsoft Windows 32位操作系统。 讨论 对话框模板 打开示例项目(OwnerDraw.dsp)看一看 IDD_MAIN_DLG。您将看到UI包含一个对话框 两个按钮,一个是业主绘制控制按钮和一个正常的按钮(为 引用)。将资源脚本(OwnerDraw.rc)打开为text并查看 我们的所有者绘制按钮是一个正常的系统按钮,但与 BS_OWNERDRAW按钮样式标志设置。 隐藏,复制Code

    //////////////////////////////////////////////////////////////////////////
    //
    // Dialog
    //
    
    IDD_MAIN_DLG DIALOG DISCARDABLE  0, 0, 307, 122
    STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | 
        WS_SYSMENU
    CAPTION "Owner Draw Sample"
    FONT 8, "MS Sans Serif"
    BEGIN
        CONTROL         "Owner Draw",IDC_OWNERDRAW_BTN,"Button",BS_OWNERDRAW | 
                        WS_TABSTOP,80,20,105,35
        PUSHBUTTON      "Normal",IDC_NORMAL_BTN,80,60,105,35
        PUSHBUTTON      "OK",IDOK,250,5,50,14
        PUSHBUTTON      "Cancel",IDCANCEL,250,22,50,14
    END

    通过设置这个标志,我们告诉Windows它是 按钮的所有者(对话框)来绘制按钮。你会发现 实现maindll .cpp中的对话框。 什么状态! 控件在屏幕上的样子是其状态的反映。一个 例如,按钮可以被按下或聚焦。预定义的状态 Windows可以告诉我们是:- 要检查的菜单项是ODS_CHECKED。使用这个位 只有在菜单中。 ODS_COMBOBOXEDIT绘图发生在选择中 所有者绘制的组合框的字段(编辑控件)。 ODS_DEFAULT项是默认项。 该项将被绘制为禁用。 项目有键盘焦点。 项目将变为灰色。这个位只用于 一个菜单。 ODS_HOTLIGHT Windows 98/Me, Windows 2000/XP:项目是 正在进行热跟踪,也就是说,当鼠标打开时,该项目将高亮显示 的项目。 ODS_INACTIVE Windows 98/Me, Windows 2000/XP:项目为 不活动,并且与该菜单关联的窗口不活动。 控件的绘制不带 键盘加速器线索。 ODS_NOFOCUSRECT Windows 2000/XP:控件绘制没有 重点指标暗示。 ODS_SELECTED菜单项的状态被选中。 但显然不是所有这些都适用于我们的按钮。尽管Windows将 如果上面列出的任何相关状态发生变化,请通知我们,在我们的示例中 只有在以下情况下重画按钮:- 它获得了焦点 它会失去焦点 这是按 它被释放 (特别是XP)如果它是“热”。 热跟踪 XP用户可能已经注意到系统按钮被高亮显示(或被跟踪) 当鼠标在按钮上时。然而,我们没有收到任何特别的 系统按钮被热跟踪时来自Windows的通知。为此,我们 需要确定鼠标是否移动到按钮上。在我们的示例中,我们 使用了旧的16位技术的子类化-基本上我们已经取代 该窗口程序的所有者绘制按钮与我们自己的程序,使我们 可以监听WM_MOUSEMOVE消息。当鼠标移过来的时候 这个按钮过程将接收WM_MOUSEMOVE消息 然后我们可以重新绘制突出显示的按钮。 得到的消息 它是来自操作系统的WM_DRAWITEM通知 这将提示我们重新绘制按钮。参见提供的 通知是关于按钮当前状态的信息 窗户再加上从我们的子类中收集到的额外状态信息 现在手头有足够的信息来呈现按钮。 双点击 当owner-draw按钮被双击时,它会发送a BN_DBLCLK通知,而不是像它一样响应 被压了两次,又被释放了两次。为了改变这种行为 我们可以让我们的所有者绘制按钮张贴WM_LBUTTONDOWN 当它接收到WM_LBUTTONDBLCLK时,返回给自己的通知 消息。 主题 到目前为止,一切都很好。下一个问题是决定按钮应该是什么样子 喜欢的。第一步是确定操作系统是否支持主题。 函数InitThemes()试图加载UXTHEME.DLL 动态。不要尝试静态链接到UXTHEME库作为 应用程序将无法在不附带dll的系统上运行。我们加载 以下功能:- OpenThemeData, 隐藏,复制Code

    GetThemeBackgroundContentRect, DrawThemeBackground, DrawThemeText, 

    and CloseThemeData。 绘制的按钮 绘制按钮然后是一个四个阶段的过程:- 阶段1 -绘制背景(包括框架)。 阶段2 -绘制图标。 第三阶段——在课文上写字。 阶段4 -绘制焦点矩形。 改变主题 当用户更改了主题时,操作系统将发布 WM_THEMECHANGED消息。这是一个简单的问题 卸载然后重新加载主题库以确保按钮 正确地呈现。 重用示例代码 要向应用程序中添加对主题的基本支持,请复制第27至82行 从MainDlg.cpp(包容)。您必须包括标题 UXTHEME.H TMSCHEMA.H。记得也包括一个清单和 在应用程序首次启动时调用InitCommonControls。 prepareimag直立和DrawTheIcon函数是 用于将图标放在按钮上。WM_DRAWITEM处理程序 演示如何绘制主题化和非主题化的按钮 操作系统。 学分 函数prepareimag直立和DrawTheIcon() 由Davide Calabro从CButtonST类中获取。 本文转载于:http://www.diyabc.com/frontweb/news527.html

  • 相关阅读:
    Beta冲刺阶段
    用例图练习
    第四次作业--个人作业--必应词典案例分析
    第五次作业——团队项目——需求规格说明书
    结对编程第三次作业
    第二次作业— —结对项目
    Git使用心得
    Android平台的开发环境的发展演变
    软件工程的实践项目的自我目标
    面试中遇到的问题
  • 原文地址:https://www.cnblogs.com/Dincat/p/13451533.html
Copyright © 2011-2022 走看看