非ownerdraw按钮中的粗体和下划线文本

介绍 最近,我的新客户想为我正在为他构建的新客户应用程序定制一个按钮。哦,哦,我想;按钮很困难,因为您必须处理许多状态和模式。更糟糕的是,ownerdraw按钮需要经过特殊处理才能显示在主题XP正下方。我的客户想要的按钮类似于当你选择搜索…从资源管理器右键菜单: 复选框的文本在被选中时以粗体显示。 鼠标滑过其中一个按钮会产生另一种效果: 当鼠标光标移到复选框上时,其文本下划线。 搜索面板上显示的单选按钮也会产生相同的两种效果。 现在我唯一的问题是,“微软是如何实现这些的?”有可能这些按钮不是真正的主人吗?为了进一步调查,我求助于我最喜欢的编程工具HPS HwndSpy。让我欣慰的是,HPS HwndSpy显示纽扣不是主人画的: 实现细节 现在我确信我可以实现这个按钮而不需要使它们ownerdraw,我决定API可以非常简单;唯一的选项是显示状态:粗体、下划线或粗体和下划线。x强调isbutton有两个公共api 隐藏,复制Code

Emphasis GetEmphasis()   { return m_eEmphasis; }

void SetEmphasis(Emphasis eEmphasis)
{
    m_eEmphasis = eEmphasis;
    SetEmphasisFont();
}

参数的选择由enum给出: 隐藏,复制Code

enum Emphasis
{
    NONE = 0,
    BOLD,         // button text will be bold if GetCheck() is TRUE
    UNDERLINE,    // button text will be underlined if mouse over
    BOLD_AND_UNDERLINE
};

由于强调状态仅限于四种情况,所以编程相当简单。在PreSubclassWindow()中,我创建了四种字体,在DefWindowProc()中,我处理了三条消息: BM_SETCHECK -当单选按钮或复选框的检查状态发生变化时发送此消息: 隐藏,收缩,复制代码if (message == BM_SETCHECK) { if (wParam == BST_CHECKED) { if (m_eEmphasis == BOLD || m_eEmphasis == BOLD_AND_UNDERLINE) { 按钮应加粗 如果(! m_bBold) { 如果(m_bUnderline) SetFont(及m_fontBoldAndUnderline); 其他的 SetFont(及m_fontBold); m_bBold = TRUE; } } } if (wParam == BST_UNCHECKED) { if (m_eEmphasis == BOLD || m_eEmphasis == BOLD_AND_UNDERLINE) { //按钮不应加粗 如果(m_bBold) { 如果(m_bUnderline) SetFont(及m_fontUnderline); 其他的 SetFont(及m_fontNormal); m_bBold = FALSE; } } } } 当光标移到按钮上时发送此消息。我使用它来检测当光标刚刚进入按钮的客户区,启用下划线: 隐藏,复制代码else if (message == WM_MOUSEMOVE) { 如果(!m_bOverControl) //光标刚刚移动到控件上 { m_bOverControl = TRUE; if (m_eEmphasis ==下划线|| m_eEmphasis = = BOLD_AND_UNDERLINE) { 按钮应该加下划线 如果(! m_bUnderline) { 如果(m_bBold) SetFont(及m_fontBoldAndUnderline); 其他的 SetFont(及m_fontUnderline); m_bUnderline = TRUE; } 凝固时间(100,零);//使用定时器检测何时 / /鼠标离开 } } } 定时器是用来检测当鼠标离开客户区的按钮: 隐藏,收缩,复制代码else if (message == WM_TIMER) { 如果(m_bOverControl) //只做这个如果之前在按钮 { 绘图用的矩形类矩形; GetWindowRect(和矩形); CPoint点; GetCursorPos(和点);//总是屏幕坐标 如果(! rect.PtInRect(点)) { //不超过按钮,因此删除下划线 如果(m_bUnderline) { 如果(m_bBold) SetFont(及m_fontBold); 其他的 SetFont(及m_fontNormal); m_bUnderline = FALSE; } m_bOverControl = FALSE; 消磨时间的(按钮); } } } 演示应用程序 演示应用程序允许你尝试各种显示属性的组合: 如何使用 要将cx强调isbutton类集成到您的应用程序中,您首先需要在您的项目中添加以下文件: XEmphasisButton.cpp XEmphasisButton.h 接下来,在适当的项目文件中包含头文件x强调isbutton .h(通常,这将是在对话框类的头文件中)。然后将按钮控件的声明替换为: 隐藏,复制Code

CXEmphasisButton   m_MyButton;

(使用已经存在的变量名)。 现在您可以开始使用cx强调isbutton了。在对话框的OnInitDialog()函数中,插入一行 隐藏,复制Code

m_MyButton.SetEmphasis(CXEmphasisButton::BOLD_AND_UNDERLINE);

(使用任何你想要的显示属性)。 修订历史 版本1.0 - 2006年8月15日 首次公开再保险租赁 使用 这个软件被发布到公共领域。您可以自由地以您喜欢的任何方式使用它,除非您不能出售此源代码。如果您修改或扩展了它,请考虑在这里发布新的代码供大家分享。本软件是“按原样”提供的,没有明示或隐含的保证。我不承担任何损害或损失的业务,该软件可能造成的。 本文转载于:http://www.diyabc.com/frontweb/news962.html

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