非客户鼠标消息WM_NCLBUTTONDOWN收不到,为什么

linweifeng 2010-05-02 08:23:09
public partial class HeaderPanel : Panel
{
public HeaderPanel() : base()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCCALCSIZE:
WmNCCalcSize(ref m);
break;
case WM_NCPAINT:
IntPtr hDC = NativeUser32Api.GetWindowDC(m.HWnd);
if (hDC != IntPtr.Zero)
{
using (Graphics canvas = Graphics.FromHdc(hDC))
{
PaintNonClientArea(canvas);
}
NativeUser32Api.ReleaseDC(m.HWnd, hDC);
}
m.Result = IntPtr.Zero;
break;
case WM_NCMOUSEMOVE:
break;
case WM_NCLBUTTONDOWN:
break;
case (int)WindowMessages.WM_NCHITTEST:
break;
}
}
以上是自定义控件,画了一个非客户区,客户区能收到WM_NCHITTEST消息,为什么收不到WM_NCMOUSEMOVE和WM_NCLBUTTONDOWN非客户鼠标消息,请高手指教。
...全文
373 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqqkl 2012-11-11
  • 打赏
  • 举报
回复
引用 1 楼 ly302 的回复:
原因: 在WM_NCHITTEST中处理了鼠标消息,把他定位成HTCAPTION,也就是鼠标在标题栏上,而标题栏属于非客户区(NC); 非客户区的事件消息都是以WM_NC开头的。也就是说,当你的WM_NCHITTEST返回HTCAPTION时,原来可以用WM_LBUTTONUP处理的消息,你只能用WM_NCLBUTTONUP来处理。 解决: 同时处理……
你这个回答,给我了关于使用一种更优秀的解决下面问题的方法。 关于无法捕获WM_NCLBUTTONUP消息
linweifeng 2010-05-02
  • 打赏
  • 举报
回复
ZengHD点边框是有的,我调用WmNCCalcSize这个扩大了非客户区,在这个情况下点击不能收到
case WM_NCCALCSIZE:
WmNCCalcSize(ref m);在这个地方扩大了非客户区,


private void WmNCCalcSize(ref Message m)
{
if (m.WParam == FALSE)
{
RECT ncRect = (RECT)m.GetLParam(typeof(RECT));
Rectangle proposed = ncRect.Rect;
RecalcNonClientArea(ref proposed);
ncRect = RECT.FromRectangle(proposed);
Marshal.StructureToPtr(ncRect, m.LParam, true);
}
else if (m.WParam ==TRUE)
{
NCCALCSIZE_PARAMS ncParams =(NCCALCSIZE_PARAMS)m.GetLParam(typeof(NCCALCSIZE_PARAMS));
Rectangle proposed = ncParams.rectProposed.Rect;
RecalcNonClientArea(ref proposed);
ncParams.rectProposed = RECT.FromRectangle(proposed);
Marshal.StructureToPtr(ncParams, m.LParam, true);
}
m.Result = IntPtr.Zero;
}
myhotmail123 2010-05-02
  • 打赏
  • 举报
回复
去了解一下VC++的使用
ZengHD 2010-05-02
  • 打赏
  • 举报
回复
你也知道WM_NCLBUTTONDOWN是在非客户区按下左键时触发的
你的HeaderPanel的非客户区是什么?
你用下面的代码,把HeaderPanel加到窗体上,然后点击HeaderPanel的边框试试
 private void Form1_Load(object sender, EventArgs e)
{
HeaderPanel panel = new HeaderPanel();
panel.BorderStyle = BorderStyle.Fixed3D;
this.Controls.Add(panel);
}


linweifeng 2010-05-02
  • 打赏
  • 举报
回复
不是拖动,现在是自定义控件中我点了非客户区的WndProc函数中收不到WM_NCLBUTTONDOWN这个消息,在客户区点击了,能收到WM_LBUTTONDOWN这个消息,我现在为什么收不到非客户区的WM_NCLBUTTONDOWN这个消息。
ZengHD 2010-05-02
  • 打赏
  • 举报
回复
你要实现什么功能呢?
要想在拖住自定义控件能拖动窗体吗
linweifeng 2010-05-02
  • 打赏
  • 举报
回复
不明白,程序要怎么改,才能收到WM_NCLBUTTONDOWN这个消息,谢谢。
皇城龙三 2010-05-02
  • 打赏
  • 举报
回复
原因:

在WM_NCHITTEST中处理了鼠标消息,把他定位成HTCAPTION,也就是鼠标在标题栏上,而标题栏属于非客户区(NC);
非客户区的事件消息都是以WM_NC开头的。也就是说,当你的WM_NCHITTEST返回HTCAPTION时,原来可以用WM_LBUTTONUP处理的消息,你只能用WM_NCLBUTTONUP来处理。

解决:

同时处理WM_NCHITTEST和WM_NCRBUTTONUP,而不处理WM_RBUTTONUP

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧