zoukankan      html  css  js  c++  java
  • 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;
    }

     字符高度的获取,使用下面的方法

    int GetFontHeigth(HWND hWnd){
        HFONT hFont = SendMessage(hWnd, WM_GETFONT, 0, 0);
        LOGFONT logFont; 
        GetObject(hFont, sizeof(LOGFONT), &logFont);
        return abs(logFont.lfHeight);
    }

    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(WHITE_BRUSH));
        Rectangle(hdc, 0, 0, rect.right, rect.bottom);
        DeleteObject(hPen);
        ReleaseDC(hWnd, hdc);    
    }

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

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

  • 相关阅读:
    《道德经》全文
    mysql 服务启动后停止
    安装docker-compose
    金刚般若波罗蜜经
    elasticsearch reIndex
    【基础篇】1.vim复制黏贴跳转
    新事物如何持续性发展
    舒服的状态
    教父
    关于拖延
  • 原文地址:https://www.cnblogs.com/zjsxdmif/p/10338072.html
Copyright © 2011-2022 走看看