Страница 1 из 1
resize ActiveX на ATL
Добавлено: 11 авг 2004, 02:51
jaba
Подскажите пожалуйста, в чем проблема.
Создаю ActiveX с помощью ATL Wizard. По событию OnSize задаю размеры окна:
Код: Выделить всё
SetWindowPos(0, 0, 0, 100, 50, SWP_NOMOVE | SWP_NOZORDER);
Далее загоняю ActiveX в VB, кидаю на форму и начинаю ресайзить, при этом рамка с маркерами выделения никак не реагирует на изменение размеров ActiveX. Такое впечатление, будто контрол находится в контейнере. Если это так, то как к нему доступится. Хотя в RunTime клики по рамке не обрабатываются, а только там, где находится окно контрола. Какое-то решение должно быть, ведь WindowsCommonControl-овский Toolbar, например, делает это, не сдвинешь с места и размеров не изменишь. Да и в VB это очень легко реализуется. Может, после изменения размеров еще что-то надо делать? Заранее благодарен за помощь.
Добавлено: 11 авг 2004, 12:58
Romeo
1. Уточни какой именно ActiveX создал.
2. Когда в VB кинул что ты ресайзишь, форму что ли? Тогда в редакторе или в runtime?
Что-то не очень понятно всё...
Добавлено: 11 авг 2004, 23:16
jaba
1. FullControl
2. Resize контрола в DesignTime
Добавлено: 12 авг 2004, 15:57
Romeo
Снова два пункта, уж увольте, сударь, за рутинный подход...
1. Не совсем ясно зачем делать по WM_SIZE вызов SetWindowPos, да ешё и с такими загадочными параметрами.
2. Почему меняя размер контрола во время дизайна формы вы, всемилостевый господин, хотите увидеть результаты полноценной обработки сообщений? Подобные притензии можно было бы выдвигать, если бы ресайз контрола каким-либо не поддающимся здравому уму образом происходил в runtime...
Добавлено: 13 авг 2004, 03:12
jaba
1. Чтобы пользователь как бы не ресайзил контрол, размер его оставлся жестко заднным, к примеру 100 по ширине и 50 по высоте. А последний параметр игнорирует первые 3. Но ведь не в этом вопрос, это для примера.
2. А что, разве OnSize в designtime обрабатывается не полноценно, через строку? Но опять таки, не в этом вопрос.
Это все мелочи, скажите просто (если конечно знаете), что необходимо сделать?
Добавлено: 14 авг 2004, 13:25
Romeo
Всё, о чём я спрашивал действительно имеет вес - это не мелочь. Вот ответ, основанный на фактах:
Пользователь и так не сможет ресайзить твой контрол во время рантайма (на то он и FullControl). Если же под термином "пользователь" подразумевается "программист, который будет использовать данный контрол" (тоже как бы user - игра слов), то для наложения ограничения на размеры контрола во время дизайна формы (во время дизайна размеры можно менять) достаточно в контроле обработать сообщение WM_INITDIALOG и установть в нём требуемые параметры.
WM_SIZE перехватывать глупо по той причене, что он просто никогда не будет попадать в хэндлер контола. Дело в том, что во время дизайна формы при изменении размеров контрола полноценная обработка сообщений не осуществляется. Disign aplication просто выделяет рамочкой то меcто, в которое во время рантайма будет загружен ActiveX. Именно эту рамочку мы и можем двигать (она к контролу никакого отношения не имеет).
Добавлено: 18 авг 2004, 01:19
jaba
А я вообще-то ни слова не говорил о runtime, естественно, пользователь - это программер (в данном случае я) который добавляет контрол на форму и начинает ресайзить его в дизайнтайме.
Не пойму я, причем тут сообщение WM_INITDIALOG, я ведь ни слова не говорил о dialog box, и не понятно, что за параметры надо установить. Я отнюдь не усложняю сущности, я просто хочу с ней разобраться, и очень прошу вас в этом помочь мне.
Вы говорите, что не полноценно обрабатывается WM_SIZE, т.е. выполняются не все строки в функции обработке сообщения или как? У меня почему-то все обрабатывается.
Ну, если глупо перехватывать WM_SIZE, тогда подскажите, как реализуется "нересайзимость" контрола? Буду очень признателен.
Добавлено: 24 авг 2004, 12:56
Romeo
Ты действительно ни слова не говорил о dialog box, но тем не менее твой контрол является компосайтом и, как следствие, обрабатывает все сообщения, подобно диалоговому окну. Всё остальное отсюда вытекает.