Элементы управления выравниванием MFC на CDialogBar - PullRequest
1 голос
/ 21 февраля 2012

У меня есть класс, производный от CDialogBar, который указан ниже. Коллега сказал мне, что MFC не предлагает управление компоновкой потока aligment (что я считаю чем-то невероятным в 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;
}

Даже увидев эту работу, я не очень ей доверяю. Поэтому мой вопрос: есть ли лучший способ правильного выравнивания элементов управления?

Заранее спасибо,

Сержио

1 Ответ

2 голосов
/ 13 февраля 2013

Даже в 2013 году ваш коллега прав: в MFC отсутствует автоматическая разметка элементов управления.

Согласно CodeProject " Диспетчер компоновки для диалогов, представлений форм, DialogBars и PropertyPages ":

" Если вы часто используете диалоги и хотите изменить их размер, вы заметите, что в MFC нет функции, которая бы помогала вам автоматически упорядочивать элементы управления диалоговым окном после изменения размера.hand. "

Для простых диалогов, я думаю, что ваше решение просто отлично, и OnSize () - правильное место для создания макета вручную.В противном случае вам придется взглянуть на дополнительные классы макетов, такие как классы, упомянутые выше, или « Автоматическая компоновка диалогов с изменяемым размером », которая на несколько лет моложе.

РЕДАКТИРОВАТЬ:
Согласно комментарию sergiols, Microsoft разработала Динамический макет для Visual Studio 2015, представленный в этом блоге , который, кажется, решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...