8

我在 C# 中使用 Windows 窗体。

我有一个带有几个工具栏的主窗体,其中包含 toolStripButtons。在使用另一个包含数据的表单后,主表单失去焦点并且单击 toolStripButton 不会触发 OnClick 事件:第一次单击激活主表单,只有第二次单击实际按下按钮。我需要用户只单击一次按钮来触发 Click 事件,关于如何做到这一点的任何想法?谢谢。

笔记:

  • 我使用的是 MDI,点击父表单按钮没有问题。但现在最重要的是让表格在多个显示器上自由浮动。
  • 工作人员表单将主表单作为 Owner 属性,这样它们就位于主表单之上。
  • 当我单击非活动表单的按钮时,MouseHover、MouseEnter、MouseDown 和 MouseUp 都不会触发。它只是触发主窗体的激活事件。
  • 主窗体上有一个树视图(在 tabControl 内、在 splitContainer 内、在面板内)。即使主窗体处于非活动状态,它的项目也会在第一次鼠标单击时被选中。我想不是所有的控制都是平等的!
4

2 回答 2

10

您需要做的是创建一个类来继承ToolStrip和处理WndProc. 这是一种方法。还有其他的。

private class MyToolStrip : ToolStrip
{
    private const uint WM_LBUTTONDOWN = 0x201;
    private const uint WM_LBUTTONUP   = 0x202;

    private static bool down = false;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONUP && !down)
        {
            m.Msg = (int)WM_LBUTTONDOWN;
            base.WndProc(ref m);
            m.Msg = (int)WM_LBUTTONUP;
        }

        if (m.Msg == WM_LBUTTONDOWN) down = true;
        if (m.Msg == WM_LBUTTONUP)   down = false;
        base.WndProc(ref m);
    }
}

我也看到了这个解决方案:

protected override void WndProc(ref Message m)
{
    // WM_MOUSEACTIVATE = 0x21
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused)
        this.Focus();
    base.WndProc(ref m);
}

我在我工作的最后一个地方遇到了这个问题,我认为我提出的解决方案更像后者,但我无法访问我使用的确切代码。

于 2011-08-04T19:35:46.510 回答
-4

如果你有无国界的表格,那么这个逻辑对你来说是内置的:)

form.FormBorderStyle = FormBorderStyle.None
于 2014-02-10T13:52:38.593 回答