在vc中自定义事件扩展控件功能

VC++ MFC界面美化实战:CButtonST库集成与高级应用指南 在Windows桌面开发中,控件自定义绘制是提升应用专业度和用户体验的关键技术。通过重写WM_PAINT消息处理、响应鼠标事件,开发者可以突破原生控件的外观限制,实现圆角、渐变、动态效果等现代化设计。这一技术不仅增强了界面的视觉吸引力,更在工具软件、内部系统等场景中显著提升了操作直观性。CButtonST作为经典的MFC按钮扩展库,封装了上述复杂逻辑,通过简单的API调用即可实现丰富的定制功能。本文结合“电脑vc++库自检”和“vc++基础教程”等常见需求,详解其集成步骤、核心API及实战技巧,帮助开发者快 阅读详情

       当MFC所提供的控件不能满足我们的要求时,我们需要为控件进行功能扩展,根据需求自定义控件的事件。本文以一个扩展按钮的鼠标按下和鼠标松开的事件为例,其它控件事件扩展可遵照该例。提供源代码,在VC6.0中调试成功。

    按钮也是一个窗口,继承自CWND,它其中封装了大量的消息,因此我们之需要继承CButton,然后添加我们需要的事件对控件进行扩展即可。在开发过程中,只需要将标准按钮拖放到对话框,这和一般开发没有区别。

    基本思想:一般不需要将在新扩展类中编写消息相应代码,而是将该消息反射到父窗口中去,原因是因为在处理消息的过程中,我们需要用到父窗口的其他信息,如果放在这个类中去实现,很麻烦,也基本不可能。

    开发流程:

    一   新建一个类NewButton,继承CButton,需要做如下工作:

  1. 添加事件OnLButtonDown OnLButtonUp 。
  2. 添加HWND成员变量 HWND m_hWnd.
  3. 添加消息宏道头文件中 #define WM_LBUTTONDOWNU (WM_USER+10)
    #define WM_LBUTTONUPU (WM_USER+11)
  4. 添加自定义消息 //{{AFX_MSG(NewButton)
      // NOTE - the ClassWizard will add and remove member functions here.
     afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
     afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
     //}}AFX_MSG
  5. 实现2个事件函数

void NewButton::OnLButtonDown(UINT nFlags,CPoint point)
{
 
 CButton::OnLButtonDown(nFlags,point);

 UINT id =GetDlgCtrlID();

m_hWnd = GetParent()->GetSafeHwnd();
  ::SendMessage(m_hWnd,WM_LBUTTONDOWNU,id,0);
 
}
void NewButton::OnLButtonUp(UINT nFlags,CPoint point)
{
 CButton::OnLButtonUp(nFlags,point);
 UINT id;
 id=GetDlgCtrlID();
 m_hWnd=GetParent()->GetSafeHwnd();
 ::SendMessage(m_hWnd,WM_LBUTTONUPU,id,0);
}

    二 在对话框中放置2个按钮 界面如下:

    

  1. 添加2个事件  afx_msg void OnLButtonDownu(UINT id,UINT qt);
     afx_msg void OnLButtonUpu(UINT id,UINT qt);
  2. 添加消息映射 BEGIN_MESSAGE_MAP(CButtonExtDlg, CDialog)
     //{{AFX_MSG_MAP(CButtonExtDlg)
     ON_WM_SYSCOMMAND()
     ON_WM_PAINT()
     ON_WM_QUERYDRAGICON()
     ON_WM_CANCELMODE()
     //}}AFX_MSG_MAP
     ON_MESSAGE(WM_LBUTTONDOWNU, OnLButtonDownu)
     ON_MESSAGE(WM_LBUTTONUPU, OnLButtonUpu)
    END_MESSAGE_MAP()
  3. 在OnIniDilog中添加代码  m_button1.SubclassDlgItem(IDC_BUTTON1,this);
     m_button2.SubclassDlgItem(IDC_BUTTON2,this);
  4. 实现2个消息响应函数,对消息进行处理。
  5. void CButtonExtDlg::OnLButtonDownu(UINT id,UINT qt)
    {
     
     if(id==IDC_BUTTON1)
     {
      GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON1 DOWN");
     }
     if(id==IDC_BUTTON2)
     {
      GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON2 DOWN");
     }
     
    }
  6. void CButtonExtDlg::OnLButtonUpu(UINT id,UINT qt)
    {
     if(id==IDC_BUTTON1)
     {
      GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON1 UP");
     }
     if(id==IDC_BUTTON2)
     {
      GetDlgItem(IDC_EDIT_TEST)->SetWindowText("BUTTON2 UP");
     }
    }
VC++实现Flash播放器项目实战指南 Visual C++(VC++)是微软公司推出的一款强大的C++集成开发环境,提供了一整套用于C++开发的工具和服务。作为IT专业人士,理解VC++的基础环境是进行高级开发前的必要条件。ActiveX控件不仅限于使用现成的组件,还可以通过继承原有控件类并添加新的功能或属性来自定义和扩展。例如,可以创建一个继承自IOleObject和接口的自定义控件类,并实现相应的接口方法来添加自定义行为。自定义控件的开发通常需要使用更复杂的COM编程技巧,比如处理多线程问题、数据绑定以及事件处理等。 阅读详情

相关推荐

PromptBio实战:如何用AI对话搞定转录组数据分析(附详细操作截图)

本文详细介绍了如何利用PromptBio平台通过AI对话完成转录组数据分析,无需编程基础即可实现从数据上传到结果解读的全流程。文章包含详细的操作截图和参数配置建议,帮助科研人员快速掌握这一生信分析工具,显著提升研究效率。

weixin_30872157的博客 132

VC2005中使用IP地址控件

    在VC中编写win32程序,不用mfc,如果要使用IP地址等扩展控件(包括Date&Time控件、ComboBoxEx控件等)都需要进行注册。因为这些控件是放在comctl32.dll库中,平时是不加载到内存的。    如果不进行注册,那你的程序就无法使用这些控件。尽管你在对话框模板上可以画上这些控件,但是运行时还会出错。注册要用InitCommonControlsEx ()这个API

炎黄的专栏 1490

【DeepSeek+Office/WPS】智能办公新时代的全新利器

DeepSeek是一家专注于通用人工智能技术研发的中国科技公司,其核心产品DeepSeek-R1是一款开源的推理大模型,专注于复杂任务的高效处理,支持智能对话、文本生成、语义理解、计算推理、代码生成与补全等多种应用场景。作为国产、免费、开源且强大的AI平台,DeepSeek不仅致力于为终端用户提供高质量的智能服务,还为开发者提供了一整套完善的技术解决方案,帮助他们快速构建和部署自己的智能应用。

2303_77200324的博客 2790

WebBrowser弹出窗口之(一) -- window.open( )

1. 对于新打开的窗口,在打开时会触发WebBrowser的NewWindow3事件,触发该事件有以下几种操作: 1) 按住SHIFT或CTRL键时点击鼠标; 2) 在链接的右键菜单中选择“在新窗口中打开”或“在新标签中打工”; 3) 链接的目标窗口不存在或者为“_blank“; 4) Javascript的windows.open函数调用; 5) 在调用Na...

移动开发记录 528

锐捷路由器DNS Proxy保姆级配置教程:从零到实战,手把手教你搞定内网域名解析

本文提供锐捷路由器DNS Proxy功能的详细配置教程,从基础环境搭建到实战测试,手把手教你实现内网域名解析。涵盖上游DNS设置、内网域名映射、故障排查等关键步骤,帮助网络管理员快速解决内网访问难题,提升工作效率。

weixin_29284657的博客 553

手把手调试Android 10 DHCP服务:从dumpsys network_stack到DhcpServer.java的实战技巧

本文详细介绍了在Android 10中调试DHCP服务的实战技巧,从使用dumpsys network_stack分析服务状态到深入DhcpServer.java源码追踪问题。文章提供了完整的工具链配置、关键调试命令和常见问题解决方案,帮助开发者高效解决DHCP服务未启动、IP分配失败等典型问题,特别适合需要深入理解Android网络架构的开发者参考。

uu89012的博客 743

演练:使用 Visual C# 创作用户控件

用户控件提供了一种创建和重用自定义图形界面的方法。用户控件本质上是具有可视化表示形式的组件。因此,它可能包含一个或多个 Windows 窗体控件、组件或代码块,它们能够通过验证用户输入、修改显示属性或执行作者所需的其他任务来扩展功能。可以按照与其他控件相同的方式,将用户控件置于 Windows 窗体中。在本演练的第一部分,创建一个名为 ctlClock 的简单用户控件。在本演练的第二部分通过继承扩...

weixin_30648587的博客 124

《哥谭神话-工程篇》01.Palantir 平台架构解析-混乱数据如何转化唯一真相源?

Palantir 平台的架构哲学可以概括为将洞察落地为行动,其核心是将“获取唯一真相”能力深度嵌入现有的、复杂的工作流程中,成为提升运营效率和决策质量的倍增器。

895

arcengine 开发经典帖(转)

link: http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=25575&page=1&extra= 使用ArcGIS Engine 开发自定义GIS应用: 第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine的产品。 第二部分:ArcEngine9.2的新特性及变化...

weixin_33938733的博客 408

基于QEMU的openEuler aarch64虚拟机快速部署与漏洞验证指南

本文提供了一份基于QEMU在个人电脑上快速部署openEuler aarch64虚拟机的详细指南。内容涵盖从软件准备、目录规划、QEMU安装、虚拟磁盘创建到系统安装与SSH配置的全过程,并以CVE-2024-1086内核漏洞为例,演示了如何在该虚拟环境中进行安全漏洞的验证与补丁测试,为安全研究和运维测试提供了一个低成本、高效率的ARM架构沙箱环境。

earth的博客 438

Firefox卸载卡住不动的解决方案

本文主要介绍了Firefox卸载卡住不动的解决方案,希望能对使用Windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 15万+

常见问题:文本框控件的消息及应用 (转)

常见问题:文本框控件的消息及应用 (转)[@more@]  文本(或文字)控件是“文本框控件”的简称,它通常用于输入和编辑文字。它属于标准windows编辑控件的一个子类,所以它支持所有编辑控件消息。这儿讲述的技术也适用于由其他...

csd3176的博客 208

YOLO26涨点改进 | 全网独家首发 主干改进篇 | TGRS 2025 | RepViT-TD,告别庞大骨干!YOLO26 + RepViT-TD轻量又强大,实现更快更准的小目标检测!

本文提出将RepViT-TD轻量级主干网络应用于YOLO26目标检测框架,以提升小目标检测性能。RepViT-TD通过优化计算资源分配,强化前两层高分辨率特征提取能力,在保持轻量化的同时(仅4.85M参数)显著提升微小目标的检测精度(AI-TODv2数据集AP50达54.6%)。文章详细介绍了三种主干改进方案(RepVit_ldy1/2/3)的代码实现,并提供了完整的YAML配置文件修改指南,使模型能高效部署于边缘设备。实验表明,该方法在计算复杂度(38.19G FLOPs)和检测精度间取得了良好平衡。

Ai缝合怪、助力小伙伴高效发论文 327

开源GTKSystem.Windows.Forms框架让C# winform支持跨平台运行

一、简介微软原生的.net winform只支持在windows平台下运行,只中一个原因是windows用的视窗是GDI+绘制的,主要原因是微软不想支持linux或macos平台。VC.Net winform软件是windows系统软件环境和开发环境最大的优势之一,是微软占据电脑主流系统的利器!GTKSystem.Windows.Forms框架是C# winform应用程序跨平台(windows、...

farway000的博客 689

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

nim_duilib 代码深度分析

摘要:nim_duilib是一个基于duilib深度优化的跨平台C++界面库,采用DirectUI理念和XML驱动布局设计。核心架构包含六大模块:XML解析(pugixml)、布局引擎(12种布局)、渲染引擎(Skia)、控件体系(50+控件)、跨平台层(SDL3)和资源管理(GlobalManager)。通过目录解耦、模块化设计、性能优化(内存/渲染/虚表)和第三方依赖统一管理,实现了高扩展性、跨平台兼容性和高性能。相比原duilib,在功能完善性、代码可维护性和运行效率方面均有显著提升。

m0_51545131的博客 377

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC++学习(7):对话框编程

1. Windows应用程序工作的基本流程是从用户那里得到数据,经过相应的处理之后,现把处理结果输出到屏幕,打印机或者绵输出设备。这就需要用到Windows应用程序的用户接口对话框。对话框就是一个窗口,它不公可以接收消息,而且还可以被移动和关闭,甚至可以在它的客户区中进行绘图。相当于一个窗口,在它上面能够旋转各种标准控件和扩展控件。都是由CWnd类派生来 2. 对话框...

weixin_30734435的博客 123

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python 标准库介绍

Python标准库提供了丰富的内置模块和工具,涵盖文本处理、二进制数据、数学运算、文件操作、加密、并发编程、网络通信等核心功能。这些模块既有C编写的高效底层实现,也有Python编写的跨平台解决方案。标准库支持字符串处理、正则表达式、日期时间、数据结构、文件压缩、数据库访问等常见任务,同时还包含网络协议、多媒体处理、GUI开发等高级功能。此外,Python还提供了完善的开发工具链,包括测试框架、调试工具、虚拟环境管理等。标准库的模块化设计使开发者能够快速构建各类应用程序,而其跨平台特性确保了代码的可移植性。

人无远虑,必有近忧 3909

VC++深入详解学习笔记3

Lesson7: 对话框编程 1. Windows应用程序工作的基本流程是从用户那里得到数据,经过相应的处理之后,现把处理结果输出到屏幕,打印机或者绵输出设备。这就需要用到Windows应用程序的用户接口对话框。对话框就是一个窗口,它不公可以接收消息,而且还可以被移动和关闭,甚至可以在它的客户区中进行绘图。相当于一个窗口,在它上面能够旋转各种标准控件和扩展控件。...

weixin_34067980的博客 206

Sleep(0)及其使用场景

    Sleep(n)的作用是让当前线程睡眠n毫秒,以便执行其他线程,如果没有其他线程,那睡眠n毫秒后,继续执行。    而如果n=0,Sleep(0)是指CPU交出当前线程的执行权,让CPU去执行其他线程。也就是放弃当前线程的时间片,转而执行其他线程。    那么,Sleep(0)应该在那种情况下使用? 一般来说,如果当前线程比较耗时比较占CPU资源,可以在结尾处加上Sleep(0),

4946

继承CWinThread创建UI线程

     我们经常在UI线程里面创建一些worker线程来执行一些复杂而冗长的计算任务,也可以创建一个UI线程,比如在点击一个按钮后弹出一个对话框,也可以用一个线程来执行。    只需要继承CWinThread就行了,并重载2个函数:virtual BOOL InitInstance();    virtual int ExitInstance();/代码如下:class CU

2112

用消息映射处理消息循环

     为一个vc程序添加一个事件,那么平台会自动生成时间处理的函数,我们只需要在里面加代码就可以了。比如添加WM_LButtondown大家都知道windows程序是事件驱动,每一个事件都需要一个函数来与之对应,也就是通过消息循环在消息队列中来检测事件,然后通过回调函数来处理这一事件。    那么MFC是如何链接到这一事件的呢?它是通过消息映射来实现的。    在每个能处理消息的类中,

1451

递归删除文件夹

    windows API有一个RemoveDirectory(path)函数,但是必须是该文件夹为空,才能删除。在这个ActiveX中,因为只有3个需要另外存放的DLL,因此我是采用一下代码新建文件夹的:    TCHAR                   csStr[256];    CString                 sysDirPath;    Get

982

使用指针实现进程间通信

    使用指针进行进程间通信,大致思想就是,在一个应用程序中获得某个变量的地址,然后在另一个应用程序中通过内存读写来改变这个地址中的值,或者提取这个地址中的值。这就是整个过程,很简单。两个应用程序沟通的桥梁就是某个变量的地址(指针)。    找到进程句柄: 首先在一个应用程序中,找到进程窗口的句柄(FindWindow()), 然后获得进程ID(GetWindowThreadProcessI

617
上一篇: 函数指针调用类成员函数的解决方案
下一篇: 使用指针实现进程间通信
burningcpu
博客等级 码龄20年 13粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值