WM_NCCALCSIZE引发的问题

石岩Maple 石岩Maple 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我重写了窗口的CreateParams方法

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style = cp.Style | 0x20000 | 0x00040000;//允许最小化操作;
return cp;
}
}

具体含义就是0x20000=允许任务栏点击窗口标签最大化最小化窗口
0x00040000表示具有一个厚边框,具体厚度应该是上下左右各6个像素
之后我在WndProc里拦截了WM_NCCALCSIZE消息,使这6个像素的边框不被系统重绘出来,使整个界面看起来是无边框的界面,且能让系统按照有边框窗口运行,让窗口能够接收到有边框窗口的消息

但是引发了一些问题,就是当我在任务栏点击窗口标签使界面显示或者最小化的时候,当窗口重新显示,窗口的高度和宽度会自动增加,增加的高度和宽度看起来应该是6*2个像素,好像我拦截了WM_NCCALCSIZE消息后,系统自动把上下边框,左右边框都追加到了下边和右边一样,百思不得其解,最后我在网上找了下方法,看到有人这么说:

if (m.WParam != IntPtr.Zero)
{
NCCALCSIZE_PARAMS rcsize = (NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(NCCALCSIZE_PARAMS));
AdjustClientRect(ref rcsize.rcNewWindow);
Marshal.StructureToPtr(rcsize, m.LParam, false);
}
else
{
RECT rcsize = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
AdjustClientRect(ref rcsize);
Marshal.StructureToPtr(rcsize, m.LParam, false);
}


RECT 结构:

public struct RECT
{
public int Left; //最左坐标
public int Top; //最上坐标
public int Right; //最右坐标
public int Bottom; //最下坐标
}


NCCALCSIZE_PARAMS 结构:

struct NCCALCSIZE_PARAMS
{
public RECT rcNewWindow;
public RECT rcOldWindow;
public RECT rcClient;
IntPtr lppos;
}


AdjustClientRect方法:

private void AdjustClientRect(ref RECT rc)
{
rc.Left += 6;
rc.Right -= 6;
rc.Top += 6;
rc.Bottom -= 6;
}


但是最终运行起来还是会在每次点击任务栏标签时自动增加窗口宽高,实在没有办法,忘请大神赐教,Win32的Api实在一时难懂
...全文

相关推荐

评论 11
收藏 已收藏
分享
返回顶部
石岩Maple
C# 111,128 成员 642,537 内容