修复控件不可单击区域(当BorderStyle为Fixed3D时)

本文关键字:BorderStyle Fixed3D 区域 控件 单击 | 更新日期: 2023-09-27 18:27:33

编辑

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

原件

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

  1. 创建一个SplitContainer,为了安全起见,设置其(及其面板)填充并将边距设置为0
  2. 将它们全部订阅到Click事件处理程序
  3. 我在那个处理程序中放入了System.Media.SystemSounds.Asterisk.Play();
  4. 现在针对问题的原因:设置BorderStyle = BorderStyle.Fixed3D

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

如何修复(当然,不改变边框样式)?

修复控件不可单击区域(当BorderStyle为Fixed3D时)

您可以从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_LBUTTONUP 更改WM_LBUTTONDOWN