пользовательский ActiveX Control (MFC, Visual Studio 2005, VC++)
Модераторы: Duncon, Hawk, Romeo, Eugie
Можно ли на форме пользовательского ActiveX Control'a разместить стандартные элементы управления?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
В смысле пользовательского? Ты сам пишешь этот ActiveX или он чужой? Вообще, на самом деле, всё можно 

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Сам создаю.
Размещаю на форме контол'а элементы, а при использовании контрол'a в приложении они не отображаются. В чем может быть причина?
Там судя по всему нужно функцию OnDraw ковырять? а как например отрисовать кнопку? иначе что ли никак?
Размещаю на форме контол'а элементы, а при использовании контрол'a в приложении они не отображаются. В чем может быть причина?
Там судя по всему нужно функцию OnDraw ковырять? а как например отрисовать кнопку? иначе что ли никак?
Вот как выглядит подобный ActiveX внутри веб-страницы...
Метод OnDraw() здесь не нужен (по крайней мере для отображения кнопки).
Чтобы твой ActiveX мог содержать другие элементы управления, его нужно создать как Composite control. Тогда этот контрол будет являться окном диалога (только без бордера и без заголовка), в котором ты сможешь разместить любые стандартные (и даже нестандартные) элементы.
Как создать такой контрол?
При создании нового проекта в окне визарда укажи ATL Project.
В опциях проекта укажи тип модуля Dynamic-link library (DLL). Можешь ещё включить опцию поддержки MFC (если тебе это нужно).
После создания нового проекта в него нужно добавить класс самого ActiveX-контрола.
Для этого через меню Project->Add class... вызывается окно визарда, в котором нужно выбрать шаблон ATL Control. В окне диалога визарда нужно указать опцию Composite control.
После добавления в проект этого класса открываешь закладку ресурсов и находишь там окно диалога. В это окно диалога с помощью редактора можешь добавлять нужные элементы.
Метод OnDraw() здесь не нужен (по крайней мере для отображения кнопки).
Чтобы твой ActiveX мог содержать другие элементы управления, его нужно создать как Composite control. Тогда этот контрол будет являться окном диалога (только без бордера и без заголовка), в котором ты сможешь разместить любые стандартные (и даже нестандартные) элементы.
Как создать такой контрол?
При создании нового проекта в окне визарда укажи ATL Project.
В опциях проекта укажи тип модуля Dynamic-link library (DLL). Можешь ещё включить опцию поддержки MFC (если тебе это нужно).
После создания нового проекта в него нужно добавить класс самого ActiveX-контрола.
Для этого через меню Project->Add class... вызывается окно визарда, в котором нужно выбрать шаблон ATL Control. В окне диалога визарда нужно указать опцию Composite control.
После добавления в проект этого класса открываешь закладку ресурсов и находишь там окно диалога. В это окно диалога с помощью редактора можешь добавлять нужные элементы.
WinMain
огромное вам спасибо, я уже неделю эти мучаюсь.... что только не перепробовал! выручили!
огромное вам спасибо, я уже неделю эти мучаюсь.... что только не перепробовал! выручили!

а не подскажете, где динамически создавать элементы на контрол'е?
ну хотя бы - это возможно? или только статически можно?
ну хотя бы - это возможно? или только статически можно?
Создать новый элемент на окне диалога можно с помощью функции CreateWindow().
Делать это нужно при обработке сообщения WM_INITDIALOG.
Тебе нужно перейти в закладку Class View и выделить там тот класс, который является классом твоего контрола. А в панели свойств (Properties) этого класса нужно найти сообщение WM_INITDIALOG и указать ему метод обработки OnInitDialog(). Visual C++ автоматически добавит в программный код этот метод.
Делать это нужно при обработке сообщения WM_INITDIALOG.
Тебе нужно перейти в закладку Class View и выделить там тот класс, который является классом твоего контрола. А в панели свойств (Properties) этого класса нужно найти сообщение WM_INITDIALOG и указать ему метод обработки OnInitDialog(). Visual C++ автоматически добавит в программный код этот метод.
Поумнеть несложно, куда труднее от дури избавиться.
ого, спасибо!
А еще вопрос тогда - в функции CreateWindow нужен HWND родительского окна - как его заполучить?
А еще вопрос тогда - в функции CreateWindow нужен HWND родительского окна - как его заполучить?
У класса твоего контрола (т.е. у класса окна диалога) есть внутренняя переменная m_hWnd, которая имеет значение HWND окна диалога.
спасибо. а регистрировать, показывать же тоже надо?
а то если так то не отображается
а то если так то не отображается
Код: Выделить всё
HWND btn=CreateWindowW(L"BUTTON",
L"but",
BS_ICON,
0, 0, 10, 20,
this->m_hWnd,
0,
(HINSTANCE)this->m_hWnd,
0
);