【问题标题】:How to make a form's area not clickable without disabling its controls如何在不禁用其控件的情况下使表单区域不可点击
【发布时间】:2015-04-06 03:57:15
【问题描述】:

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

【问题讨论】:

  • 你不能......只是创建一个事件并根据你的需要连接它......
  • 你能说得清楚一点吗?在这个表单的区域内,我有不同类型的控件。当条件为真时,我需要所有这些控件都不能被用户使用,但我不想禁用它们,因为我不想要“禁用的油漆”风格”。

标签: vb.net winforms


【解决方案1】:

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

例如此示例仅适用于直接的 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);
    }
}

【讨论】:

  • 我的朋友是 C#,不是 VB.NET。
  • @ Loathing :您的代码部分工作。这很奇怪,但除了 Textboxes 和 DatetimePicker 保持可点击和可编辑之外,所有控件都变得不可点击。为什么?
  • @alex 在NW 您可以将测试更改为if (Msg != WM_PAINT) return; 其中const int WM_PAINT = 0xF; 这将使其无法输入控件。确保您获得所有嵌套的子控件也,例如stackoverflow.com/questions/8595425/…
  • 对不起,同样的情况。 TextBoxes 和 DatetimePicker 保持可点击和可编辑。现在随着您的更改,有时在某些按钮中,当控件变得不可点击时,文本会丢失。此外,我确定我已经包含了所有控件,因为我做了一个断点,并且我检测到包含文本框和 datetimepicker。
  • 我想是WM_SETFOCUS。
【解决方案2】:

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

panel.Enabled=false;

【讨论】:

  • 如果我禁用面板,里面的所有控件都将被禁用。将具有禁用的绘制样式。我不想要这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2016-01-05
  • 1970-01-01
  • 2020-08-14
  • 2011-10-17
  • 1970-01-01
相关资源
最近更新 更多