尝试在编辑控件(Win32 API,纯 C,无 MFC)中垂直居中/对齐文本,但没有成功。尝试了其他答案的解决方案,例如 this one 或 this 以及其他相当古老的论坛,但没有运气:
我可以降低控件的高度,但这只是一种解决方法。我不想让它成为多行。创建控件的代码:
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);
问题:是否真的没有办法垂直对齐文本?
使用
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);
}