轻松实现非客户区按钮
http://tech.ddvip.com 2008年06月03日 社区交流
本文详细介绍轻松实现非客户区按钮
一、简介
有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应,如下图所示:

为此我封装了两个类CNCButton和CNCButtonManager,CNCButton主要用于按钮绘制,CNCButtonManager用于按钮的管理并对非客户区的消息进行处理。如下是几个主要的非客户区消息:
WM_NCHITTEST
WM_NCACTIVATE
WM_NCPAINT
二、使用
2.1 首先我们需要引用两个类的头文件
#include "NCButtonManager.h"2.2 为按钮定义ID
#include "NCButton.h"#define ID_BUTTON1 1002.3 添加按钮和管理类成员变量
#define ID_BUTTON2 101
#define ID_BUTTON3 102// Implementation2.4 创建按钮
public:
CNCButton m_NcButton1;
CNCButton m_NcButton2;
CNCButton m_NcButton3;
CNCButtonManager m_NcButtonManager;// 按钮的位置和尺寸2.5 消息的处理
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.1 将消息转发给管理类LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)2.5.2 添加消息处理函数
{
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;
else
return lResult;
}// Operations2.5.3 消息映射
public:
void OnNcButton1Clicked();
void CMainFrame::OnNcButton1Clicked()
{
AfxMessageBox("VC知识库欢迎您! www.vckbase.com");
}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_MAP
END_MESSAGE_MAP()
来源:VCKBASE.POWERCPP 责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……