(用于标题栏的按钮)

Sample Image - CCaptionButton.gif

这里有更多的图片与不同的按钮状态:

DeActive Image - DeActive.gif

鼠标悬停状态:

Highlight Image - Highlight.gif

介绍

这个类将可变数量的位图插入到对话框的标题中,并像处理按钮一样处理它们(紧挨着关闭、最大化或最小化按钮)。这意味着无论只有1个按钮(关闭对话框)或3个按钮(关闭/最大化/最小化),都会计算大小和位置。也可以将按钮绘制到设置了工具窗口标志或可调整大小标志的对话框中。如果鼠标悬停在按钮上方,按钮将显示高亮状态,如果窗口处于非激活状态,按钮将被禁用。我构建这个类的原因是在不使用DrawFrameControl的情况下在对话框的标题中添加一个按钮,只是为了获得一些关于位图和非客户区的经验。

顺便说一句:我们总是欢迎建设性的批评!: -)

使用代码:

演示项目中的代码有很好的文档记录(至少在我看来是这样的;-))。看一看!

    将文件CaptionButton.h和CaptionButton.cpp添加到您的项目中,并包括标题。隐藏,复制代码# include“CaptionButton.h” 创建类CCaptionButton的成员变量。隐藏,Codei.e副本。一个指向CCaptionButton的指针 在对话框的OnInitDialog()处理程序中调用静态函数CCaptionButton::InitCapBtn。隐藏,复制CodeCCaptionButton: InitCapBtn (m_hWnd); m_hWnd是窗口的手柄,按钮应该放在那里。 当我们在对话框源文件的OnInitDialog()部分时,我们告诉类一些细节。 因此我们使用成员函数SetBmpID: 隐藏,SetBmpID(1, IDB_LAMPOFF, IDB_LAMPON, FALSE); UINT n(在本例中是1)是按钮的编号(例如:1是最右边的按钮,然后出现在按钮1左边的按钮2…) UINT IDB_LAMPOFF是未按下按钮的位图 UINT IDB_LAMPON是按钮按下状态下的位图。如果您喜欢对两个按钮状态(按下/按下)使用相同的位图,这一点可以保持清晰。 BOOL FALSE表示按钮的类型(是否为checkbutton)。重要的只是对气垫牵引。 只要第一个参数保持不变,就可以使用此函数更改代码中的位图。 现在,我们必须对消息WMU_HITCAPBUTTON做出反应: 我们希望在单击标题中的按钮时采取一些操作。每次单击按钮时,都会向窗口发送一条消息。这就是为什么我们必须为注册消息WMU_HITCAPBUTTON添加一个处理程序。按照这些简单的步骤来完成任务: 您可以在对话框类头文件的消息处理程序部分定义处理程序OnWMU_Hitcapbutton。添加声明: afx_msg LRESULT OnWMU_Hitcapbutton(WPARAM WPARAM, LPARAM);隐藏,复制CodeBEGIN_MESSAGE_MAP (CTitleBarButtonDlg CDialog) / / {{AFX_MSG (CTitleBarButtonDlg) 虚拟BOOL OnInitDialog (); afx_msg空白OnPaint (); afx_msg HCURSOR OnQueryDragIcon (); afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point); afx_msg空白OnNcPaint (); afx_msg空白OnDestroy (); afx_msg BOOL OnNcActivate(BOOL bActive); afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point); / /}} AFX_MSG afx_msg LRESULT OnWMU_Hitcapbutton(WPARAM WPARAM, LPARAM); DECLARE_MESSAGE_MAP () 在表格中创建一个条目来分派这些消息,因此你声明了注册的消息并在对话类的源文件的消息映射中添加了一个条目: 对于注册的消息:DECLARE_USER_MESSAGE(WMU_HITCAPBUTTON) 消息映射条目:ON_REGISTERED_MESSAGE(WMU_HITCAPBUTTON, OnWMU_Hitcapbutton)隐藏复制代码//公告注册信息: DECLARE_USER_MESSAGE (WMU_HITCAPBUTTON) BEGIN_MESSAGE_MAP (CTitleBarButtonDlg CDialog) / / {{AFX_MSG_MAP (CTitleBarButtonDlg) ON_WM_PAINT () ON_WM_QUERYDRAGICON () ON_WM_NCLBUTTONDOWN () ON_WM_NCPAINT () ON_WM_DESTROY () ON_WM_NCACTIVATE () ON_WM_NCMOUSEMOVE () / /}} AFX_MSG_MAP ON_REGISTERED_MESSAGE (WMU_HITCAPBUTTON OnWMU_Hitcapbutton) END_MESSAGE_MAP () 请注意,消息映射中的条目写在//}}AFX_MSG - MFC-Tags之外! 现在,当您的类接收到WMU_HITCAPBUTTON消息时,它将调用该消息的处理程序,它应该如下所示:复制代码/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *消息名称:WMU_HITCAPBUTTON *输入: * WPARAM: (UINT) WPARAM =按钮的Nomba * LPARAM: (BOOL) LPARAM =按钮状态(按下=真/释放=假) * *结果:LRESULT *逻辑无效,总是0 * *效果:表示按钮的#(如果有多个按钮) *和按钮状态(按下/释放) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / LRESULT CTitleBarButtonDlg:: OnWMU_Hitcapbutton(按钮按钮, LPARAM LPARAM) { //按钮1已被击中: 如果((单位)按钮= = 1) { //按钮1已经被点击,现在做点什么 } 返回0;//总是返回0(LRESULT->void) }

就是这样!现在你的按钮应该可以工作了。


额外的成员函数:

  • 一个启用/禁用按钮的函数(这个例程在我的NT4上实现但没有工作,即使它在我的XP-Home上工作):复制CodeBOOL CCaptionButton::EnableButton(BOOL bEnable)

已计划但尚未实施:

  • 显示/隐藏按钮的函数
  • 获取/设置按钮状态的函数
  • ……
  • 欢迎提出更多建议!

这些是在CCaptionButton类中处理的消息:

  • 这是按钮将被绘制到标题的地方。
  • WM_NCACTIVATE:对话框的active/inactive状态将在这里“更改”。
  • WM_NCLBUTTONDOWN:鼠标点击将在这里处理。
  • WM_NCMOUSEMOVE:当鼠标悬停在按钮上时,按钮会被告知。
  • WM_SETTEXT:必须处理此消息,否则标题将以我不喜欢的方式改变;-)

学分

  • 如果你想了解更多关于信息传递的知识,你应该读一读Joseph M. Newcomer写的一篇优秀的文章
  • 保罗迪Lascia。我在isWindowActive(…)中重用了他的代码。
  • 对于Win32实现,请查看这里。

更新:

  • 04.06.2004 TRACKMOUSEEVENT结构添加 TrackMouseEvent(TrackMouseEvent lpEventTrack) -添加函数 消息处理为WM_NCMOUSELEAVE增加 改变了颜色调整结构中的一些值
  • 11.06.2004 解决了nc区域鼠标右键消失按钮的问题 解决了对话框被a重新激活时按钮绘制延迟的问题 鼠标左键在nc区域

本文转载于:http://www.diyabc.com/frontweb/news14000.html

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