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);
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现win32 textbox的重画并支持垂直居中,可以通过以下步骤实现: 1. 在窗口过程函数中处理WM_CTLCOLORSTATIC消息,该消息会在文本框控件被创建或重画时发送。 2. 在该消息处理中,获取文本框的句柄,并设置文本框的背景颜色和文本颜色。同时,返回一个画刷句柄,用于绘制文本框的背景。 3. 在WM_PAINT消息中,使用GetClientRect获取文本框的客户区矩形,并计算出文本框中文本的垂直居中位置。 4. 使用DrawText函数绘制文本框中的文本,设置绘制参数时,使用DT_SINGLELINE和DT_VCENTER参数实现文本的垂直居中。 下面是一个示例代码: ``` // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { // 创建文本框控件 HWND hTextbox = CreateWindowEx(0, L"EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE, 0, 0, 100, 100, hwnd, (HMENU)IDC_TEXTBOX, GetModuleHandle(NULL), NULL); // 设置文本框字体 HFONT hFont = CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, L"Arial"); SendMessage(hTextbox, WM_SETFONT, (WPARAM)hFont, TRUE); break; } case WM_CTLCOLORSTATIC: { // 获取文本框句柄 HWND hTextbox = (HWND)lParam; // 设置文本框背景颜色和文本颜色 SetBkColor((HDC)wParam, RGB(255, 255, 255)); SetTextColor((HDC)wParam, RGB(0, 0, 0)); // 返回画刷句柄,用于绘制文本框背景 return (LRESULT)GetStockObject(WHITE_BRUSH); } case WM_PAINT: { // 获取文本框客户区矩形 RECT rect; GetClientRect(GetDlgItem(hwnd, IDC_TEXTBOX), &rect); // 计算文本垂直居中位置 int textHeight = rect.bottom - rect.top; HFONT hFont = (HFONT)SendMessage(GetDlgItem(hwnd, IDC_TEXTBOX), WM_GETFONT, 0, 0); LOGFONT lf = { 0 }; GetObject(hFont, sizeof(LOGFONT), &lf); int fontSize = lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight - lf.lfHeight / 4; textHeight -= fontSize; // 绘制文本 HDC hdc = GetDC(GetDlgItem(hwnd, IDC_TEXTBOX)); TCHAR text[256] = L"Hello, World!"; DrawText(hdc, text, -1, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER); ReleaseDC(GetDlgItem(hwnd, IDC_TEXTBOX), hdc); break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值