关于子类化(subclass)的超高难度问题,大家帮看看怎么实现

问题描述

普通的子类化一个控件,我知道怎么实现//Win32APIneeded[DllImport("user32")]privatestaticexternIntPtrSetWindowLong(IntPtrhWnd,intnIndex,Win32WndProcnewProc);[DllImport("user32")]privatestaticexternintCallWindowProc(IntPtrlpPrevWndFunc,IntPtrhWnd,intMsg,intwParam,intlParam);//AdelegatethatmatchesWin32WNDPROC:privatedelegateintWin32WndProc(IntPtrhWnd,intMsg,intwParam,intlParam);//fromwinuser.h:privateconstintGWL_WNDPROC=-4;privateconstintWM_LBUTTONDOWN=0x0201;//programvariablesprivateIntPtroldWndProc=IntPtr.Zero;privateWin32WndProcnewWndProc=null;voidSubclassHWnd(IntPtrhWnd){//hWndisthewindowyouwanttosubclass...,createanew//delegateforthenewwndprocnewWndProc=newWin32WndProc(MyWndProc);//subclassoldWndProc=SetWindowLong(hWnd,GWL_WNDPROC,newWndProc);}//thisisthenewwndproc,justshowamessageboxonleftbuttondown:privateintMyWndProc(IntPtrhWnd,intMsg,intwParam,intlParam){switch(Msg){caseWM_LBUTTONDOWN:MessageBox.Show("Clicked");return0;default:break;}returnCallWindowProc(oldWndProc,hWnd,Msg,wParam,lParam);}但是我要实现的是System.Windows.Forms下的所有控件子类都能子类化到一个窗口过程里。不是我每个控件都SetWindowLong一遍。能实现这种效果吗?

解决方案

解决方案二:
子类化,你使用的太“低级了”吧。你可以使用NativeWindow来子类化指定句柄的窗口。
解决方案三:
你可以使用NativeWindow的AssignHandle(Handle)方法关联到指定的窗口句柄来处理窗口的消息,可重写其WndProc方法。
解决方案四:
引用1楼hbxtlhx的回复:

子类化,你使用的太“低级了”吧。你可以使用NativeWindow来子类化指定句柄的窗口。

我在写一个dll,想让加载我这个dll的C#程序的所有控件的窗口过程换成我的(或者说我可以控制他们)。不是说指定某个句柄来之类化,不知道我说明白了没有。。。
解决方案五:
我子类化了一个button,自绘了这个按钮,我是想让所有按钮都变成我自己写的按钮子类。土方法是每个按钮都声明成我写的子类。我想问有没方法,让C#中所有的按钮都自动的变成我自绘的按钮,而不用我一个一个声明成我写的子类。
解决方案六:
子类化的方法不可取,工作量大不说,还不灵活;关键是绘制的问题
解决方案七:
MARK
解决方案八:
子类化的方法不可取,工作量大不说,还不灵活;关键是绘制的问题
解决方案九:
子类化的方法不可取,工作量大不说,还不灵活;关键是绘制的问题
解决方案十:
那怎么做?像IrisSkin使用时就new一个对象就能换肤了。我也想做成这样的。
解决方案十一:
如果从软件作法来说,只采用子类化处理不是很好的做法。还是按部就班的来比较好。
解决方案十二:
或者是这样子,给一个c#控件的句柄,怎么知道他是什么类型的控件?窗口类没法判断,像Button,CheckBox,GroupBox都是一样的窗口类。
解决方案十三:
如果是自身进程内做子类化实在是没必要.
解决方案十四:
引用12楼ttzyanswer的回复:

如果是自身进程内做子类化实在是没必要.

那应该如何做

时间: 2024-08-06 21:37:26

关于子类化(subclass)的超高难度问题,大家帮看看怎么实现的相关文章

C++ 中超类化和子类化及他们的区别

C++ 中超类化和子类化 超类化和子类化没有具体的代码,其实是一种编程技巧,在MFC和WTL中可以有不同的实现方法. 窗口子类化: 原理就是改变一个已创建窗口类的窗口过程函数.通过截获已创建窗口的消息,从而实现监视或修改已创建窗口类的行为属性.可以用来改变或者扩展一个已存在的窗口的行为,而不用重新开发.比如要获得那些预定义控件窗口类(按钮控件.编辑控件.列表控件.下 拉列表控件.静态控件和滚动条控件)的功能而又要修改它们的某些行为. 子类化的优点主要体现在以下两个方面:首先,它不需要创建新的窗口

关于如何换肤、子类化的解决方案

对于应用程序的换肤及子类化.下面是我尝试过一些方法,以在CAboutDlg中子类化其中的Button为例: 第一种:直接用现成的类 1.自己写一个类class CButtonXP : public CButton{/*...*/} 用MessageMap处理感兴趣的消息. 2.用CButtonXP代替CButton来声明变量m_btn; 3.在void CAboutDlg:DoDataExchange(CDataExchange* pDX)中加上一句:DDX_Control(pDX, IDB_B

窗口子类化-实例应用

所谓窗口子类化:改变一个已经存在的窗口实例的性质:消息处理与其他实例属性.   通常在SDK中所谓的窗口子类化就是改变一个窗口函数(如GetWindowLong()和SetWindowLong())通过这两个函数来设置窗口的属性等:   而今天我们主要内容是介绍MFC中的子类化,它跟SDK中的子类化不太一样: 所有MFC窗口有相同的窗口函数,由该窗口函数根据窗口句柄查找窗口实例,在把消息映射到该窗口类(class)得消息处理函数上.为了利用MFC的消息映射机制,不宜改变窗口函数(名),MFC也把

汇编教程之窗口子类化

在这一讲,我们将学习什么是窗口子类化和怎样按你所想要的方式方便地使用它. 理论: 如果你曾经在 Windows 环境下编过程序,有时候就会发现:有一个现成的窗口,几乎有你所需要的全部功能,但还不完全一样(否则就没有必要讲这一节了).你曾遇到过这样的处境吗,如果你需要一个具有过滤特殊字符功能的 Edit 控件.当然最直接的方法就是自己用代码来实现,但这的确是一个费时又很困难的任务,而窗口子类化就可以用来做这种事情. 窗口子类化允许你接管被子类化的窗口,使你对它有绝对的控制权.举个例子了来阐明一下:

解说Win32的窗口子类化

也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作--因为它只能够单纯的限制大小写或者纯数字.当你在论坛上求救的时候,某个网友告诉你:"用子类化."你也许会在看到一线曙光的同时多出了一连串的问题:何为子类化?子类化的原理是什么?如何实现子类化?下面就让我从一个简单的C++程序开始,一步步解开你的疑团吧. 首先,我为你列出以下这个C++程序: #include <iostream> using namespace std; class Pa

利用窗口子类化隐藏系统图标

窗口子类化是一种非常有用的技术,通常它用在Windows GUI编程方面,我们用这种技术来创建新的控件,比如让SubClassing一个Edit控件添加一些消息处理让它变成MaskEdit控件等等.反过来想想如果我们SubClassing一个有ES_PASSWORD风格的窗口控件,得到它的密码是难是吗?很简单,不过是一句CallWindowProc调用,只不过在NT等系统上需要Inject一个DLL到目标进程来SubClassing一个进程中的窗口或是子窗口. 用Spy++看了一下,资源管理器里

继续问子类化的问题。。。

问题描述 publicclassSkinButton:Button我从Button子类化,从而想自绘按钮.但是这样每个按钮我都需要用SkinButton类来声明.如果工程里按钮很多就太麻烦了.有没有方法让System.Windows.Forms.Button自动都子类化了? 解决方案 解决方案二:主菜单"编辑"-"快速替换"查找内容:System.Windows.Forms.Button替换为:你的Button的完整类型名称查找范围:整个解决方案其它选项默认单击&q

眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较"生僻"的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程.子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法.不要把"子类化.超类化"与面向对象语言中的派生类.基类混淆起来."子类化.超类化"中的"类"是指W

子类化

子类化 如果你曾经在 Windows 环境下编过程序,有时候就会发现:有一个现成的窗口,几乎有你所需要的全部功能,但还不完全一样.如果你需要一个具有过滤特殊字符功能的 Edit 控件.当然最直接的方法就是自己用代码来实现,但这的确是一个费时又很困难的任务,而子类化就可以用来做这种事情. 子类化允许你接管被子类化的窗口,使你对它有绝对的控制权.举个例子了来阐明一下:例如你需要一个只接受十六进制数字输入的文本编辑框,如果使用一个简单的 Edit控件,当用户输入十六进制以外的字符时,你既不知道也无计可