пользовательский ActiveX Control (MFC, Visual Studio 2005, VC++)

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

Можно ли на форме пользовательского ActiveX Control'a разместить стандартные элементы управления?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Сам создаю.
Размещаю на форме контол'а элементы, а при использовании контрол'a в приложении они не отображаются. В чем может быть причина?
Там судя по всему нужно функцию OnDraw ковырять? а как например отрисовать кнопку? иначе что ли никак?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Вот как выглядит подобный ActiveX внутри веб-страницы...
Вложение AxPage.jpg больше недоступно
Метод OnDraw() здесь не нужен (по крайней мере для отображения кнопки).
Чтобы твой ActiveX мог содержать другие элементы управления, его нужно создать как Composite control. Тогда этот контрол будет являться окном диалога (только без бордера и без заголовка), в котором ты сможешь разместить любые стандартные (и даже нестандартные) элементы.
Как создать такой контрол?
При создании нового проекта в окне визарда укажи ATL Project.
В опциях проекта укажи тип модуля Dynamic-link library (DLL). Можешь ещё включить опцию поддержки MFC (если тебе это нужно).
После создания нового проекта в него нужно добавить класс самого ActiveX-контрола.
Для этого через меню Project->Add class... вызывается окно визарда, в котором нужно выбрать шаблон ATL Control. В окне диалога визарда нужно указать опцию Composite control.
После добавления в проект этого класса открываешь закладку ресурсов и находишь там окно диалога. В это окно диалога с помощью редактора можешь добавлять нужные элементы.
Вложения
AxPage.jpg
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

WinMain
огромное вам спасибо, я уже неделю эти мучаюсь.... что только не перепробовал! выручили! :D
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

а не подскажете, где динамически создавать элементы на контрол'е?
ну хотя бы - это возможно? или только статически можно?
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Создать новый элемент на окне диалога можно с помощью функции CreateWindow().
Делать это нужно при обработке сообщения WM_INITDIALOG.
Тебе нужно перейти в закладку Class View и выделить там тот класс, который является классом твоего контрола. А в панели свойств (Properties) этого класса нужно найти сообщение WM_INITDIALOG и указать ему метод обработки OnInitDialog(). Visual C++ автоматически добавит в программный код этот метод.
Поумнеть несложно, куда труднее от дури избавиться.
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

ого, спасибо!
А еще вопрос тогда - в функции CreateWindow нужен HWND родительского окна - как его заполучить?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

У класса твоего контрола (т.е. у класса окна диалога) есть внутренняя переменная m_hWnd, которая имеет значение HWND окна диалога.
FloyDos
Сообщения: 25
Зарегистрирован: 14 июн 2009, 16:08

спасибо. а регистрировать, показывать же тоже надо?

а то если так то не отображается

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

  HWND btn=CreateWindowW(L"BUTTON", 
                L"but",
                BS_ICON,
                0, 0, 10, 20,
                this->m_hWnd,
                0,
                (HINSTANCE)this->m_hWnd, 
                0
                );
Ответить