Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > SDI приложение и WM_MOVE


Автор: kurlyak 8.3.2013, 11:26
Вобщим пишу SDI приложение. Ограничил размеры окна на 500 и 250 по x,y (мне так надо).

Код

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // TODO: Add your message handler code here and/or call default
    
    lpMMI->ptMinTrackSize.x = 500;
    lpMMI->ptMinTrackSize.y = 250;
    lpMMI->ptMaxTrackSize.x = 500;
    lpMMI->ptMaxTrackSize.y = 250;

    CFrameWnd::OnGetMinMaxInfo(lpMMI);
}



Теперь другая проблема. Вот я запускаю мое приложение- окно появляеться на экране. Все нормально, размеры окна изменить нельзя- жестко 500 на 250. Но когда щелкаю мышей дважды на нижней кромке окна или на верхней кромке окна (но не на заголовке где название приложения) окно перемещаеться под самый верх экрана. Я пробывал еще разные варианты- например окно может переместиться в самый верх и развернуть нижнюю кромку до самого низу рабочего стола - то есть окно по высоте становиться как высота рабочего стола- причем с левой и правой кромками окна такого не происходит- жестко ширина 500. И так как я запретил изменение размеров окна, то после дв. щелщка на верх.ниж.кромках- оно не разворачиваеться от верху рабочего стола до низу рабочего стола (сохраняя ширину при этом) а просто перемещаеться в самый верх рабочего стола. Короче мне надо что бы окно не прыгало по рабочему столу, когда пользователь может два раза щелкнуть на ниж.верх.кромке окна.

Как я понимаю за перемещение окна отвечает WM_MOVE. Но если я вобще переопределю и заблокирую WM_MOVE - то пользователь по желанию не сможет перемещать окно. То есть мне надо что бы отключить это перемещение окна по дв. наж. мыши на ниж.верх. кромках, но сохранить возможность перемещения окна при желании пользователя.

Хто понял- о чем я, прошу подсказать.

Автор: Albor 9.3.2013, 16:46
запретить изменение размеров окна и задать исходный размер можно в PreCreateWindow(). Нужно просто убрать стиль WS_THICKFRAME в параметре style структуры CREATESTRUCT, передаваемой в функцию и задать параметры cx и cy. И ещё, сделав эти изменения вы можете не увидеть результата, так как программа уже запускалась и есть запись в реестре. Нужно удалить всю ветвь, связанную с программой и после этого вновь запустить свою прогу. 

Автор: kurlyak 11.3.2013, 11:23
Спасибо буду пробовать.

Автор: kurlyak 17.3.2013, 12:32
Попробовал вобщим WS_THICKFRAME - теперь не могу менять размеры окна. А мне надо что бы пользователь мог менять размеры окна.

Я объясняю второй раз в чем проблема. У окна есть нижняя и верняя кромка. Когда два раза щелкаю мышей на нижней кромке в моей программе- окно разворачиваеться во всю высоту экрана, но по ширине остаеться как раньше. Как это заблокировать что бы окно не разворачивалось на всю высоту экрана? У меня Вин7 может под ХР по другому это работает.

Автор: Albor 17.3.2013, 15:09
Цитата(kurlyak @  17.3.2013,  11:32 Найти цитируемый пост)
Попробовал вобщим WS_THICKFRAME - теперь не могу менять размеры окна. А мне надо что бы пользователь мог менять размеры окна.

Ну, вероятно меня натолкнули на такую мысль одинаковые размеры в OnGetMinMaxInfo() smile  и фраза 
Цитата(kurlyak @  8.3.2013,  10:26 Найти цитируемый пост)
Все нормально, размеры окна изменить нельзя- жестко 500 на 250.


Цитата(kurlyak @  17.3.2013,  11:32 Найти цитируемый пост)
Когда два раза щелкаю мышей на нижней кромке в моей программе- окно разворачиваеться во всю высоту экрана, но по ширине остаеться как раньше. Как это заблокировать что бы окно не разворачивалось на всю высоту экрана? У меня Вин7 может под ХР по другому это работает. 

Здесь непонятно, а нет ни какого функционала в программе, обеспечивающего такое поведение? У меня ХР и смоделировать такое поведение не получается. Посмотрел SPY-ем, при двойном щелчке на кромке окна вижу только WM_LBUTTONUP, хоть при одиночном, хоть при двойном клике.
Даблклик проходит только как WM_NCLBUTTONDBLCLK можно попробовать перекрыть этот обработчик убрав базовый вызов OnNcLButtonDblClk()

Автор: Dem_max 17.3.2013, 16:24
Чтобы работало как мне помниться нужно не ставить одинаковые цифры
Код

    lpMMI->ptMinTrackSize.x = 500;
    lpMMI->ptMinTrackSize.y = 250;
    lpMMI->ptMaxTrackSize.x = 501;
    lpMMI->ptMaxTrackSize.y = 251;

Автор: Dem_max 17.3.2013, 19:57
Попробуй это сообщение обрабатывать
http://vsokovikov.narod.ru/New_MSDN_API/Window/notify_wm_nccalcsize.htm

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)