对于窗口的子类化相信大家并不陌生:基于某一个控件功能,用窗口子类化来实现我们想要的功能!由于控件的封装,我们无法对它进行直接操作修改,但是我们可以截获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汇编---控件的超类化感想相关推荐

  1. Win32 ListBox控件

    Win32 ListBox控件 创建ListBox控件 创建窗口函数 HWND CrateWindowEx(DWORD dwExStyle , // 窗口的扩展风格,基本没用LPCTSTR lpCla ...

  2. Win32公共控件 - 状态栏和工具栏

    本篇是介绍公共控件系列文章的第2部分,描述了两种新的公共控件:状态栏和工具栏.本系列的其它文章涵盖了以下主题: 第1部分:基础 第3部分:滑动条.进度条和上下控件 第4部分:表头窗口和列表视图窗口 第 ...

  3. win32通用控件TreeView滚动条自绘

    <标题>win32通用控件TreeView滚动条自绘 直接使用windows sdk 进行开发自绘滚动条是很让人蛋疼的,嫌消息HOOK 麻烦,又不了解第三方控件,别担心,你还有一条小路可走 ...

  4. bootstrap之双日历时间段选择控件—daterangepicker(汉化版)

    jQuerybootstrapdaterangepicker汉化版 双日历时间段选择插件 - daterangepicker是bootstrap框架后期的一个时间控件,可以设定多个时间段选项,也可以自 ...

  5. Win32窗体控件方法与消息

    在Windows中,每个窗体的子控件也称之为窗体,创建一个控件的方法是CreateWindow 控件公共方法 如GetWindowText,EnableWindow等方法,几乎每个控件都拥有这些特性, ...

  6. win32创建控件的一些问题

    在我们使用CreateWindow();像一般控件建Windows扩展控件的时候我们会发现控件没有创建成功 这是因为我们没有对Windows扩展控件库进行初始化,这要我们使用InitCommonCon ...

  7. 深入浅出CChart 每日一课——快乐高四第十四课 枝头红杏,Win32标准控件ChartCtrl之围城

    本节课笨笨继续介绍ChartCtrl控件在DuiLib中的应用. 请大家先复习高四第三课. 本节课的方法和这一课的方法差不多,由于笨笨提供了ChartCtrl这个新工具,所以编程可以有一定的简化. 首 ...

  8. Win32 ListView控件基本使用

    首先看一下Windows公共控件库,参阅: https://blog.csdn.net/bcbobo21cn/article/details/106287676 https://blog.csdn.n ...

  9. 【汉化】DevExpress插件中RichEdit控件的自定义汉化方法

    本文实现方法参考:http://blog.csdn.net/ljsql/article/details/5487460 DevExpress插件,官方提供的汉化包中关于RichEdit控件的汉化基本没 ...

最新文章

  1. 2021,让 AI 不再野蛮生长
  2. Openstack部署总结:“部署过程Error: Local ip for ovs agent must be set when tunneling is enabled”问题...
  3. python3 time
  4. boost::mpl模块实现push_back相关的测试程序
  5. was java heap space_实战项目中Java heap space错误的解决
  6. 网易10万+课程迅速刷屏又迅速被封:“违规”背后的思考
  7. 如何用 Hook 实时处理和保存 Ajax 数据
  8. 腾讯员工又双叒叕涨工资了,平均月薪已达7.4万
  9. 【沫沫金】安卓手机版 - 日期控件
  10. Sublime_配置插件
  11. (X)HTML Strict 下的嵌套规则
  12. dll文件保存到服务器,dll是什么文件?dll文件怎么打开?
  13. 电动车整车控制器VCU控制: 信号处理、车辆状态控制及扭矩计算控制、附件控制、
  14. 第三阶段应用层——1.7 数码相册—电子书(5)—多线程支持多输入
  15. java uclinux_Java在基于uclinux的嵌入式系统中的应用
  16. 华泰证券:“融券通”是何阳谋?
  17. 我是不是该安静的走开
  18. 基于51单片机无线门铃控制系统设计(毕设课设)
  19. 用于ip伪装身份的网络爬虫
  20. 报表解决方案Telerik Reporting发布R2 2019 SP1|支持MS Access

热门文章

  1. redis 所有模糊key 查询_写完这篇Redis由浅入深剖析快自闭了!
  2. 看完数据分析师一天的工作,才明白为什么人家年薪50W
  3. 数据湖就是坑人的新概念?那些挖坑的企业,后来都怎么样了
  4. 数据体系建设的开端,该如何规划平台?
  5. 数据分析的5层解读,报表仍是有效的落地实践!
  6. 手动创建一个标准web工程
  7. 局域网网络风暴检测工具_交换机网络术语汇总
  8. matlab怎么复制相同的列,怎样将数组中某一列数据相同的行提取出来?
  9. 洛谷P3152 正整数序列
  10. VsCode crtl + 鼠标右键 python代码无法跳转