[英]How to pass class instances to WndProc in C#
如何將主窗體中的對象實例傳遞給WndProc方法
例如:我有一個ComboBox對象-objCombo 。 而且我必須在系統繪制下拉列表框之前捕獲特定的窗口消息。
一種方法是,我可以有一個自定義的組合框,它來自ComboBox
public class CustomComboBox : ComboBox
{
//... some initialization code goes here
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CTLCOLORLISTBOX)
{
// capture the message and do some work.
//here i can get the reference to the CustomComboBox by using
//this keyword.
}
}
}
但是,我想知道有沒有一種方法可以執行此操作,而無需完成創建自定義組合框的過程並完全相同。 即使用對組合框實例的引用將Windows消息捕獲到我的Form類中。 ?
即
public class MyForm : Form
{
//... some initialization code goes here including the InitializeComponent
// for form objects and other controls
private void CaptureComboWndProc(ref Message m)
{
// this method will capture only the windows message specific to objCombo ??
}
}
我希望我對“謝謝和干杯VATSA”這個問題很清楚
更好的方法是創建組合框的后代。 這是非常清楚的方法。
但是,您可以從消息中找到控件,方法如下。
使用Control.FromHandle
查找將消息發布到的控件。
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CTLCOLORLISTBOX)
{
if(Control.FromHandle(m.HWnd) == this.objCombo)
{
CaptureComboWndProc(ref m);
}
}
}
private void CaptureComboWndProc(ref Message m)
{
}
並且...最后我想說不要這樣做。
在Windows GUI編程中,通用技術可能被稱為“對窗口進行子分類”。 它通過替換窗口的窗口過程來工作。 您已經在工具箱中找到的每個本機窗口控件(ListView,ComboBox等)都已完成此操作,這就是它們引發事件的方式。 並且可以重復進行。 無需調用,NativeWindow類通過其AssignHandle()方法支持它。
您必須從NativeWindow派生自己的類,並重寫WndProc()方法以實現自定義消息處理。 使用例如表單的Load事件來附加它。 大致:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private class ComboHooker : NativeWindow {
protected override void WndProc(ref Message m) {
if (m.Msg == 0x134) {
// etc...
}
else {
// Stop sub-classing on WM_NCDESTROY
if (m.Msg == 0x82) this.ReleaseHandle();
base.WndProc(ref m);
}
}
}
private void hookComboBoxes(Control.ControlCollection ctls) {
foreach (Control ctl in ctls) {
if (ctl.GetType() == typeof(ComboBox)) {
new ComboHooker().AssignHandle(ctl.Handle);
}
hookComboBoxes(ctl.Controls);
}
}
protected override void OnLoad(EventArgs e) {
hookComboBoxes(this.Controls);
base.OnLoad(e);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.