Resize a control inside a dialog

uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Resize a control inside a dialog

Post by uniqueman »

Возможно ли управлять размером контрола внтури диалога? Допустим я хочу менять размер контрола CListBox внутри диалога (не сам диалог!) путем "хватания" контрола за край мышой и перемещения мыши.

Возможно ли это сделать ? Приложение пишется на MFC

Мне кажется надо отлавливать OnMouseMove, OnMouseDown, OnMouseUp.
Может у кого примерчик есть :wink:
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Мне кажется, что, как правило, не изменяют размер одного контрола, а завязывают его геометрию на общий размер диалога, и создают его с изменяемым размером. В этом случае подключаются к событию "OnResize"
...а мы такой компанией, возьмем, да и припремся к Элис!
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

да обычно так и делают. Но у меня необычная ситуация. У меня на диалоге три лист бокса. Один под другим. Мне в какие то моменты надо сделать один лист бокс побольше, соотвественно другие два должно пропорциально уменьшить свой размер. Типа того.. Но размер диалога при этом должен оставатся неизменным.

Если бы я знал что так нужно будет. я бы с самого начала использовал CSplitterView, однако сейчас поздно пить боржоми
User avatar
Zuk
Уже с Приветом
Posts: 17340
Joined: 28 Jun 2000 09:01

Post by Zuk »

идея правильная -мышкины события и перерисовывать. Курсор ручками менять и тд..
примерчик - поищите на codeproejct и прочих..
там идей не так много, надо аккуратно сделать в основном
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

Zuk wrote:идея правильная -мышкины события и перерисовывать. Курсор ручками менять и тд..
примерчик - поищите на codeproejct и прочих..
там идей не так много, надо аккуратно сделать в основном


Да так и делаю. Столкнулся с такими проблемами.

1. События OnMouseMove и тому подобное посылаются диалогу только когда курсор находится НЕ в клиентской части лист бокса. Для этого приходится прямо прямо перед тем как курсор попадает на лист бокс делать SetCapture() чтобы сообщения продолжали поступать в главный диалог, а не в лист бокс.

ReleaseCapture() надо делать тоже аккуратно и вовремя.

2. Такая проблема (никак не пойму почему). При инициализации диалога снимаю размеры лист бокса через GetWindowRect (). Как только приходит пора изменять размер лист бокса в обработчике OnMouseMove, то размеры оказываются почему немного другими.
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Мне кажется без добавления дополнительных контролей (что-то типа контроля splitter), за которые вы будете делать drag-and-drop у вас получится макаронный код. Добавление таких контролей решило бы вашу первую проблему.
Вторая проблема возникает, по-моему, из-за того, что вы снимаете размеры не во время, когда контроли уже прорисованы (OnActivate), а во время их инициализации (OnLoad). Точнее трудно понять.
...а мы такой компанией, возьмем, да и припремся к Элис!
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

Мне кажется без добавления дополнительных контролей (что-то типа контроля splitter), за которые вы будете делать drag-and-drop у вас получится макаронный код. Добавление таких контролей решило бы вашу первую проблему.


согласен. Уже вижу что плоховато, все через одно место. А как добавить сплиттеры в диалог?

Вторая проблема возникает, по-моему, из-за того, что вы снимаете размеры не во время, когда контроли уже прорисованы (OnActivate), а во время их инициализации (OnLoad). Точнее трудно понять.


я на момент инициализации делаю так

RECT rect;
rect.left = 707;
rect.top = 25;
rect.right = 1192;
rect.bottom = 795;

m_editStory.MoveWindow(&rect,1);

На момент отлавливания движений мыши вижу что левый край контрола почему то имеет координату 749 (!) а не 707 которую я указал. Очень странно

координаты снимаю через GetWindowRect ()
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

и чего парился когда на codeproject лежит Splitter для диалога. :oops:
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

С координатами у вас вопрос не ясен. То-ли вы их невовремя считываете, то-ли не в тех единицах измеряете (что-то типа там LOGPIXELSX и LOGPIXELSY, не могу вспомнить и нет MSDN под рукой).
...а мы такой компанией, возьмем, да и припремся к Элис!

Return to “Вопросы и новости IT”