Здравствуйте qeugene_rus, вы писали:
QR>Можно ли вставить ActiveX control в WinAPI-программу?
На этот вопрос отвечу вопросом: а оно тебе надо? Для этого нужно ручками реализовать с десяток COM-интерфейсов, реализующих Control Containment. Это — нетривиальная задача, и самому ее решать вряд ли нужно. Если размер Exe напрягает, вместо MFC возьми ATL, ей-богу. QR>Как можно вставить DateTimePicker control в Win32API прогу QR>без MFC?
Это проще. DTP не ActiveX, а Common control:
InitCommonControlsEx(...);
CreateWindowEx(my_style, DATETIMEPICK_CLASS, ...);
Здравствуйте retalik, вы писали:
R>Здравствуйте qeugene_rus, вы писали:
QR>>Можно ли вставить ActiveX control в WinAPI-программу? R>На этот вопрос отвечу вопросом: а оно тебе надо? Для этого нужно ручками реализовать с десяток COM-интерфейсов, реализующих Control Containment. Это — нетривиальная задача, и самому ее решать вряд ли нужно. Если размер Exe напрягает, вместо MFC возьми ATL, ей-богу. QR>>Как можно вставить DateTimePicker control в Win32API прогу QR>>без MFC? R>Это проще. DTP не ActiveX, а Common control: R>InitCommonControlsEx(...); R>CreateWindowEx(my_style, DATETIMEPICK_CLASS, ...);
R>Успехов, R>Виталий.
На самом деле проще написать DLL на ATL в которой есть одно чилдовское окно в котором стоит нужный контрол и в WIN API выводить его как простое чилд окно
Re[3]: Как вставить ActiveX в Winapi-прогу?
От:
Аноним
Дата:
22.09.04 10:53
Оценка:
Ну а все-таки, товарищи гуру, подскажите, как это сделать без ATL, MFC, VCL и т.п.?
Хотя бы каие функции в MSDN искать?
Здравствуйте, Аноним, Вы писали:
А>Ну а все-таки, товарищи гуру, подскажите, как это сделать без ATL, MFC, VCL и т.п.?
Пример для WebBrowser ActiveX контрола есть здесь.
Но проще будет прикрутить ATL. Как это сделать описано в Q192560 "HOWTO: Add ATL Control Containment Support to Any Window".
А>Хотя бы каие функции в MSDN искать?
Для начала:
IStorage
IOleClientSite
IOleInPlaceSiteWindowless
IOleInPlaceFrame
Здравствуйте, Аноним, Вы писали:
А>Ну а все-таки, товарищи гуру, подскажите, как это сделать без ATL, MFC, VCL и т.п.? А>Хотя бы каие функции в MSDN искать?
Спасибо Вам, товарищ Аноним, что подняли ветку с первым моим ответом на форуме RSDN!
С тех пор этот вопрос задавался неоднократно, но разжевывать одно и то же было лень.
Довольно полный ответ был дан здесь
Здравствуйте:
А>>Ну а все-таки, товарищи гуру, подскажите, как это сделать без ATL, MFC, VCL и т.п.? А>>Хотя бы каие функции в MSDN искать?
Для товарища Анонима Виталий правильно сказал, нельзя "нахаляву" получить контейнер ActiveX контролов.
R>С тех пор этот вопрос задавался неоднократно, но разжевывать одно и то же было лень. R>Довольно полный ответ был дан здесь
Для Visual Studio 6.0 проекта использующего ATL 3.0 можно подтянуть WTL (последний на сегодняшний день от Microsoft версии 7.1)
и в Win32 API проект добавить:
#include <atlbase.h>
#include <atlapp.h>
...
CAppModule _Module;
...
int WINAPI WinMain(HINSTANCE hInstance, ...)
{
CoInitialize(NULL);
_Module.Init(NULL, hInstance, &LIBID_ATLLib); // это для WTL 7.1, для WTL 3.1 3-й параметр не обязателен
......
_Module.Term();
CoUninitialize();
return 0;
}
Далее все вызовы DialogBox(4 параметра) заменяем на AtlAxDialogBox(те же параметры + NULL) из ATL
и все работает. Изменений минимум.
Кстати первым параметром AtlAxDialogBox() можно взять _AtlBaseModule.GetResourceInstance().
А для интересующихся, как это работает:
внутри ATL загружается ресурс диалога и парсится с созданием нового темплейта диалога. Элементы управления не-ActiveX остаются без изменений, а ActiveX-контролы меняю свой класс на контейнер ATL "AtlAxWin", а в текст пишется GUID контрола.
Но в Visual Studio .NET 2003 использующей ATL 7.1 похоже есть баг: диалог-то парсится, как и раннее, даже почти тем же кодом, но в новый темплейт не переносятся ActiveX-контролы при вызове AtlAxDialogBox(). MFC-стиль, использующий класс CAxDialogImpl<>, продолжает работать, т.к. перехватывается сообщение WM_INITDIALOG, где вызывается функция добавления ActiveX-контролов.
Таким образом мне не удалось вызвать AtlAxDialogBox() и получить отображение ActiveX-контролов. Обидно, что код работающий в одной студии, перестал корректно работать в другой.