Edit控件很奇怪,不在WM_PAINT里面画图,且外框也不在WM_NCPAINT里面画,客户区就是整个窗口,非客户区没有。也没有垂直居中风格可以设置。在界面排版的时候,看起来怪怪的。
下面提供Edit控件单行垂直居中和定制外框的实现。
1. 如果要定制外框,控件的风格不要包含WS_BORDER。
hWnd_text = CreateWindow(WC_EDIT, NULL, WS_CHILD | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, NULL, NULL);
2. 子类化控件的窗口处理函数。
SetWindowProc(hWnd_text, (WNDPROC) CPDFRetriever::TextWindowProc);
3. 响应WM_NCCALCSIZE消息,定制客户区,使文本居中
case WM_NCCALCSIZE: OnTextCalNCSize(((LPNCCALCSIZE_PARAMS) lParam)->rgrc); return 0; VOID OnTextCalNCSize(RECT * rect){ rect->left += 1; rect->top += (rect->bottom - rect->top - 13) / 2; // 13为字符高度 rect->bottom -= 1; rect->right -= 1; }
4. 响应WM_NCPAINT绘制边框
VOID DrawFrame(HWND hWnd){ RECT rect; GetWindowRect(hWnd, &rect); OffsetRect(&rect, -rect.left, -rect.top); HDC hdc = GetWindowDC(hWnd); HPEN hPen = CreatePen(PS_SOLID, 1, COLORFRAME); SelectObject(hdc, hPen); SelectObject(hdc, GetStockObject(NULL_BRUSH)); Rectangle(hdc, 0, 0, rect.right, rect.bottom); DeleteObject(hPen); ReleaseDC(hWnd, hdc); }
这样,有定制边框的垂直居中文本就实现了。
如果不忍看空间原生的界面,试一试,几行的代码,不复杂。