`
testcs_dn
  • 浏览: 113810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

VC 轻松实现非客户区按钮

 
阅读更多

源代码下载


一、简介

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



为此我封装了两个类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轻松实现非客户区按钮示例及源码

    VC轻松实现非客户区按钮示例及源码 有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应。为此我封装了两个类CNCButton和CNCButtonManager,CNCButton主要用于按钮绘制,CNCButtonManager用于按钮的...

    MFC非客户区完美自绘

    非客户区是指窗口中除了客户区(Client Area)以外的部分,包括标题栏、边框、最大化和最小化按钮等。在MFC中,通过自定义窗口过程(Window Procedure)或重载成员函数,我们可以实现对非客户区的自定义绘制。 二、...

    漂亮的按钮类VC

    开发者可能通过OnNcCalcSize()和OnNcPaint()消息来调整非客户区的大小和形状,或者通过On_WM_CTLCOLOR_MSG()处理消息改变按钮的背景颜色和文字颜色。 3. **动画效果**:为了增加视觉吸引力,按钮可能包含了动画效果...

    VC XP风格按钮.rar

    4. `PreSubclassWindow`或`OnNcPaint`函数:处理非客户区绘图,确保XP风格的边框正确显示。 在WinXPButtonST.h中,可以期待看到类的声明,包括类名、成员变量和成员函数。例如: ```cpp class WinXPButtonST : ...

    VC透明按钮实用实例(包含类)

    3. 处理WM_NCPAINT消息,使得非客户区(如边框)也支持透明。 4. 可能需要处理WM_CTLCOLORBTN消息,以便在父窗口上正确绘制背景。 5. 如果使用图片,需要加载图片资源,并设置Alpha通道以实现透明。 6. 在创建按钮...

    vc客户管理系统(数据库)

    本项目是一个基于Visual C++ 6.0(简称VC6.0)开发的客户管理软件,它充分利用了ADO(ActiveX Data Objects)技术来实现对数据库的高效访问和操作。ADO是微软提供的数据访问接口,能够方便地在应用程序中与各种...

    VC++MFC封装的圆形按钮类

    此外,可以使用OnNcCalcSize()和OnNcPaint()来处理非客户区的绘制。 5. **鼠标光标处理**:当鼠标悬停在按钮上时,可以改变鼠标光标形状,提供更好的用户体验。这可以通过重写OnSetCursor()来实现。 6. **自定义...

    酒店管理系统 vc

    《酒店管理系统VC实现详解》 在信息技术飞速发展的今天,酒店管理系统已经成为现代酒店日常运营不可或缺的一部分。本系统采用经典的Visual C++(简称VC)作为开发工具,为酒店提供了一套全面、高效的管理解决方案。...

    酒店管理系统(VC)

    在“酒店管理系统(VC)”中,采用了用户友好的图形用户界面(GUI),使用MFC(Microsoft Foundation Classes)库进行开发,提供清晰的菜单、按钮和对话框,使得非专业用户也能轻松上手。界面设计时,考虑到不同功能...

    VC中嵌入FLASH

    `GetClientRect`获取对话框的客户区矩形,然后将其传递给`MoveWindow`,确保Flash控件填充整个区域。 5. **运行时注意事项**: - 当使用相对路径加载Flash文件时,确保文件位于程序可以访问的位置,或者使用绝对...

    VC.rar_Vc_酒店_酒店管理系统c

    2. 房态管理:实时更新房间的占用情况,通过MFC的数据绑定机制,可以轻松实现数据库中的房态信息与界面的同步。 3. 客户管理:存储和管理客户信息,包括入住、退房、消费记录等,这需要设计合理的数据结构和数据库...

    制作弧形按钮

    在创建弧形按钮时,我们可能需要将区域与按钮控件的客户区对齐。`OffsetRgn()`接受两个参数,分别代表水平和垂直方向上的位移量: ```cpp CRect rc0; // 获取按钮的矩形区域 button.GetWindowRect(&rc0); ...

    Vc —BmpButton美化Static控件

    此外,可能还需要处理WM_NCPAINT消息,以自定义非客户区的绘制,实现按钮边框的样式变化。 `BmpButton`控件还可能支持加载ICO资源图标。ICO文件是一种包含多个尺寸和颜色深度的图标文件格式,常用于程序的图标资源...

    VC多线程下载服务器客户端

    在本项目中,MFC用于构建用户界面,如对话框、按钮和状态栏,同时也提供了对Windows API的封装,使得开发者可以轻松地进行多线程编程。 在**压缩包子文件的文件名称列表**中,"多线程文件下载客户端服务器"可能包含...

    vc开发的c++宾馆管理系统

    1. **用户界面**:友好的图形用户界面(GUI)使得非技术用户也能轻松操作。界面可能包含各种菜单选项,如“入住”、“退房”、“查询”等,通过按钮和对话框与用户交互。 2. **客户管理**:系统能够存储和管理客户...

    VC强化

    1. **图形绘制技术:** 掌握如何在客户区绘制直线、矩形、椭圆等图形。 2. **颜色填充与边界设置:** 支持对图形的颜色进行填充,并设置边界的颜色。 3. **图形操作:** 允许用户移动已绘制的图形。 4. **图形保存:...

    对话框式的工具栏,可进行不同方式停靠

    实现工具栏停靠和浮动功能,通常需要处理WM_NCCALCSIZE和WM_NCPAINT消息,调整控件的布局和绘制非客户区。当用户尝试改变工具栏的位置时,程序需要检测鼠标事件,判断是否触发停靠或浮动操作。VC提供了MFC...

    VC与Matlab接口方法的剖析.pdf

    通过这些函数,可以轻松实现数据的传递和命令的执行,从而完成复杂的计算任务。 ##### 2.2 部分程序示例 为了更好地理解MATLAB引擎与VC++接口的实现过程,接下来我们将通过一个具体的示例来展示如何在VC++应用程序...

    VC++图形和文本输出

    - **CPaintDC 类**: 用于响应窗口重绘消息 (WM_PAINT) 的绘图输出,不仅可对客户区进行操作,还可以对非客户区进行操作。 - **CClientDC 类**: 代表窗口客户区的设备环境,一般在响应非窗口消息并对客户区绘图时要...

Global site tag (gtag.js) - Google Analytics