大概是这样的吧,我这边没环境,手敲一下有错误你自己整理// 定义一个 RECT 结构 public struct RECT { public int left; public int top; public int right; public int bottom; }WndProc() { switch (msg) { case WM_SIZING: RECT rect = Marshal.PtrToStructure(lParam, typeof(RECT)); // 根据 rect 里面的值计算一个新的 // 比如说修改底边的新位置,你不是要根据方向判断吗,那就看你想改哪个坐标了 rect.bottom = rect.top + (rect.right - rect.left) * 0.5; // 处理完了弄回去,会根据你的 rect 来改变窗口大小和位置 Marshal.StructureToPtr(lParam, rect); break; } }
这个消息在窗口变化之前触发
wParam 共有 8 个方向,就是你关心的拉伸方向
lParam 是一个结构,说明了将会拉成什么样子(其实就是左上右下的坐标)
将 lParam 指向的结构修改,用 Marshal 封送回非托管内存能够影响窗口后续的 WM_SIZE 变化
那么你只要自己计算大小修改 lParam 即可,窗口自然会依据你想要的样子变化
我试了一下8个方向我找到了,但lParam里面的参数我不理解不知道如何使用
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}WndProc()
{
switch (msg)
{
case WM_SIZING:
RECT rect = Marshal.PtrToStructure(lParam, typeof(RECT));
// 根据 rect 里面的值计算一个新的
// 比如说修改底边的新位置,你不是要根据方向判断吗,那就看你想改哪个坐标了
rect.bottom = rect.top + (rect.right - rect.left) * 0.5; // 处理完了弄回去,会根据你的 rect 来改变窗口大小和位置
Marshal.StructureToPtr(lParam, rect);
break;
}
}