修复控件不可单击区域(当BorderStyle为Fixed3D时)
本文关键字:BorderStyle Fixed3D 区域 控件 单击 | 更新日期: 2023-09-27 18:27:33
编辑
这似乎是任何面板的问题(尽管不是每个控件)。相应地更改了标题。但问题主要在于SplitContainer
,因为存在内部不可擦除区域。
原件:
在以下情况下,SplitContainer中存在一个忽略事件的区域:
- 创建一个
SplitContainer
,为了安全起见,设置其(及其面板)填充并将边距设置为0 - 将它们全部订阅到Click事件处理程序
- 我在那个处理程序中放入了
System.Media.SystemSounds.Asterisk.Play();
- 现在针对问题的原因:设置
BorderStyle = 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