【问题标题】:Fix Control unclickable area (when BorderStyle is Fixed3D)修复 Control 不可点击区域(当 BorderStyle 为 Fixed3D 时)
【发布时间】:2014-10-23 07:40:43
【问题描述】:

编辑

这似乎是任何面板的问题(尽管不是每个控件)。相应地更改了标题。但问题主要在于SplitContainer,因为有一个内部不可点击的区域。

原创

在以下情况下,SplitContainer 中存在一个忽略事件的区域:

  1. 创建一个SplitContainer 并为安全措施设置其(及其 Panels') 填充和边距为 0。
  2. 将它们全部订阅到 Click 事件处理程序。
  3. 我将System.Media.SystemSounds.Asterisk.Play(); 放入该处理程序中。
  4. 现在是什么导致问题:设置BorderStyle = BorderStyle.Fixed3D

现在,当点击大部分区域时,可以听到声音,但在面板和分离器之间的边界上 - 没有。

如何解决这个问题(当然,不改变 BorderStyle)?

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

您可以从WM_SETCURSOR消息中查看鼠标是否在边框中:

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (m.Msg == 0x0020) //WM_SETCURSOR
    {
        //wParam is the window handle where the cursor is over
        if ( m.WParam == splitContainer1.Panel1.Handle || m.WParam == splitContainer1.Panel2.Handle )
        {
            if ( ((int)m.LParam & 0xFFFF) == 18 ) //low 16bits of lParam -> HTBORDER
                if ( (((int)m.LParam & 0xFFFF0000) >> 16) == 0x0201) //hight 16bits -> WM_LBUTTONDOWN 
                {
                    //mouse is down
                }
            }
        }
    }
}

如果您想查看click event,请将WM_LBUTTONDOWN 更改为WM_LBUTTONUP

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2014-11-11
    • 1970-01-01
    相关资源
    最近更新 更多