2009-05-15 15 views
7

Ich habe ein Bearbeitungsfeld erstellt als:Wie können wir den Text im Bearbeitungsfeld vertikal ausrichten?

m_EditWnd.Create(m_hWnd, rect, NULL, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | 
            WS_OVERLAPPED | WS_VISIBLE, 
       WS_EX_CLIENTEDGE | WS_EX_LEFT | WS_EX_LTRREADING); 

Es gibt einen Stil für die horizontale Ausrichtung als ES_CENTER für horizontale Textausrichtung, aber können wir Text vertikal zentriert ausrichten?

Antwort

0

ist es nicht möglich, soweit ich weiß. Aber Sie können Ihre eigene Kontrolle implementieren, um es zu ermöglichen.

Werfen Sie einen Blick auf this article.

Ich hoffe, es hilft.

BTW, das ist die Art von Frage, die es wert ist, vor dem Posten google. Sie können eine Menge solcher Dinge bereits im Internet finden.

+6

Eigentlich fragen Google-able Fragen erbt. Wir möchten, dass StackOverflow zu einer breiten und tiefen Sammlung von Programmierkenntnissen wird, einer "Wikipedia" der Programmierung. –

+0

Ich habe nicht gesagt, dass er seine Frage nicht auf dieser Seite veröffentlichen kann. Sogar ich denke, ich gab ihm einen guten Hinweis, um sein Problem zu lösen. Aber ich glaube wirklich, dass es keinen Sinn hat, nach einer Frage zu fragen, die schon hundert Mal beantwortet wurde. Ich interessiere mich nicht für den Ruf ... Ich lese gerade diese Seite, weil ich es genieße und mir helfen, mein Wissen zu verbessern. Aber ich glaube wirklich, dass ich hier keine negative Stimme verdiene. –

+0

Hören Sie StackOverflow Podcat # 53, beantworten Jeff und Joel ein Listener-Frage über einfache und leicht zu durchsuchende Fragen, indem wir sagen, dass wir ALLE Fragen wollen, damit wir ein nützliches Wissen von den Grundlagen bis zum Experten Thema entwickeln können. –

6

Hier ist eine Klasse, die ist sehr ermutigt CEdit und ermöglicht die vertikale Ausrichtung

/// 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(); 
} 
Verwandte Themen