resize ActiveX на ATL

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
jaba
Сообщения: 4
Зарегистрирован: 11 авг 2004, 02:41

Подскажите пожалуйста, в чем проблема.
Создаю ActiveX с помощью ATL Wizard. По событию OnSize задаю размеры окна:

Код: Выделить всё

SetWindowPos(0, 0, 0, 100, 50, SWP_NOMOVE | SWP_NOZORDER);
Далее загоняю ActiveX в VB, кидаю на форму и начинаю ресайзить, при этом рамка с маркерами выделения никак не реагирует на изменение размеров ActiveX. Такое впечатление, будто контрол находится в контейнере. Если это так, то как к нему доступится. Хотя в RunTime клики по рамке не обрабатываются, а только там, где находится окно контрола. Какое-то решение должно быть, ведь WindowsCommonControl-овский Toolbar, например, делает это, не сдвинешь с места и размеров не изменишь. Да и в VB это очень легко реализуется. Может, после изменения размеров еще что-то надо делать? Заранее благодарен за помощь.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

1. Уточни какой именно ActiveX создал.
2. Когда в VB кинул что ты ресайзишь, форму что ли? Тогда в редакторе или в runtime?

Что-то не очень понятно всё...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
jaba
Сообщения: 4
Зарегистрирован: 11 авг 2004, 02:41

1. FullControl
2. Resize контрола в DesignTime
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Снова два пункта, уж увольте, сударь, за рутинный подход...

1. Не совсем ясно зачем делать по WM_SIZE вызов SetWindowPos, да ешё и с такими загадочными параметрами.

2. Почему меняя размер контрола во время дизайна формы вы, всемилостевый господин, хотите увидеть результаты полноценной обработки сообщений? Подобные притензии можно было бы выдвигать, если бы ресайз контрола каким-либо не поддающимся здравому уму образом происходил в runtime...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
jaba
Сообщения: 4
Зарегистрирован: 11 авг 2004, 02:41

1. Чтобы пользователь как бы не ресайзил контрол, размер его оставлся жестко заднным, к примеру 100 по ширине и 50 по высоте. А последний параметр игнорирует первые 3. Но ведь не в этом вопрос, это для примера.

2. А что, разве OnSize в designtime обрабатывается не полноценно, через строку? Но опять таки, не в этом вопрос.

Это все мелочи, скажите просто (если конечно знаете), что необходимо сделать?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Всё, о чём я спрашивал действительно имеет вес - это не мелочь. Вот ответ, основанный на фактах:

Пользователь и так не сможет ресайзить твой контрол во время рантайма (на то он и FullControl). Если же под термином "пользователь" подразумевается "программист, который будет использовать данный контрол" (тоже как бы user - игра слов), то для наложения ограничения на размеры контрола во время дизайна формы (во время дизайна размеры можно менять) достаточно в контроле обработать сообщение WM_INITDIALOG и установть в нём требуемые параметры.

WM_SIZE перехватывать глупо по той причене, что он просто никогда не будет попадать в хэндлер контола. Дело в том, что во время дизайна формы при изменении размеров контрола полноценная обработка сообщений не осуществляется. Disign aplication просто выделяет рамочкой то меcто, в которое во время рантайма будет загружен ActiveX. Именно эту рамочку мы и можем двигать (она к контролу никакого отношения не имеет).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
jaba
Сообщения: 4
Зарегистрирован: 11 авг 2004, 02:41

А я вообще-то ни слова не говорил о runtime, естественно, пользователь - это программер (в данном случае я) который добавляет контрол на форму и начинает ресайзить его в дизайнтайме.
Не пойму я, причем тут сообщение WM_INITDIALOG, я ведь ни слова не говорил о dialog box, и не понятно, что за параметры надо установить. Я отнюдь не усложняю сущности, я просто хочу с ней разобраться, и очень прошу вас в этом помочь мне.
Вы говорите, что не полноценно обрабатывается WM_SIZE, т.е. выполняются не все строки в функции обработке сообщения или как? У меня почему-то все обрабатывается.
Ну, если глупо перехватывать WM_SIZE, тогда подскажите, как реализуется "нересайзимость" контрола? Буду очень признателен.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ты действительно ни слова не говорил о dialog box, но тем не менее твой контрол является компосайтом и, как следствие, обрабатывает все сообщения, подобно диалоговому окну. Всё остальное отсюда вытекает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить