WM_NCCALCSIZE引发的问题
我重写了窗口的CreateParams方法
具体含义就是0x20000=允许任务栏点击窗口标签最大化最小化窗口
0x00040000表示具有一个厚边框,具体厚度应该是上下左右各6个像素
之后我在WndProc里拦截了WM_NCCALCSIZE消息,使这6个像素的边框不被系统重绘出来,使整个界面看起来是无边框的界面,且能让系统按照有边框窗口运行,让窗口能够接收到有边框窗口的消息
但是引发了一些问题,就是当我在任务栏点击窗口标签使界面显示或者最小化的时候,当窗口重新显示,窗口的高度和宽度会自动增加,增加的高度和宽度看起来应该是6*2个像素,好像我拦截了WM_NCCALCSIZE消息后,系统自动把上下边框,左右边框都追加到了下边和右边一样,百思不得其解,最后我在网上找了下方法,看到有人这么说:
RECT 结构:
NCCALCSIZE_PARAMS 结构:
AdjustClientRect方法:
但是最终运行起来还是会在每次点击任务栏标签时自动增加窗口宽高,实在没有办法,忘请大神赐教,Win32的Api实在一时难懂
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实在一时难懂
...全文
相关推荐
DUILIB 修改WM_PAINT来实现不规则窗体源码及示例
DUILIB 修改WM_PAINT来实现不规则窗体源码及示例
MFC界面美化实战:非客户区自绘实现MDI与SDI全面统一风格
MFC界面美化不仅是套用皮肤库,更涉及对窗口绘制机制的深度掌握。Windows窗口分为客户区与非客户区,系统默认绘制的标题栏、边框等往往与整体深色主题格格不入,导致视觉割裂。通过拦截WM_NCCALCSIZE、WM_NCPAINT和WM_NCACTIVATE等核心消息,开发者可以接管非客户区的绘制逻辑,实现自定义标题栏、菜单和MDI子窗口背景的无缝融合。这种方案不依赖第三方库,基于纯Win32/MFC自绘机制,灵活性和可控性最佳。本文从基础消息原理讲起,逐步深入到MDI与SDI框架差异、控件细节统一、DPI
MFC对话框标题栏的隐藏和高度设置
该示例演示MFC对话框的标题栏隐藏、显示和高度、边框的调整。
禁用关闭按钮 c++/cli
通过API实现窗体关闭按钮禁用。但是还是显示。很简单。 c++/cli
MFC非客户区完美自绘
MFC对话框非客户去完美自绘,支持对话框不同风格,供大家学习交流


