c# - 自定义 WndProc 不会停止调整大小
问题描述
我制作了一个处理 WM_CREATE、WM_ACTIVATE、WM_NCCALCSIZE 和 WM_NCHITTEST 的表单。它还覆盖了paint方法。
问题是当我调整表单大小时,它不会停止调整大小。我试图将消息与工作窗口进行比较,但 spy++ 不断崩溃。这是我的 WndProc 代码:
protected override void WndProc(ref Message m)
{
IntPtr result = IntPtr.Zero;
bool callDWP = !Win32Interop.DwmDefWindowProc(m.HWnd, m.Msg, m.WParam, m.LParam, out result);
switch (m.Msg)
{
case Win32Messages.WM_CREATE:
{
int style = Win32Interop.GetWindowLong(m.HWnd, Win32Constants.GWL_STYLE);
int styleEx = Win32Interop.GetWindowLong(m.HWnd, Win32Constants.GWL_EXSTYLE);
Win32Interop.AdjustWindowRectEx(out RECT rc, style, false, styleEx);
}
break;
case Win32Messages.WM_ACTIVATE:
{
MARGINS margins = new MARGINS
{
cxLeftWidth = Math.Abs(BorderLeft),
cxRightWidth = Math.Abs(BorderRight),
cyBottomHeight = Math.Abs(BorderBottom),
cyTopHeight = Math.Abs(BorderTop)
};
int hr = Win32Interop.DwmExtendFrameIntoClientArea(m.HWnd, ref margins);
result = IntPtr.Zero;
}
break;
case Win32Messages.WM_NCCALCSIZE:
{
if (m.WParam != IntPtr.Zero)
{
result = IntPtr.Zero;
callDWP = false;
}
}
break;
case Win32Messages.WM_NCHITTEST:
{
{
int ht = DoHitTest(m);
Console.WriteLine(ht);
if (callDWP)
{
callDWP = (ht == Win32Constants.HTNOWHERE);
result = new IntPtr(ht);
}
}
break;
}
default:
{
base.WndProc(ref m);
break;
}
}
m.Result = result;
if (callDWP)
{
base.WndProc(ref m);
}
}
解决方案
不base.WndProc(ref m);
默认调用
推荐阅读
- mongodb - 返回包含元素存在的所有对象数组的文档
- xcode - 使用 Applovin SDK 和 Google Admob 中介构建时如何修复“没有此类文件或目录”警告
- android - 我想通过android中的编程知道任何聊天应用程序的打开日期和时间
- javascript - 如何在javascript中访问循环外的变量
- php - 如何在三元条件下添加 2 个参数 - PHP?
- ruby-on-rails - Rails 无法连接到本地安装的 firebird db
- mysql - mysql 中获取最新时间员工列表的最佳查询是什么?
- jira - 在流程设计中将步骤命名为任务与状态
- slam - MRPT SLAM MRPT::slam::CMetricMapBuilderICP 警告 姿势外推失败
- ruby-on-rails - 日期格式在 excel 中被识别为自定义而不是日期,其中 excel 表是使用 ruby on rails 框架生成的