我的表单上有一个取消按钮。我想在WndProc
方法中确定单击此Cancel
按钮并为其编写一些代码。这是绝对必要的,否则我无法取消尚未执行的所有其他控制验证事件。
请帮忙。
.NET - 2.0,WinForms
答案 0 :(得分:5)
这是你可以解析WndProc消息左键单击子控件的方法:
protected override void WndProc(ref Message m)
{
// http://msdn.microsoft.com/en-us/library/windows/desktop/hh454920(v=vs.85).aspx
// 0x210 is WM_PARENTNOTIFY
// 513 is WM_LBUTTONCLICK
if (m.Msg == 0x210 && m.WParam.ToInt32() == 513)
{
var x = (int)(m.LParam.ToInt32() & 0xFFFF);
var y = (int)(m.LParam.ToInt32() >> 16);
var childControl = this.GetChildAtPoint(new Point(x, y));
if (childControl == cancelButton)
{
// ...
}
}
base.WndProc(ref m);
}
BTW:这是32位代码。
答案 1 :(得分:3)
如果有控件验证失败,则CauseValidation无效
嗯,确实如此,这就是该物业的目的。这是一个示例表单,用于显示此功能。删除表单上的文本框和按钮。请注意如何单击按钮以清除文本框,即使该框始终未通过验证。以及如何关闭表单。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
textBox1.Validating += new CancelEventHandler(textBox1_Validating);
button1.Click += new EventHandler(button1_Click);
button1.CausesValidation = false;
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
private void textBox1_Validating(object sender, CancelEventArgs e) {
// Always fail validation
e.Cancel = true;
}
void button1_Click(object sender, EventArgs e) {
// Your Cancel button
textBox1.Text = string.Empty;
}
void Form1_FormClosing(object sender, FormClosingEventArgs e) {
// Allow the form to close even though validation failed
e.Cancel = false;
}
}