Добавление строки состояния в CDialog и правильная установка позиций управления

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

Ресурс

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

Результаты

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

///////////////////////////////
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, Тогда прекратите создавать мою собственную иконку изменения размера. Я предполагаю, что два захвата будут выглядеть одинаково. Так что это может быть одним из ответов.

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

Захват в stabusbar

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

Обновление 2

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

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

    return bRet;
}

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

Обновление 3

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

Обновление 4

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

0 ответов

Другие вопросы по тегам