源代码下载


一、简介

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

为此我封装了两个类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:

CNCButtonm_NcButton1;

CNCButtonm_NcButton2;

CNCButtonm_NcButton3;

CNCButtonManagerm_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 将消息转发给管理类

LRESULTCMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)

{

LRESULTlResult = CFrameWnd::DefWindowProc(message, wParam, lParam);

if(!IsWindow(this->m_hWnd))

returnlResult;

LRESULTlMyResult = m_NcButtonManager.DefWindowProc(this->m_hWnd, message, wParam,lParam);

if(lMyResult!= 0)

returnlMyResult;

else

returnlResult;

}

2.5.2 添加消息处理函数

// Operations

public:

voidOnNcButton1Clicked();

voidCMainFrame::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()

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

VC 轻松实现非客户区按钮相关推荐

  1. VC----SDK下对窗口非客户区的操作

    窗口分成两大部分:客户区和非客户区.非客户区再次细分:标题栏,如图片中顶部深蓝色:左边框,如图片中红色部分:上边框,如图片中绿色部分:右边框,如图片中右侧天蓝色部分:底边框,如图片中下面棕色部分. 之 ...

  2. Win32 鼠标消息 - 客户区鼠标消息、非客户区鼠标消息、击中测试、鼠标滚轮

    注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 注:以下内 ...

  3. 客户区和非客户区指的什么?窗口客户区和视图客户区的区别

    客户区和非客户区指的什么?窗口客户区和视图客户区的区别! 1,什么是客户区/非客户区? 2, 窗口(框架/frame)的客户区和视图(view)的客户区的区别? 这些都是初学者很容易迷惑的地方,我也是 ...

  4. Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系

    1. 屏幕坐标系:以屏幕的左上角为原点,如图所示 GetWindowRect() 函数获得的 RECT 就是以屏幕坐标系算的. 2. 非客户区坐标系(窗口坐标系) 包括标题栏的部分.GetWindow ...

  5. 客户区和非客户区指的什么?窗口客户区和视图客户区的区别(小问题大思想)

    1,什么是客户区/非客户区? 2, 窗口(框架/frame)的客户区和视图(view)的客户区的区别? 这些都是初学者很容易迷惑的地方,我也是很迷惑,不过经过一番折腾终于弄明白这些问题了.对于这些问题 ...

  6. 窗口非客户区绘制位图与设计

    原文:http://www.haogongju.net/art/1891934 首先介绍在指定区域绘制位图 为了能够在指定的区域中输出位图,需要使用设备上下文CDC类的StretchBlt方法.由于我 ...

  7. vc++ mfc 非客户区 描绘线_决战客户端技术

    原文链接-决战客户端技术 最近经常有小伙伴问我要做一个客户端, 该怎么弄. 这个问题问得很粗犷, 但是实际上客户端的选型是一个很细的问题. 从大学到现在, 也弄了不少的客户端, 从公司主营炒股专业客户 ...

  8. 7.2 客户区鼠标消息

    摘录于<Windows程序(第5版,珍藏版).CHarles.Petzold 著>P223 第 6 章已经讲到,Windows 只把键盘消息发送到当前具有输入焦点的窗口.鼠标消息则不同:当 ...

  9. VC MFC指定客户区的大小

    VC MFC指定客户区的大小 http://www.cppblog.com/bidepan2023/archive/2007/09/26/32900.aspx 假设我们用CreateWindow(.. ...

  10. 老话题:自己编写只截窗口客户区的截屏软件(VB2010)

    现在能实现截屏的软件很多,就不一一列举了,连WIN7都自带截屏软件,甚至OFFICE2010开始都有截屏的功能. 截屏软件虽多,无外乎三种截屏方式:全屏截图.窗口截图.自定义矩形截图. 其中,窗口截图 ...

最新文章

  1. Solarium简易使用
  2. zabbix-web前端配置
  3. C++面试/技巧(四)
  4. 【当贝市场】智能电视语音识别功能泄露隐私?
  5. LUOGU P3919 【模板】可持久化数组(主席树)
  6. IDEA 常用设置 与 常用操作(一)
  7. Spring学习笔记17--在XML中使用SPEL
  8. Go语言 -- PostgreSQL数据库
  9. 二等水准数据平差_二等水准点高程平差计算表(1)
  10. C# 修改打印机名称
  11. 个人配置--常用软件保护色设置
  12. 1那智机器人主电连接
  13. HTML5与Flash相比有哪些好处?
  14. markDown 下载安装教程
  15. SCARA机器人matlab仿真
  16. 上古卷轴5:天际(重制版)关于寒霜之秋(frostfall)保暖度与覆盖度为0的解决办法
  17. 第一个用python实现的数据化运营分析实例——销售预测
  18. Photoshop抠图(磁性钢笔工具)
  19. 渔港股份创业板IPO上会被否:审核被终止,曾计划募资3.3亿元
  20. 关于链接出现 unauthenticated user 用户问题研究

热门文章

  1. matlab对图像处理差分,MATLAB图像处理实例详解
  2. QCC3040---FS(file system)中添加文件方法
  3. Main Menu菜单栏消失解决
  4. 为什么学计算机容易秃顶,为什么程序员更容易脱发?知道答案惊呆了!
  5. Groovy~Groovy运算符
  6. 电阻式触摸屏的工作原理
  7. STM32——触摸屏实验-电阻型触摸屏-M4
  8. iPad中国内地商标权诉讼调查
  9. python 爬取12306验证码
  10. 9月18日博文阅读数异常波动公告