win32窗口的大小,居中,拖动

参考
https://www.cnblogs.com/findumars/p/3948315.html

不让调整大小

窗口风格设置,后面两个是最大最小化按钮
dwStyle^WS_THICKFRAME^WS_MAXIMIZEBOX^WS_MINIMIZEBOX

不让拖动

消息循环里添加

case WM_NCLBUTTONDOWN:
    {
        switch (wParam)
        {
        case HTCAPTION:
            return 0;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    }
    break;

窗口居中显示

1.设置窗口位置和大小

SetWindowPos(
    hWnd: HWND; 窗口句柄
    hWndInsertAfter: HWND或者一个UNIT; 窗口的 Z 顺序
    X, Y: Integer; 位置
    cx, cy: Integer; 大小
    uFlags: UINT 选项
): BOOL;

//hWndInsertAfter 参数可选值:
HWND_TOP = 0; 在前面,能用TOP就不要用TOPMOST,TOPMOST即使是不激活状态也会挡住别的激活的窗口
HWND_BOTTOM = 1; 在后面
HWND_TOPMOST = HWND(-1); 在前面, 位于任何顶部窗口的前面
HWND_NOTOPMOST = HWND(-2); 在前面, 位于其他顶部窗口的后面

//uFlags 参数可选值:
SWP_NOSIZE = 1; 忽略cx、cy,保持大小
SWP_NOMOVE = 2; 忽略X、Y,不改变位置
SWP_NOZORDER = 4; 忽略hWndInsertAfter,保持Z顺序
SWP_NOREDRAW = 8; 不重绘
SWP_NOACTIVATE = 0x10; 不激活
SWP_FRAMECHANGED = 0x20; 强制发送WM_NCCALCSIZE消息,一般只是在改变大小时才发送此消息
SWP_SHOWWINDOW = 0x40; 显示窗口
SWP_HIDEWINDOW = 0x80; 隐藏窗口
SWP_NOCOPYBITS = 0x100; 丢弃客户区
SWP_NOOWNERZORDER = 0x200; 忽略hWndInsertAfter,不改变Z序列的所有者
SWP_NOSENDCHANGING = 0x400; 不发出WM_WINDOWPOSCHANGING消息
SWP_DRAWFRAME = SWP_FRAMECHANGED; 画边框
SWP_NOREPOSITION = SWP_NOOWNERZORDER;
SWP_DEFERERASE = 0x2000; 防止产生WM_SYNCPAINT消息
SWP_ASYNCWINDOWPOS = 0x4000; 若调用进程不拥有窗口,系统会向拥有窗口的线程发出需求

2.获取窗口位置和大小

GetWindowRect(HWND hWnd, LPRECT lpRect );//获得窗口相对屏幕的大小
GetClientRect(HWND hWnd, LPRECT lpRect );//获得窗口相对客户区的大小
GetSystemMetrics(SM_CXSCREEN);//获取屏幕大小
GetSystemMetrics(SM_CYSCREEN);

你可能感兴趣的:(win32)