我在Winforms应用程序上有一个多行文本框,我希望能够在应用程序的某些状态下单击而不更改文本选择。
我仍然想订阅MouseDown(或Click)事件,我只是不希望文本选择对它作出反应。
我希望在MouseEventArgs上有一个Handled或Cancel属性,但遗憾的是,没有。
我可以听取选择更改事件并尝试在需要时重置它,但这感觉有点像黑客一样,因为我必须在选择更改事件之前记住当前选择。有谁有比这更好的建议?
答案 0 :(得分:9)
您可以创建自己继承自System.Windows.Forms.Textbox的文本框,然后覆盖WndProc。
WndProc是接收来自操作系统,电源消息,输入等所有内容的消息的初始方法。该方法的名称是对Win32(和Win16)日的回归,其中两个主要功能之一是你实施的是“WndProc”或Windows程序。
通过这样做,您现在可以在将事件分派到基本实现之前拦截鼠标(或任何其他消息)的Windows消息。
在下面的示例中,我们不会将任何“向左”按钮向下,向上或双击传递给基本控件进行处理。
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消息列表。
答案 1 :(得分:1)
如何处理Enter
事件并将焦点设置为此事件中的其他控件?尽管如此,仍然非常“类似黑客”。只需少量代码。
答案 2 :(得分:0)
将透明面板叠放在其上方。