| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > динамическое изменение размеров окна |
| Автор: yngwie19 25.6.2009, 22:23 |
| Здравствуйте. У меня в окне есть edit control, мне нужно чтобы размер окна изменялся когда за рамку окна тянешь мышкой. Подскажите как это сделать? |
| Автор: GremlinProg 25.6.2009, 22:40 |
| чтобы менять размер окна за его рамку, нужно добавить ему стиль WS_THICKFRAME чтобы менять размер любого дочернего окна, когда меняется размер родительского, нужно перехватывать сообщение WM_SIZE и для дочернего вызывать SetWindowPos или MoveWindow с новыми координатами ps: из текста сообщения не совсем понятно, какой из этих двух вопросов ты задал Добавлено через 1 минуту и 37 секунд может есть какой-то третий вопрос? |
| Автор: yngwie19 25.6.2009, 23:33 |
| GremlinProg, мне нужен первый вариант, спасибо. Есть еще вопрос. 1) Как сделать так чтобы изменять размеры можно было только по горизонтали, т.е чтобы при попытке изменения размеров по вертикали пунктирная рамка, которая укажет новый размер окна не появлялась. 2) При задании стиля WS_THICKFRAME вокруг edita появляется рамка, можно ли ее сделать тоньше ? или вообще скрыть (так нужно). |
| Автор: yngwie19 26.6.2009, 07:30 |
| Andrey44,сообщение WM_GETMINMAXINFO отправляется когда размеры изменены, как тогда написать что при захвате края окна и перемещении мыши, окно изменяется |
| Автор: GremlinProg 26.6.2009, 09:55 |
| WM_GETMINMAXINFO без WS_THICKFRAME вообще не придет, т.к. ограничивает максимальные и минимальные размеры, которые изменяются именно при таскании компонента за его границы, при этом, рамка все равно останется на ширину рамки повлиять нельзя, ее рисует DefWindowProc без каких-либо внешних вмешательств а чтобы рамки не было вообще, делай то же, что делает WS_THICKFRAME но уже вручную, т.е. перехватывай WM_NCHITTEST, WM_(NC)LBUTTONDOWN, WM_MOUSEMOVE, WM_MOUSEUP, WM_CAPTURECHANGED, используя, конечно Set/ReleaseCapture и меняй координаты эдита уже с помощью SetWindowPos или MoveWindow (при этом, естественно WM_GETMINMAXINFO тут уже не поможет, ограничивай минимальные габариты сам) если достаточно только скрыть рамку с верху и снизу, то можно перехватить WM_NCHITTEST, и если курсор находится вблизи верхней и нижней границы окна - перекрывать CallWindowProc, т.е. сразу возвращаться из процедуры окна с результатом HTNOWHERE, минуя CallWindowProc, можно и не минуя CallWindowProc, т.е. вызвать ее и посмотреть, что она вернула, но вернуть HTNOWHERE, когда потребуется, (безусловный вызов CallWindowProc - тут не совсем чистый вариант, т.к. и DefWindowProc и процедура окна уровнем ее выше, могут вполне зафиксировать во внутренних состояниях окна, что необходимы изменения, т.е. можно нарушить правильную работу окна в какой-нибудь из последующих версий компонента) либо - еще один вариант: перехватывай WM_NCLBUTTONDOWN и смотри на HitTest-код (wParam), если он равен HTTOP, HTTOPLEFT, HTTOPRIGHT, HTBOTTOM, HTBOTTOMLEFT или HTBOTTOMRIGHT, то перекрывай CallWindowProc, т.е., таким образом DefWindowProc вообще не определит момент, когда нужно менять именно вертикальные габариты и, соответственно, менять ничего не будет, рамки тоже не будет, хотя курсоры up-down - будут (в пред. примере даже курсоров не будет) |
| Автор: Andrey44 26.6.2009, 10:32 |
| GremlinProg, я наверное не понял, ему за рамку какого окна тянуть надо? эдита или диалога? |
| Автор: GremlinProg 26.6.2009, 10:41 |
| Andrey44, да, нужно за края эдита менять его горизонтальный размер Добавлено через 7 минут и 25 секунд я немного подкорректировал описание темы, чтобы было понятно |
| Автор: Andrey44 26.6.2009, 11:57 |
| GremlinProg, понял спасибо. Читая твои посты, я все больше понимаю что очень мало еще знаю. |
| Автор: GremlinProg 26.6.2009, 12:20 |
| |
| Автор: Andrey44 26.6.2009, 12:27 |
| GremlinProg, извини, я думал что пишу в соседнем топике Динамическое изменение размеров окна А пользоваться поиском я умею |
| Автор: GremlinProg 26.6.2009, 12:36 |
| теперь так и есть, поправлено ) |