您的位置:首页 > 其它

CEdit重绘垂直居中显示

2014-03-03 10:15 288 查看
原文:http://stackoverflow.com/questions/867207/how-can-we-vertically-align-text-in-edit-box

/// HEADER //////////////////////////////////////////

class CEditVC : public CEdit

{

public:

    CEditVC();

protected:

    CRect m_rectNCBottom;

    CRect m_rectNCTop;

public:

    virtual ~CEditVC();

protected:

    afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);

    afx_msg void OnNcPaint();

    afx_msg UINT OnGetDlgCode();

    DECLARE_MESSAGE_MAP()

};

/// IMPLEMENTATION /////////////////////////////////////////

CEditVC::CEditVC()

    : m_rectNCBottom(0, 0, 0, 0)

    , m_rectNCTop(0, 0, 0, 0)

{

}

CEditVC::~CEditVC()

{

}

BEGIN_MESSAGE_MAP(CEditVC, CEdit)

    ON_WM_NCCALCSIZE()

    ON_WM_NCPAINT()

    ON_WM_GETDLGCODE()

END_MESSAGE_MAP()

void CEditVC::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 

{

    CRect rectWnd, rectClient;

    //calculate client area height needed for a font

    CFont *pFont = GetFont();

    CRect rectText;

    rectText.SetRectEmpty();

    CDC *pDC = GetDC();

    CFont *pOld = pDC->SelectObject(pFont);

    pDC->DrawText("Ky", rectText, DT_CALCRECT | DT_LEFT);

    UINT uiVClientHeight = rectText.Height();

    pDC->SelectObject(pOld);

    ReleaseDC(pDC);

    //calculate NC area to center text.

    GetClientRect(rectClient);

    GetWindowRect(rectWnd);

    ClientToScreen(rectClient);

    UINT uiCenterOffset = (rectClient.Height() - uiVClientHeight) / 2;

    UINT uiCY = (rectWnd.Height() - rectClient.Height()) / 2;

    UINT uiCX = (rectWnd.Width() - rectClient.Width()) / 2;

    rectWnd.OffsetRect(-rectWnd.left, -rectWnd.top);

    m_rectNCTop = rectWnd;

    m_rectNCTop.DeflateRect(uiCX, uiCY, uiCX, uiCenterOffset + uiVClientHeight + uiCY);

    m_rectNCBottom = rectWnd;

    m_rectNCBottom.DeflateRect(uiCX, uiCenterOffset + uiVClientHeight + uiCY, uiCX, uiCY);

    lpncsp->rgrc[0].top +=uiCenterOffset;

    lpncsp->rgrc[0].bottom -= uiCenterOffset;

    lpncsp->rgrc[0].left +=uiCX;

    lpncsp->rgrc[0].right -= uiCY;

}

void CEditVC::OnNcPaint() 

{

    Default();

    CWindowDC dc(this);

    CBrush Brush(GetSysColor(COLOR_WINDOW));

    dc.FillRect(m_rectNCBottom, &Brush);

    dc.FillRect(m_rectNCTop, &Brush);

}

UINT CEditVC::OnGetDlgCode() 

{

    if(m_rectNCTop.IsRectEmpty())

    {

    SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);

    }

    return CEdit::OnGetDlgCode();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息