Добавление строки состояния в 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
, Тогда прекратите создавать мою собственную иконку изменения размера. Я предполагаю, что два захвата будут выглядеть одинаково. Так что это может быть одним из ответов.
Я попытался использовать вышеуказанный флаг, но, к сожалению, я не могу его использовать:
Этот захват не согласуется с другим, который я использую, поэтому мне нужно сохранить исходный.
Обновление 2
Теперь я понимаю, что захват всегда создается, так что у меня там было два захвата! Теперь я получил свой собственный класс строки состояния и отключил захват по умолчанию:
BOOL CCreateReportStatusBar::PreCreateWindow(CREATESTRUCT& cs)
{
BOOL bRet = CStatusBar::PreCreateWindow(cs);
cs.style &= ~SBARS_SIZEGRIP;
return bRet;
}
Так что теперь у меня есть только один захват. Но мои две проблемы все еще остаются.
Обновление 3
Я наткнулся на это. В теории, если я переопределить это DrawGripper
метод я должен быть в состоянии сделать свой собственный захват вместо этого. Не работает Метод никогда не вызывается.
Обновление 4
Я решил не бороться с системой. Я позволил статусу "bardraw" захватить темы, и я настроил свой класс диалога изменения размера так, чтобы он также рисовал захват тем. Так что все хорошо.