Как при растягивании ограничить min размер окна Dialog-based приложения?
void CSysbackupDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
................
CRect appRect;
const int x = 608; // ширина окна
const int y = 396; // высота окна
if ( cx <= x || cy <= y )
{
::GetWindowRect(m_hWnd, appRect);
::MoveWindow(m_hWnd, appRect.left, appRect.top, x, y, TRUE);
}
}
Получается достаточно криво. А вот как сделать по уму?
И еще вопрос: почему, если в коде указывать те размеры окна, что стоят в редакторе ресурсов диалога, то окно получится меньше?
Спасибо всем, кто поможет!
А вот как сделать по уму?
По уму диалоги не должны менять размеры (читаем Design Guidelines). Но если очень хочется то обрабатываем сообщение WM_GETMINMAXINFO (или пишем в OnGetMinMaxInfo() если под MFC) там в lParamе получаем указатель на структуру MINMAXINFO, вот она:
typedef struct tagMINMAXINFO {
POINT ptReserved;
POINT ptMaxSize; // макс. размер
POINT ptMaxPosition; // позиция при Maximize
POINT ptMinTrackSize; // мин/макс при растяжении сжатии мышкой
POINT ptMaxTrackSize; //
} MINMAXINFO;
я думаю уже поянтно как ограничить размеры окна... :D
И еще вопрос: почему, если в коде указывать те размеры окна, что стоят в редакторе ресурсов диалога, то окно получится меньше?
патамушта диалоги всё мериют ф кракадилах называемых DlgUnits эти кракадилы зависят ат размера шрифта используемога на диалоге. :)) А оконные ф-ции (CreateWindow, MoveWindow и пр.) оперируют пикселями. Штобы палучить эти DlgUnitы используим GetDialogBaseUnits() а лучше MapDialogRect (работает верна фсигда даже если изменён шрифит диалога) в опшим читаим MSDN, пляшем и учим англицкий до двух ночи! ик! :))
Я минимальный размер окна ограничиваю так:
void CSysbackupDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
................
CRect appRect;
const int x = 608; // ширина окна
const int y = 396; // высота окна
if ( cx <= x || cy <= y )
{
::GetWindowRect(m_hWnd, appRect);
::MoveWindow(m_hWnd, appRect.left, appRect.top, x, y, TRUE);
}
}
Получается достаточно криво. А вот как сделать по уму?
И еще вопрос: почему, если в коде указывать те размеры окна, что стоят в редакторе ресурсов диалога, то окно получится меньше?
Спасибо всем, кто поможет!
А если попробовать так:
void CSysbackupDlg::OnSize(UINT nType, int cx, int cy)
{
const int x = 608; // ширина окна
const int y = 396; // высота окна
CDialog::OnSize(nType, cx<x?x:cx, cy<y?y:cy);
}
Хотя... Обработчик вызывается уже после изменения размеров, так что так не получится... :о(
void CEeeDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
// TODO: Add your message handler code here
CSize czWindowSize(300, 150);
if((pRect->right-pRect->left)<czWindowSize.cx)
{
pRect->right=pRect->left+czWindowSize.cx;
}
if((pRect->bottom-pRect->top)<czWindowSize.cy)
{
pRect->bottom=pRect->top+czWindowSize.cy;
}
CDialog::OnSizing(fwSide, pRect);
}