Win32汇编---控件的超类化感想
对于窗口的子类化相信大家并不陌生:基于某一个控件功能,用窗口子类化来实现我们想要的功能!由于控件的封装,我们无法对它进行直接操作修改,但是我们可以截获windows给控件过程发送的消息,从而达到控制控件窗口的目的!对于单个控件的子类化,并不费事,但是我们如果要注册多个这样的控件就麻烦了,于是产生了超类化的思想。
可以用GetClassInfoEx()来获取现存类的属性,然后修改结构的内容,就可以派生出一个功能不同的类!如下面一段代码:
.const szClass db "NewEdit",0 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ………… _SuperClass proclocal @stWndClass:WNDCLASSEX;//; 基于 Edit 类建立一个新类:NewEdit;//mov @stWndClass.cbSize,sizeof WNDCLASSEXinvoke GetClassInfoEx,NULL,CTXT("edit"),addr @stWndClasspush @stWndClass.lpfnWndProcpop lpOldProcEditmov @stWndClass.lpfnWndProc,offset _ProcEditpush hInstancepop @stWndClass.hInstancemov @stWndClass.lpszClassName,offset szClassinvoke RegisterClassEx,addr @stWndClassret_SuperClass endp
基于Edit类的NewEdit类就产生了,其中_ProcEdit子程序是NewEdit类的过程函数。这不禁让我想到当初创建windows窗口的时候,每次都要注册一次WNDCLASSEX结构体函数,下面使我们非常熟悉的代码:
_WinMain proclocal @stWndClass:WNDCLASSEXlocal @stMsg:MSGinvoke GetModuleHandle,NULLmov hInstance,eaxinvoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;******************************************************************** ; 注册窗口类 ;********************************************************************invoke LoadCursor,0,IDC_ARROWmov @stWndClass.hCursor,eaxpush hInstancepop @stWndClass.hInstancemov @stWndClass.cbSize,sizeof WNDCLASSEXmov @stWndClass.style,CS_HREDRAW or CS_VREDRAWmov @stWndClass.lpfnWndProc,offset _ProcWinMainmov @stWndClass.hbrBackground,COLOR_WINDOW + 1mov @stWndClass.lpszClassName,offset szClassNameinvoke RegisterClassEx,addr @stWndClass …………
这岂不也是对于窗口的“子类化”吗?我们可以自定义窗口的背景颜色,光标位图以及主窗口图标!然后调用CreateWindowEx来创建,我想窗口超类化的思想和这里肯定也有些未知的联系(不知道我的思考对不对)!当然也可以在RC文件中用我们超类化好的“NewEdit”,下面是一段演示代码,是针对进制转化超类化出来的,控件中只能输入0~9以及A~F,并自动把小写字母大写,资源文件的定义如下:
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #include <resource.h> //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #define ICO_MAIN 1000 #define DLG_MAIN 1000 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ICO_MAIN ICON "Main.ico" //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DLG_MAIN DIALOG 190, 180, 126, 20 STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP CAPTION "SuperClass" FONT 9,"YaHei Consolas Hybrid" {CONTROL "",-1,"HexEdit",ES_LEFT | WS_BORDER | WS_TABSTOP,5,5,115,12 } //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
汇编源代码如下:
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.386.model flat, stdcalloption casemap: none ;--------------------------------------------------------------------------------- include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.libinclude macro.asm ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ICO_MAIN equ 1000 DLG_MAIN equ 1000 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .data? hInstance dd ? hWinMain dd ? lpOldProcEdit dd ?.const szAllowedChar db "0123456789ABCDEFabcdef",08h szClass db "HexEdit",0 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .code ;--------------------------------------------------------------------------------- _ProcEdit proc uses ebx edi esi hWnd, uMsg, wParam, lParam.if uMsg == WM_CHARmov eax,wParamlea edi,szAllowedCharmov ecx,sizeof szAllowedCharcldrepnz scasb.if ZERO?;====================将字母转换为大写.if al > '9'and al,not 20h.endifinvoke CallWindowProc,lpOldProcEdit,hWnd,uMsg,eax,lParamret.endif .elseinvoke CallWindowProc,lpOldProcEdit,hWnd,uMsg,wParam,lParamret.endifxor eax,eaxret_ProcEdit endp ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< _SuperClass proclocal @stWndClass:WNDCLASSEX;//; 基于 Edit 类建立一个新类:HexEdit;//mov @stWndClass.cbSize,sizeof WNDCLASSEXinvoke GetClassInfoEx,NULL,CTXT("edit"),addr @stWndClasspush @stWndClass.lpfnWndProcpop lpOldProcEditmov @stWndClass.lpfnWndProc,offset _ProcEditpush hInstancepop @stWndClass.hInstancemov @stWndClass.lpszClassName,offset szClassinvoke RegisterClassEx,addr @stWndClassret_SuperClass endp ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< _ProcDlgMain proc uses ebx edi esi hWnd, uMsg, wParam, lParammov eax,uMsg.if eax == WM_CLOSEinvoke EndDialog,hWnd,NULL.elsemov eax,FALSEret.endifmov eax,TRUEret_ProcDlgMain endp ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< start:invoke GetModuleHandle,NULLmov hInstance,eaxcall _SuperClassinvoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULLinvoke ExitProcess,NULL ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<end start
这中间我也学到了很多,老早就从Zoologist的文章中了解到如何去用Spy++去查看窗口属性,以及怎么去截获窗口消息。今天用了下,明白了窗口一些基本的属性,以及看到别的程序一些不知道的风格可以去“截取”,而不必打开MSDN,啃着枯燥的英文!突然想到的一点就是有些程序当光标放在BUTTON上面就变成一个手型,很好奇。通过Spy++研究到可以截获WM_MOUSEMOVE消息来了解光标的活动范围,然后用API函数SetCursor来改变光标形状!这个我没有实验过,感觉中不能实现光标的持续性停留变化。还有一招就是调用API函数SetClassLong,利用GCL_HCURSOR参数来“永久改变”,但后再改回来!麻烦了些,具体还没有实验,调研中……
转载于:https://www.cnblogs.com/kedebug/archive/2010/03/14/2791756.html
Win32汇编---控件的超类化感想相关推荐
- Win32 ListBox控件
Win32 ListBox控件 创建ListBox控件 创建窗口函数 HWND CrateWindowEx(DWORD dwExStyle , // 窗口的扩展风格,基本没用LPCTSTR lpCla ...
- Win32公共控件 - 状态栏和工具栏
本篇是介绍公共控件系列文章的第2部分,描述了两种新的公共控件:状态栏和工具栏.本系列的其它文章涵盖了以下主题: 第1部分:基础 第3部分:滑动条.进度条和上下控件 第4部分:表头窗口和列表视图窗口 第 ...
- win32通用控件TreeView滚动条自绘
<标题>win32通用控件TreeView滚动条自绘 直接使用windows sdk 进行开发自绘滚动条是很让人蛋疼的,嫌消息HOOK 麻烦,又不了解第三方控件,别担心,你还有一条小路可走 ...
- bootstrap之双日历时间段选择控件—daterangepicker(汉化版)
jQuerybootstrapdaterangepicker汉化版 双日历时间段选择插件 - daterangepicker是bootstrap框架后期的一个时间控件,可以设定多个时间段选项,也可以自 ...
- Win32窗体控件方法与消息
在Windows中,每个窗体的子控件也称之为窗体,创建一个控件的方法是CreateWindow 控件公共方法 如GetWindowText,EnableWindow等方法,几乎每个控件都拥有这些特性, ...
- win32创建控件的一些问题
在我们使用CreateWindow();像一般控件建Windows扩展控件的时候我们会发现控件没有创建成功 这是因为我们没有对Windows扩展控件库进行初始化,这要我们使用InitCommonCon ...
- 深入浅出CChart 每日一课——快乐高四第十四课 枝头红杏,Win32标准控件ChartCtrl之围城
本节课笨笨继续介绍ChartCtrl控件在DuiLib中的应用. 请大家先复习高四第三课. 本节课的方法和这一课的方法差不多,由于笨笨提供了ChartCtrl这个新工具,所以编程可以有一定的简化. 首 ...
- Win32 ListView控件基本使用
首先看一下Windows公共控件库,参阅: https://blog.csdn.net/bcbobo21cn/article/details/106287676 https://blog.csdn.n ...
- 【汉化】DevExpress插件中RichEdit控件的自定义汉化方法
本文实现方法参考:http://blog.csdn.net/ljsql/article/details/5487460 DevExpress插件,官方提供的汉化包中关于RichEdit控件的汉化基本没 ...
最新文章
- 2021,让 AI 不再野蛮生长
- Openstack部署总结:“部署过程Error: Local ip for ovs agent must be set when tunneling is enabled”问题...
- python3 time
- boost::mpl模块实现push_back相关的测试程序
- was java heap space_实战项目中Java heap space错误的解决
- 网易10万+课程迅速刷屏又迅速被封:“违规”背后的思考
- 如何用 Hook 实时处理和保存 Ajax 数据
- 腾讯员工又双叒叕涨工资了,平均月薪已达7.4万
- 【沫沫金】安卓手机版 - 日期控件
- Sublime_配置插件
- (X)HTML Strict 下的嵌套规则
- dll文件保存到服务器,dll是什么文件?dll文件怎么打开?
- 电动车整车控制器VCU控制: 信号处理、车辆状态控制及扭矩计算控制、附件控制、
- 第三阶段应用层——1.7 数码相册—电子书(5)—多线程支持多输入
- java uclinux_Java在基于uclinux的嵌入式系统中的应用
- 华泰证券:“融券通”是何阳谋?
- 我是不是该安静的走开
- 基于51单片机无线门铃控制系统设计(毕设课设)
- 用于ip伪装身份的网络爬虫
- 报表解决方案Telerik Reporting发布R2 2019 SP1|支持MS Access