Добавление строки состояния в CDialog и правильная установка позиций управления - PullRequest
0 голосов
/ 01 июля 2018

Итак, у меня есть ресурс CDialog, который у меня есть долгое время, и я решил добавить в него строку состояния. Вот ресурс:

Resource

Все элементы управления хорошо вписываются в диалог. Теперь во время выполнения это выглядит так:

Results

Урок, которому я следовал, был здесь , и по большей части он работает. Вот мой установочный код:

///////////////////////////////
m_StatusBar.Create(this); //We create the status bar

m_StatusBar.SetIndicators(indicators, 2); //Set the number of panes 

CRect rect;
GetClientRect(&rect);
//Size the two panes
m_StatusBar.SetPaneInfo(0, ID_INDICATOR_DATE,
    SBPS_NORMAL, 200);
m_StatusBar.SetPaneInfo(1, ID_INDICATOR_MEETING_TYPE, SBPS_STRETCH, 0);

//This is where we actually draw it on the screen
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,
    ID_INDICATOR_DATE);
GetDynamicLayout()->AddItem(m_StatusBar.GetSafeHwnd(), 
    CMFCDynamicLayout::MoveVertical(100), CMFCDynamicLayout::SizeHorizontal(100));
///////////////////////////////

Я пробовал без WindowsBlinds, и проблемы все еще существуют.

Итак, мои проблемы:

1 / Элементы управления перекрывают строку состояния. Как правильно установить эти элементы управления в редакторе ресурсов, чтобы эта проблема не возникала? Как это должно быть решено? Хит мисс?

2 / Мой диалог поддерживает изменение размера с помощью динамических макетов и имеет OBM_SIZE в правом нижнем углу:

void CResizingDialog::InitialiseResizeIcon(CBitmap& rBmpResize, CStatic& rLblResize, CWnd* pDialog)
{
    CRect rcIcon, rcClient;

    if (pDialog != nullptr)
    {
        rBmpResize.LoadOEMBitmap(OBM_SIZE);
        rLblResize.Create(nullptr, WS_CHILD | WS_VISIBLE | SS_BITMAP,
            CRect(0, 0, 16, 16), pDialog, IDC_STATIC_RESIZE);
        rLblResize.SetBitmap(rBmpResize);

        pDialog->GetClientRect(rcClient);
        rLblResize.GetClientRect(rcIcon);
        rLblResize.SetWindowPos(&CWnd::wndTop,
            rcClient.right - rcIcon.Width(),
            rcClient.bottom - rcIcon.Height(), 0, 0, SWP_NOSIZE);

        CMFCDynamicLayout *pDynamicLayout = pDialog->GetDynamicLayout();
        if (pDynamicLayout != nullptr)
        {
            CMFCDynamicLayout::MoveSettings moveSettings = CMFCDynamicLayout::MoveHorizontalAndVertical(100, 100);
            CMFCDynamicLayout::SizeSettings sizeSettings = CMFCDynamicLayout::SizeNone();

            pDynamicLayout->AddItem(rLblResize.GetSafeHwnd(), moveSettings, sizeSettings);
        }
    }
}

Как мне избежать проблемы, которую вы видите сейчас внизу справа?

Обновление

Похоже, я должен использовать CreateEx И использовать этот стиль SBARS_SIZEGRIP. Тогда прекратите создавать мою собственную иконку изменения размера. Я предполагаю, что два захвата будут выглядеть одинаково. Так что это может быть одним из ответов.

Я пытался использовать вышеуказанный флаг, но, к сожалению, я не могу его использовать:

Gripper in stabusbar

Этот захват не совместим с другим, который я использую, поэтому вместо него мне нужно сохранить свой оригинальный.

Обновление 2

Теперь я понимаю, что захват всегда создается в любом случае, поэтому у меня там было два захватчика! Теперь я получил свой собственный класс строки состояния и отключил захват по умолчанию:

BOOL CCreateReportStatusBar::PreCreateWindow(CREATESTRUCT& cs)
{
    BOOL bRet = CStatusBar::PreCreateWindow(cs);
    cs.style &= ~SBARS_SIZEGRIP;

    return bRet;
}

Так что теперь у меня есть только один захват. Но мои две проблемы все еще остаются.

Обновление 3

Я наткнулся на это . Теоретически, если я переопределю этот DrawGripper метод, я смогу вместо этого визуализировать свой собственный захват. Не работает Метод никогда не вызывается.

Обновление 4

Я решил не бороться с системой. Я позволил статусу «bardraw» захватить темы, и я настроил свой диалоговый класс по изменению размера так, чтобы он также рисовал захват тем. Так что все хорошо.

...