Как вставить ActiveX в Winapi-прогу?
От: qeugene_rus  
Дата: 10.05.01 03:45
Оценка:
Можно ли вставить ActiveX control в WinAPI-программу?
Как можно вставить DateTimePicker control в Win32API прогу
без MFC?
Re: Как вставить ActiveX в Winapi-прогу?
От: retalik www.airbandits.com/
Дата: 10.05.01 06:29
Оценка:
Здравствуйте 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, ...);

Успехов,
Виталий.
Успехов,
Виталий.
Re[2]: Как вставить ActiveX в Winapi-прогу?
От: Савченко Павел  
Дата: 10.05.01 07:38
Оценка:
Здравствуйте 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 искать?
Re[4]: Как вставить ActiveX в Winapi-прогу?
От: algol Россия about:blank
Дата: 22.09.04 11:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну а все-таки, товарищи гуру, подскажите, как это сделать без ATL, MFC, VCL и т.п.?


Пример для WebBrowser ActiveX контрола есть здесь.
Но проще будет прикрутить ATL. Как это сделать описано в Q192560 "HOWTO: Add ATL Control Containment Support to Any Window".

А>Хотя бы каие функции в MSDN искать?


Для начала:
IStorage
IOleClientSite
IOleInPlaceSiteWindowless
IOleInPlaceFrame
Re[4]: Как вставить ActiveX в Winapi-прогу?
От: retalik www.airbandits.com/
Дата: 22.09.04 11:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну а все-таки, товарищи гуру, подскажите, как это сделать без ATL, MFC, VCL и т.п.?

А>Хотя бы каие функции в MSDN искать?

Спасибо Вам, товарищ Аноним, что подняли ветку с первым моим ответом на форуме RSDN!

С тех пор этот вопрос задавался неоднократно, но разжевывать одно и то же было лень.
Довольно полный ответ был дан здесь
Автор: retalik
Дата: 19.07.02
.
Успехов,
Виталий.
Re[5]: Как вставить ActiveX в Winapi-прогу?
От: Аноним  
Дата: 24.09.04 10:14
Оценка: 3 (1)
Здравствуйте:

А>>Ну а все-таки, товарищи гуру, подскажите, как это сделать без ATL, MFC, VCL и т.п.?

А>>Хотя бы каие функции в MSDN искать?
Для товарища Анонима Виталий правильно сказал, нельзя "нахаляву" получить контейнер ActiveX контролов.

R>С тех пор этот вопрос задавался неоднократно, но разжевывать одно и то же было лень.

R>Довольно полный ответ был дан здесь
Автор: retalik
Дата: 19.07.02
.


Мне кажется там очень невнятно (без исходников).

Для 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
и все работает. Изменений минимум.

Либо для любителей MFC-стиля можно вызывать так:
class CMyDialog : public CAxDialogImpl<CMyDialog>
{
public:
   enum { IDD = IDD_ABOUTBOX };

   BEGIN_MSG_MAP(CMyDialog)
...
   END_MSG_MAP()

};


...
OnAppAbout()
{
 CMyDialog dlg;
 dlg.DoModal();
}

Кстати первым параметром 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-контролов. Обидно, что код работающий в одной студии, перестал корректно работать в другой.

Исправьте, если что не так.

Бывайте,
Саша
Re[6]: Как вставить ActiveX в Winapi-прогу?
От: AlexanderК Украина  
Дата: 24.09.04 10:19
Оценка:
Здравствуйте,

Это был я, с объяснениями....
Не заметил, что написал, как Аноним.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.