问题描述
普通的子类化一个控件,我知道怎么实现//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的回复:
如果是自身进程内做子类化实在是没必要.
那应该如何做