轻松实现非客户区按钮
来源:互联网 发布:javascript navigator 编辑:程序博客网 时间:2024/06/07 16:30
http://www.vckbase.com/document/viewdoc/?id=1824
一、简介
有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应,如下图所示:
为此我封装了两个类CNCButton和CNCButtonManager,CNCButton主要用于按钮绘制,CNCButtonManager用于按钮的管理并对非客户区的消息进行处理。如下是几个主要的非客户区消息:
WM_NCHITTEST
WM_NCACTIVATE
WM_NCPAINT
二、使用
2.1 首先我们需要引用两个类的头文件
#include "NCButtonManager.h"#include "NCButton.h"
2.2 为按钮定义ID
#define ID_BUTTON1 100#define ID_BUTTON2 101#define ID_BUTTON3 102
2.3 添加按钮和管理类成员变量
// Implementationpublic:CNCButton m_NcButton1;CNCButton m_NcButton2;CNCButton m_NcButton3;CNCButtonManager m_NcButtonManager;
2.4 创建按钮
// 按钮的位置和尺寸POINT ptBtn1Offset = {120, 10};POINT ptBtn2Offset = {20, 32};POINT ptBtn3Offset = {190, 10};SIZE sizeBtn1 = {60, 14};SIZE sizeBtn2 = {16, 14};SIZE sizeBtn3 = {16, 14};// 创建按钮m_NcButton1.Create("", this->m_hWnd, ptBtn1Offset, sizeBtn1, ID_BUTTON1);m_NcButton2.Create("", this->m_hWnd, ptBtn2Offset, sizeBtn2, ID_BUTTON2);m_NcButton3.Create("", this->m_hWnd, ptBtn3Offset, sizeBtn3, ID_BUTTON3);// 设置文字、提示、按钮位图m_NcButton1.SetText("VC知识库", "宋体", 12);m_NcButton1.SetTooltip("VC知识库欢迎您!");m_NcButton2.SetButtonBitmap(IDB_PEN1, BTNBMP_NORMAL); // 正常位图m_NcButton2.SetButtonBitmap(IDB_PEN2, BTNBMP_MOUSEOVER); // 鼠标移到上面时的位图m_NcButton2.SetTooltip("pen");m_NcButton3.SetButtonBitmap(IDB_PEN1, BTNBMP_NORMAL);m_NcButton3.SetButtonBitmap(IDB_PEN2, BTNBMP_MOUSEOVER);m_NcButton3.SetTooltip("pen");// 添加到管理类m_NcButtonManager.AddButton(&m_NcButton1);m_NcButtonManager.AddButton(&m_NcButton2);m_NcButtonManager.AddButton(&m_NcButton3);
2.5 消息的处理
2.5.1 将消息转发给管理类
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) {LRESULT lResult = CFrameWnd::DefWindowProc(message, wParam, lParam);if(!IsWindow(this->m_hWnd))return lResult;LRESULT lMyResult = m_NcButtonManager.DefWindowProc(this->m_hWnd, message, wParam, lParam);if(lMyResult != 0)return lMyResult;elsereturn lResult;}
2.5.2 添加消息处理函数
// Operationspublic:void OnNcButton1Clicked();void CMainFrame::OnNcButton1Clicked(){AfxMessageBox("VC知识库欢迎您! www.vckbase.com");}
2.5.3 消息映射
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_BN_CLICKED(ID_BUTTON1, OnNcButton1Clicked)ON_BN_CLICKED(ID_BUTTON2, OnNcButton2Clicked)ON_BN_CLICKED(ID_BUTTON3, OnNcButton3Clicked)ON_WM_CREATE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()
总结:本文提供的两个类可以方便地往非客户区(如:标题栏)添加按钮,欢迎批评指正!
- 轻松实现非客户区按钮
- VC 轻松实现非客户区按钮
- NCpaint, 非客户区实现阴影
- 客户区 非客户区
- 客户区&非客户区
- VC 实现 自绘 窗体 标题栏 非客户区
- VC 实现 自绘 窗体 标题栏 非客户区
- VC 实现自绘 窗体 标题栏 非客户区
- VC 实现 自绘 窗体 标题栏 非客户区
- VC 实现 自绘 窗体 标题栏 非客户区
- 什么是客户区/非客户区
- 什么是客户区/非客户区?
- MFC-客户区与非客户区
- 在窗体的非客户区(如标题栏)中添加菜单栏或按钮
- 非客户区自绘
- 非客户区的绘制
- GetWindowDC 非客户区绘图
- 禁用非客户区点击
- 配置管道、窗口和通道
- 十条不错的编程观点(酷壳 - CoolShell.cn)
- 维基百科创始人威尔士放弃管理员权限
- 配置观察者与策略、通道、环境、场景与观察点
- 把所有表的查询权限授权给一个用户
- 轻松实现非客户区按钮
- 配置场景
- APIPA是什么?
- 建立特效
- C#中对 XML节点进行增、删、改、查
- 配置特效
- 配置运动模式与策略
- 配置碰撞检测目标与参考位置
- 配置VP应用