首页 IP地址查询 | Alexa排名查询 | 手机归属地查询
设为首页 收藏本站
  • 网络编程网络编程
  • 软件编程软件编程
  • 数据库技术数据库技术
  • 编程学院
  • 业界资讯 业界资讯
  • 源码中心源码中心
  • 会员中心会员中心
  • 页面导航: 首页MFC组件控钮 → 轻松实现非客户区按钮

    轻松实现非客户区按钮

    发布:VCKBASE.POWERCPP 发布日期:2008-06-05 字体:[增加 减小] 类型:转载

    下载源代码

    一、简介

    有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应,如下图所示:



    为此我封装了两个类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 添加按钮和管理类成员变量

    // Implementation
    public:
    	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;
    	else
    		return lResult;	
    }

    2.5.2 添加消息处理函数

    // Operations
    public:
    	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_MAP
    END_MESSAGE_MAP()

    总结:本文提供的两个类可以方便地往非客户区(如:标题栏)添加按钮,欢迎批评指正!


    Tags: NCButton
    为配合网络严查,文章评论将关闭敬请谅解.
    同 类 文 章
    最 近 更 新
    热 点 排 行