【问题标题】:WinAPI - How to vertically center text in an edit control?WinAPI - 如何在编辑控件中垂直居中文本?
【发布时间】:2019-08-29 20:28:08
【问题描述】:

尝试在编辑控件(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);

问题真的没有办法垂直对齐文本吗?

【问题讨论】:

  • 不是直接的,但是你可以通过子类化编辑控件和处理WM_NCCALCSIZE来模拟它。 codeguru.com/cpp/v-s/devstudio_macros/textoperations/… 对于多行编辑控件,您可以使用 EM_SETRECT
  • @zett42 谢谢。看到一个类似的帖子,但那是 C++,我正在寻找 C 解决方案。
  • @supafly 使用纯 Win32 API,在 C++ 中工作的内容也将在 C 中工作,因为 Win32 API 是基于 C 的 API。
  • @RemyLebeau 好的,但我不明白如何在 C 程序中使用该 C++ 类。我还应该以某种方式使用 CreateWindowW 吗?我遇到的大多数 WinAPI 示例都是 100% C++。对于 C# 程序员来说,这有点晦涩。
  • @supafly "我不明白如何在 C 程序中使用那个 C++ 类" - 你不能在 C 中使用 C++ 类,除非你把它包装起来在 C 接口中,例如在 DLL 中。但是您可以在 C 中进行与 C++ 类相同的 Win32 API 调用。 “我还应该以某种方式使用 CreateWindowW 吗?” - 是的。 “我遇到的大多数 WinAPI 示例都是 100% C++”——仅当您正在查看基于 C++ 的框架(如 MFC、Qt 等)的示例时。请查看基于 C 的示例。周围有很多。甚至 Microsoft 记录的示例也是用 C 编写的,因为 Win32 API 是基于 C 的 API。

标签: c winapi controls edit hwnd


【解决方案1】:
HWND hEdit = CreateWindow(WC_EDIT, NULL, ES_CENTER | ES_AUTOHSCROLL | WS_VISIBLE | WS_CHILD | WS_BORDER, 0, 0, 0, 0, hWnd, (HMENU)IDC_EDIT, GetModuleHandle(0), NULL);
SetProp(hEdit, TEXT("WNDPROC"), (HANDLE)SetWindowLongPtr(hEdit, GWLP_WNDPROC, (LONG_PTR)cbNewEdit));
...
LRESULT CALLBACK cbNewFilterEdit(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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2012-11-13
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多