我在Winforms應用程序中有一個多行文本框,我希望能夠在應用程序的某些狀態下單擊而不更改文本選擇。C#Winforms抑制文本框上的鼠標單擊事件
我還想訂閱MouseDown(或Click)事件,我只是不想讓文本選擇對它做出反應。
我希望MouseEventArgs上的Handled或Cancel屬性,但很遺憾,沒有。
我可以聽取選擇更改的事件,並在需要時嘗試重置它,但這感覺有點像黑客一樣,因爲我必須記住選擇更改事件之前的當前選擇。有沒有人有比這更好的建議?
我在Winforms應用程序中有一個多行文本框,我希望能夠在應用程序的某些狀態下單擊而不更改文本選擇。C#Winforms抑制文本框上的鼠標單擊事件
我還想訂閱MouseDown(或Click)事件,我只是不想讓文本選擇對它做出反應。
我希望MouseEventArgs上的Handled或Cancel屬性,但很遺憾,沒有。
我可以聽取選擇更改的事件,並在需要時嘗試重置它,但這感覺有點像黑客一樣,因爲我必須記住選擇更改事件之前的當前選擇。有沒有人有比這更好的建議?
您可以創建自己的文本框繼承System.Windows.Forms.Textbox,然後重寫WndProc。
WndProc是接收有關操作系統,電源消息,輸入等所有內容的消息的初始方法。該方法的名稱是Win32(和Win16)天的倒退,其中兩個主要函數之一你會實現的是「WndProc」或Windows程序。
通過這樣做,您現在可以在事件被分派到基礎實現之前攔截鼠標(或任何其他消息)的窗口消息。
在下面的例子中,我們不會傳遞任何Left按鈕,向上或雙擊要處理的基本控件。
public partial class MyTextBox : TextBox
{
int WM_LBUTTONDOWN = 0x0201; //513
int WM_LBUTTONUP = 0x0202; //514
int WM_LBUTTONDBLCLK = 0x0203; //515
public MyTextBox()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_LBUTTONDOWN ||
m.Msg == WM_LBUTTONUP ||
m.Msg == WM_LBUTTONDBLCLK // && Your State To Check
)
{
//Dont dispatch message
return;
}
//Dispatch as usual
base.WndProc(ref m);
}
}
只剩下要做的事情是添加檢查你的狀態,以確定何時傳遞消息或不。
您可以找到要處理here的Windows消息列表。
在上面覆蓋一層透明面板。
如何處理Enter
事件並將焦點設置爲此事件中的其他控件?儘管如此,仍然非常「黑客般」,只需較少的代碼。
這很醜陋,但它似乎起作用,我只需要將我的功能移到enter事件後,我將注意力集中在一個虛擬空標籤上。儘管如此,我不會接受這個答案,除非我沒有得到更好的建議,謝謝 – johnc 2009-07-08 04:16:20
我也考慮過這個,但感覺同樣如此。無論如何,可能比回滾選擇更改事件更簡單,儘管 – johnc 2009-07-08 04:01:50
是透明的,因爲BackColor似乎不起作用。我可能會錯過一些東西 – johnc 2009-07-08 04:05:20