Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.156.140] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
да да живите в своём мире
все уже давно придумано, layout рулит |
Сообщ.
#17
,
|
|
|
Цитата ЫукпШ @ Вопрос был о том, "как ограничить размер диалога ?" При изменении размеров окна в оконную процедуру посылается сообщение WM_SIZE с установленными размерами. По этому событию можно сравнить установленные размеры с ограничениями и, если надо, установить допустимые размеры окна Как раз по этому событию ты ничего особо сделать с окном не можешь, Либо это будет работать дико коряво. WM_WINDOWPOSCHANGING вызывается до изменения и в нем ты можешь вернуть новые размеры окна, т.е. ограничить размер диалога, а заодно изменить контролы. Больше никаких сообщений обрабатывать не нужно, В том числе getminmax |
Сообщ.
#18
,
|
|
|
Цитата ЫукпШ @ посылается сообщение WM_SIZE с установленными размерами. По этому событию можно сравнить установленные размеры с ограничениями и, если надо, установить допустимые размеры окна. А что, после сет виндов поз снова WM_SIZE не вызовется? Не совсем хорошая практика, как по мне. |
Сообщ.
#19
,
|
|
|
Цитата barazuk @ Цитата ЫукпШ @ посылается сообщение WM_SIZE с установленными размерами. По этому событию можно сравнить установленные размеры с ограничениями и, если надо, установить допустимые размеры окна. А что, после сет виндов поз снова WM_SIZE не вызовется? Обязательно вызовется - а как же иначе. Но новые правильно установленные размеры окна окажутся в допустимых пределах по их размерам. Это значит, что "SetWindowPos" вызвана не будет, ибо незачем. Никакого "автогенератора" не получится. Добавлено Олег М, WM_WINDOWPOSCHANGING это как раз результат работы SetWindowPos. ссылка Из обработчика этого сообщения я бы эту функцию вызвать не рискнул. |
Сообщ.
#20
,
|
|
|
Цитата ЫукпШ @ Олег М, WM_WINDOWPOSCHANGING это как раз результат работы SetWindowPos. ссылка Из обработчика этого сообщения я бы эту функцию вызвать не рискнул Кто ж ее там вызывает? Там в параметрах сообщения можно вернуть новый размер окна |
Сообщ.
#21
,
|
|
|
Цитата Олег М @ Там в параметрах сообщения можно вернуть новый размер окна Да вернуть-то можно, но не всегда. WM_WINDOWPOSCHANGING - это прямое следствие SetWindowPos. Но эта функция используется не только для изменения размеров окна. Значит, надо ещё правильно отфильтровать флаги. Возникает также вопрос - а что будет, если размер окна поменять другой функцией WINAPI ? (Напрмер, MoveWindow) --- Алгоритм процедуры в WM_SIZE проще, всё действует по-факту попытки изменить именно размеры окна неважно чем, неважно как. |
Сообщ.
#22
,
|
|
|
Цитата ЫукпШ @ Да вернуть-то можно, но не всегда А когда нельзя? Добавлено Цитата ЫукпШ @ Возникает также вопрос - а что будет, если размер окна поменять другой функцией WINAPI ? (Напрмер, MoveWindow) Будет отправлено это сообщение. Оно всегда отправляется, при изменении позиции или размера окна. |
Сообщ.
#23
,
|
|
|
Цитата Олег М @ Цитата ЫукпШ @ Да вернуть-то можно, но не всегда А когда нельзя? Эта функция используется не только для изменения размеров окна. И вместо размеров может быть любой мусор. --- А что будет, если в новых версиях Виндус будут добавлены новые флаги ? Может быть алгоритм снова придётся переделывать.. Нет, не уговоришь. Работать по-факту происходящего всегда надёжнее. |
Сообщ.
#24
,
|
|
|
Цитата ЫукпШ @ Нет, не уговоришь. Работать по-факту происходящего всегда надёжнее. Кто ж тебя уговаривает? Тебе рассказывают как надо делать правильно. Не доходит, ну и ладно. |
Сообщ.
#25
,
|
|
|
Цитата Олег М @ Цитата ЫукпШ @ Нет, не уговоришь. Работать по-факту происходящего всегда надёжнее. Кто ж тебя уговаривает? Тебе рассказывают как надо делать правильно. Не доходит, ну и ладно. Ты даже не знал, что в указанном тобой сообщении размеры окна пересылаются не всегда. И при этом рассказываешь, "как надо правильно". |
Сообщ.
#26
,
|
|
|
Цитата ЫукпШ @ И при этом рассказываешь, "как надо правильно". Идеологически правильно обрабатывать OnGetMinMaxInfo. Он вызывается ПЕРЕД любым изменением размера, и специально для этого предназначен А изменение размера из WM_SIZE... Это костыль |
Сообщ.
#27
,
|
|
|
Цитата ЫукпШ @ Ты даже не знал, что в указанном тобой сообщении размеры окна пересылаются не всегда. И при этом рассказываешь, "как надо правильно". С чего ты решил, что не знал? Вот мой код, от 2001 года вроде void CScopeDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) { CDialog::OnWindowPosChanging(lpwndpos); if (GetMinSize()==CSize(0,0)) return; if (!(lpwndpos->flags & SWP_NOSIZE)) { CSize sz(lpwndpos->cx,lpwndpos->cy); ApplyAnchors(this,GetMinSize(),sz,__anchors); lpwndpos->cx=sz.cx; lpwndpos->cy=sz.cy; } } А вот цитата из MSDN, насчёт WM_WINDOWPOSCHANGING While this message is being processed, modifying any of the values in WINDOWPOS affects the window's new size, position, or place in the Z order. An application can prevent changes to the window by setting or clearing the appropriate bits in the flags member of WINDOWPOS. |
Сообщ.
#28
,
|
|
|
Цитата barazuk @ Идеологически правильно обрабатывать OnGetMinMaxInfo. Он вызывается ПЕРЕД любым изменением размера, и специально для этого предназначен В свое время писал специальный класс, Layout, на который можно накидывать контролы, которые будут перемещаться и изменять размер, в зависимости от размеров диалога. Именно через OnGetMinMaxInfo ЕМНИП это и делал. Все работало и до сих пор работает гдето далеко уверен что на ура |
Сообщ.
#29
,
|
|
|
Цитата KILLER @ В свое время писал специальный класс, Layout, на который можно накидывать контролы, которые будут перемещаться и изменять размер, в зависимости от размеров диалога. а щас используешь его? |
Сообщ.
#30
,
|
|
|
Цитата Cfon @ а щас используешь его? А щас я уже с MFC и WinApi не работал пару лет уже. Ну так то помню что да как работает, какие то конкретные вещи через гугл за пару секунд гуглятся. Добавлено Если не забуду могу как до дома доберусь, посмотреть конкретно через какие функции я делал. Там класс практически для тех же целей что и у ТС. Единственное там возможно еще и отрисовка кастомных контролов запилена, я уж и не помню. |