2009-05-15 18 views
7

Ho creato una casella di modifica come:Come possiamo allineare verticalmente il testo nella casella di modifica?

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

C'è uno stile per l'allineamento orizzontale ES_CENTER per l'allineamento orizzontale del testo, ma possiamo allineare il testo verticalmente centrato?

risposta

0

non è possibile per quanto ne so. Ma puoi attuare il tuo controllo per renderlo possibile.

Dai un'occhiata allo this article.

Spero che aiuti.

BTW, questo è il tipo di domanda che è degno di google prima di postare. Puoi trovare molte cose di questo tipo già nel web.

+6

In realtà, a fare domande Google-grado è fortemente incoraggiata. Vogliamo StackOverflow diventare un ampio e profondo repertorio di tutte le conoscenze di programmazione, una "Wikipedia" di programmazione. –

+0

Non ho detto che non può pubblicare la sua domanda in questa pagina. Anche io penso di aver dato un buon suggerimento per risolvere il suo problema. Ma penso davvero che non abbia senso chiedere una domanda che è già stata risposta centinaia di volte prima. Non mi interessa la reputazione ... Ho appena letto questo sito perché mi piace e mi aiuta a migliorare le mie conoscenze. Ma penso davvero che non meriti un voto negativo qui. –

+0

Ascoltare StackOverflow podcat # 53, Jeff e Joel rispondono a una richiesta dell'ascoltatore di fare domande di base, facili da cercare, dicendo che vogliamo TUTTE le domande in modo da poter sviluppare un corpus di conoscenze utili dalle basi fino agli argomenti degli esperti. –

6

Ecco una classe che eredita CEdit e permette l'allineamento verticale

/// 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(); 
} 
Problemi correlati