如何在不禁用其控件的情况下使表单区域无法单击

时间:2015-04-06 03:57:16

标签: vb.net winforms

我在VB.net 2013中有一个Winform项目。 在表格上我有很多控件。 如果条件为真,我需要在特定表单区域内进行所有控件,而不是可点击(但不禁用它们) 当然,当条件变为假时,该区域应该恢复到正常状态。 谢谢!

2 个答案:

答案 0 :(得分:1)

您可以为每个控件分配NativeWindow并截取HITTEST消息。

E.g。此示例仅适用于直接Form's个孩子。你也可以通过所有的孩子来解决问题。

Form f = new Form();
f.Controls.Add(new Button { Text = "test test test "});
Form f2 = new Form();
CheckBox cb = new CheckBox { Text = "Toggle" };
f2.Controls.Add(cb);
List<NW> nws = null;
cb.CheckedChanged += delegate {
    if (nws == null) {
        nws = new List<NW>();
        foreach (Control c in f.Controls) {
            nws.Add(new NW(c.Handle));
        }
    }
    else {
        foreach (var nw in nws)
            nw.ReleaseHandle();
        nws = null;
    }
};
f.Show();
Application.Run(f2);


class NW : NativeWindow {
    public NW(IntPtr hwnd) {
        AssignHandle(hwnd);
    }
    const int WM_NCHITTEST = 0x84;
    protected override void WndProc(ref Message m) {
        if (m.Msg == WM_NCHITTEST)
            return;
        base.WndProc(ref m);
    }
}

答案 1 :(得分:0)

将所有控件放在PANEL中,然后禁用该面板。

panel.Enabled = false;