MFC
CEdit エディットボックスを縦方向にセンタリングする


HomeProgramming TipsMFC Tips[MFC-026]

MFC の CEdit はなかなかよく考えられていて使いやすいです。
文字の表現についてもそれなりに用意されています。

が! なぜか横方向にはセンタリングの指定があるのに縦方向には無いですね。
無いならば擬似的に作り出してやるしかありません。

ここで必要になるのが CEdit のメンバである SetRect(), GetRect() です。
これは、複数行(MultiLine)用のメソッドですが、
クライアント領域内でのテキスト描画位置を取得、更新出来るという優れものです。
これを使って最初に表示される位置をセンタリングされた位置までずらしてやる事で
見かけ上、センタリングされているように変更します。

注意としてはリソースエディタでエディットボックスを貼り付けた後、
忘れずにスタイルを MultiLine = true に変更するという事でしょうか。
後からのスタイル変更は CEdit はとても困難です(事実上出来ません)。
どうしてもやりたければ一度破棄してから新しいスタイルで作り直す事になりますが、
そんな無駄な事をするぐらいなら最初から MultiLine スタイルを指定してやってください。


BOOL CFooDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // エディットボックスを縦方向にセンタリングする
    // ※ マルチラインエディットボックスのみ適用可能

    // エディットボックスのポインタを得る
    CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);

    // 各種範囲を取得する
    CRect rcClient, rcText;
    pEdit->GetClientRect(&rcClient);    // クライアント範囲
    pEdit->GetRect(&rcText);            // テキストに外接する範囲

    // 上下方向の隙間のサイズを取得する
    int nGapY = (rcClient.Height() - rcText.Height() + 1) / 2;

    // 隙間分 Y 方向を下にずらしたテキスト範囲に変更する
    rcText.MoveToY(nGapY);
    pEdit->SetRect(&rcText);

    return TRUE;
}




 Copyright 2008 VALGUS. All Rights Reserved.