如何在编辑控件中垂直居中文本?

问题描述 投票:0回答:1

尝试在编辑控件(Win32 API,纯 C,无 MFC)中垂直居中/对齐文本,但没有成功。尝试了其他答案的解决方案,例如 this onethis 以及其他相当古老的论坛,但没有运气:

我可以降低控件的高度,但这只是一种解决方法。我不想让它成为多行。创建控件的代码:

CreateWindowW(L"Edit", NULL,
    WS_CHILD | WS_VISIBLE | WS_BORDER,
    MulDiv(LOWORD(units),  50, 4), 0,
    MulDiv(LOWORD(units), 150, 4),
    MulDiv(HIWORD(units),  14, 8),
    hwnd, NULL, NULL, NULL);

问题:是否真的没有办法垂直对齐文本?

c winapi controls edit hwnd
1个回答
2
投票

使用

WS_BORDER
样式打开垂直对齐。如果您想避免边框框,您应该通过
SetWindowLongPtr
对该控件进行子类化,并在
WM_PAINT
中重新绘制边框。

我不知道为什么,但
WS_BORDER
现在对我不起作用。

HWND hEdit = CreateWindow(WC_EDIT, NULL, ES_CENTER | ES_AUTOHSCROLL | WS_VISIBLE | WS_CHILD | WS_BORDER, 5, 5, 100, 100, hWnd, (HMENU)IDC_EDIT, GetModuleHandle(0), NULL);
SetProp(hEdit, TEXT("WNDPROC"), (HANDLE)SetWindowLongPtr(hEdit, GWLP_WNDPROC, (LONG_PTR)cbNewEdit));
...
LRESULT CALLBACK cbNewEdit(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    WNDPROC cbDefault = (WNDPROC)GetProp(hWnd, TEXT("WNDPROC"));
            
    switch(msg) {
        // Overwrite black border
        case WM_PAINT:
        case WM_NCPAINT: {
            cbDefault(hWnd, msg, wParam, lParam);
            
            RECT rc;
            GetWindowRect(hWnd, &rc);
            OffsetRect(&rc, -rc.left, -rc.top);
            HDC hDC = GetWindowDC(hWnd);
            HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
            HPEN oldPen = SelectObject(hDC, hPen);
            SelectObject(hDC, GetStockObject(NULL_BRUSH));
            Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
            SelectObject(hDC, oldPen);
            DeleteObject(oldPen);
            ReleaseDC(hWnd, hDC);
            return 0;
        }
        break;  
    
        ...

        case WM_DESTROY: {
            RemoveProp(hWnd, TEXT("WNDPROC"));
        }
        break;
    }

    return CallWindowProc(cbDefault, hWnd, msg, wParam, lParam);
}
© www.soinside.com 2019 - 2024. All rights reserved.