1

以下のように CDialogBar 派生クラスがあります。同僚は、MFC はアラインメント フロー レイアウト コントロールを提供しないと私に言いました (2012 年には信じられないことがわかりました!)。私が示すように、私は OnSize 関数でそれをしなければなりませんでした:

//declaration of member variable
class CMyDialogBar : public CDialogBar
{
private:
    int m_old_cx;
    //...    
}


//the message map
BEGIN_MESSAGE_MAP(CMyDialogBar, CDialogBar)
    //...
    ON_WM_SIZE()
END_MESSAGE_MAP()    

//the implementation
void CMyDialogBar::OnSize(UINT nType, int cx, int cy)
{
    CDialogBar::OnSize(nType, cx, cy);

    if (!::IsWindow(this->GetSafeHwnd()))
        return;

    // align right Combo1 and its label
    CRect rc;
    CWnd *pWnd= this->GetDlgItem(IDC_COMBO1);
    if(pWnd)
    {
        pWnd->GetWindowRect(&rc);
        ScreenToClient(&rc);
        pWnd->MoveWindow(rc.left + cx - m_old_cx, rc.top ,rc.Width(), rc.Height());
    }

    pWnd= this->GetDlgItem(IDC_STATIC_COMBO_LABEL);
    if(pWnd)
    {
        pWnd->GetWindowRect(&rc);
        ScreenToClient(&rc);
        pWnd->MoveWindow(rc.left + cx - m_old_cx, rc.top ,rc.Width(), rc.Height());
    }


    m_old_cx= cx;
}

これが機能しているのを見た後でも、私はそれをあまり信用していません。私の質問は次のとおりです。右揃えのコントロールのより良い方法はありますか?

前もって感謝します、

セルジオ

4

1 に答える 1

2

2013 年になっても、あなたの同僚は正しいです。MFC にはコントロールの自動レイアウトはありません。

CodeProject によると、「Dialogs、Formviews、DialogBars、および PropertyPages のレイアウト マネージャー」:

「ダイアログを頻繁に使用し、サイズを変更したい場合は、サイズ変更後にダイアログ コントロールを自動的に配置するのに役立つ機能が MFC にないことに気付くでしょう。手動で行う必要があります。」

単純なダイアログの場合、ソリューションは問題ないと思います.OnSize()は手動でレイアウトを行うのに適した場所です. それ以外の場合は、上記で参照したような追加のレイアウト クラスや、数年後の "サイズ変更可能なダイアログの自動レイアウト" を検討する必要があります。

編集:
sergiols のコメントによると、Microsoftはこのブログ投稿で紹介されている Visual Studio 2015 の動的レイアウトを開発し、問題を処理しているようです。

于 2013-02-13T15:30:10.553 に答える