VC Edit控件单行垂直居中和定制外框的实现

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);    
}

 这样,有定制边框的垂直居中文本就实现了。

如果不忍看空间原生的界面,试一试,几行的代码,不复杂。

猜你喜欢

转载自www.cnblogs.com/zjsxdmif/p/10338072.html
vc