解决方案 »

  1.   

    想知道到底拉哪里,重写 WndProc 拦截 WM_SIZING 消息
    这个消息在窗口变化之前触发
    wParam 共有 8 个方向,就是你关心的拉伸方向
    lParam 是一个结构,说明了将会拉成什么样子(其实就是左上右下的坐标)
    将 lParam 指向的结构修改,用 Marshal 封送回非托管内存能够影响窗口后续的 WM_SIZE 变化
    那么你只要自己计算大小修改 lParam 即可,窗口自然会依据你想要的样子变化
      

  2.   

    没有最大化和还原,只有拉伸,我是想在拉伸的过程中就长宽同时变化所以我在sizechanged里面这样写的this.width=convert.tostring(this.heght*3.24),这种情况下只能处理拉动窗口底部时等比变化不能
      

  3.   

    wParam 8个方向怎么判断呢?还有lParam,我对这块有点模糊
      

  4.   


    我试了一下8个方向我找到了,但lParam里面的参数我不理解不知道如何使用
      

  5.   

    大概是这样的吧,我这边没环境,手敲一下有错误你自己整理// 定义一个 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;
        }
    }