计机羊咩咩 发表于 2014-8-18 12:02:36

客户区重设问题

此内容仅用于方便客户区布局

CreateWindow函数参数设置的大小为窗口宽度 包括客户区与非客户区
当窗口大小减去非客户区所占区域的结果不为偶数倍时 为了方便布局以及画面对称美观 应重设客户区大小
可用 MoveWindow和SetWindowPos两个函数重设窗口大小

void ChangeWinRect(HWND hwnd){
        RECT WinRect,ClientRect;
        int iHighGap,iWidthGap;
       
        GetWindowRect(hwnd,&WinRect);
        GetClientRect(hwnd,&ClientRect);
        iHighGap = (WinRect.bottom - WinRect.top) - (ClientRect.bottom - ClientRect.top);
        iWidthGap = (WinRect.right - WinRect.left) - (ClientRect.right - ClientRect.left);

        ClientRect.right += (iWidthGap * 2);
        ClientRect.bottom += (iHighGap * 2);
        MoveWindow(hwnd,WinRect.left,WinRect.top,
                ClientRect.right,ClientRect.bottom,FALSE);
}

以此为例
重设时应注意函数参数也是设置窗口大小并非客户区大小
故ClientRect.right和ClientRect.bottom应加上非客户区大小的两倍
或直接以 WinRect.right +iWidthGap和WInRect.buttom + iHighGap作为设置窗口大小的参数
否则窗口将保持原型或达不到预期结果

为避免使用时程序时不必要的误解
此函数应放在CreateWindow所发出的消息内执行   个人认为放在WM_CREATE消息内较好

仰望天上的光 发表于 2014-8-18 20:17:00

应该放在WM_SIZE里

计机羊咩咩 发表于 2014-8-19 09:20:47

仰望天上的光 发表于 2014-8-18 20:17
应该放在WM_SIZE里

放在哪得看情况
我这里只是想显示之前就改变大小 所以放在CREATE

irvine726 发表于 2014-8-21 15:33:24

谢谢分享

樱桃 发表于 2014-9-1 16:47:08

学了不少东西,感谢

OSKer 发表于 2014-10-5 18:19:20

感谢楼主分享

智商是硬伤 发表于 2015-8-18 08:30:22

{:7_146:}
页: [1]
查看完整版本: 客户区重设问题