Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамическое изменение размеров окна, за рамку этого окна (не диалога) 
:(
    Опции темы
yngwie19
Дата 25.6.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Здравствуйте. У меня в окне есть edit control, мне нужно чтобы размер окна изменялся когда за рамку окна тянешь мышкой. Подскажите как это сделать?
PM MAIL   Вверх
GremlinProg
Дата 25.6.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



чтобы менять размер окна за его рамку, нужно добавить ему стиль WS_THICKFRAME

чтобы менять размер любого дочернего окна, когда меняется размер родительского, нужно перехватывать сообщение WM_SIZE и для дочернего вызывать SetWindowPos или MoveWindow с новыми координатами

ps: из текста сообщения не совсем понятно, какой из этих двух вопросов ты задал

Добавлено через 1 минуту и 37 секунд
может есть какой-то третий вопрос?

Это сообщение отредактировал(а) GremlinProg - 25.6.2009, 22:41


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
yngwie19
Дата 25.6.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



GremlinProg, мне нужен первый вариант, спасибо. Есть еще вопрос.
1) Как сделать так чтобы изменять размеры можно было только по горизонтали, т.е чтобы при попытке изменения размеров по вертикали пунктирная рамка, которая укажет новый размер окна не появлялась.
2) При задании стиля WS_THICKFRAME вокруг edita появляется рамка, можно ли ее сделать тоньше ? или вообще скрыть (так нужно).
PM MAIL   Вверх
Andrey44
Дата 26.6.2009, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



WS_THICKFRAME - для эдита задавать не надо. Это для главного окна.
Цитата(yngwie19 @  25.6.2009,  23:33 Найти цитируемый пост)
можно ли ее сделать тоньше ? или вообще скрыть (так нужно). 
 и появляться она больше не будет!


Цитата(yngwie19 @  25.6.2009,  23:33 Найти цитируемый пост)
1) Как сделать так чтобы изменять размеры можно было только по горизонтали, т.е чтобы при попытке изменения размеров по вертикали пунктирная рамка, которая укажет новый размер окна не появлялась.

Лови и обрабатывай сообщение WM_GETMINMAXINFO


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 26.6.2009, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Andrey44,сообщение WM_GETMINMAXINFO отправляется когда размеры изменены, как тогда написать что при захвате края окна и перемещении мыши, окно изменяется
PM MAIL   Вверх
GremlinProg
Дата 26.6.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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 - будут (в пред. примере даже курсоров не будет)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Andrey44
Дата 26.6.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



GremlinProg, я наверное не понял, ему за рамку какого окна тянуть надо? эдита или диалога?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 26.6.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Andrey44, да, нужно за края эдита менять его горизонтальный размер

Добавлено через 7 минут и 25 секунд
я немного подкорректировал описание темы, чтобы было понятно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Andrey44
Дата 26.6.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



GremlinProg, понял спасибо.
Читая твои посты, я все больше понимаю что очень мало еще знаю. smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 26.6.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



 smile дело практики, знать можно и не много, см. подпись... )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Andrey44
Дата 26.6.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



GremlinProg, извини, я думал что пишу в соседнем топике Динамическое изменение размеров окна smile 
А пользоваться поиском я умею smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 26.6.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



теперь так и есть, поправлено )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.