Отображение ActiveX в целом и IWebBrowser2 в частности
От: ilyxan  
Дата: 25.02.05 17:20
Оценка:
Собственно есть HWND окошечко. При событие WM_CREATE создаю Ole объектик:
IWebBrowser2* pBrowser = NULL;
IOleObject* pOleObject = NULL;
OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, 0, (IOleClientSite*)&h, &oStore, (void**)&pOleObject);
...
pOleObject->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite*)&h, 0, hWnd, &rc);
...
pOleObject->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
pBrowser->put_Left(0);
pBrowser->put_Top(0);
pBrowser->put_Width(rc.right);
pBrowser->put_Height(rc.bottom);
pBrowser->Navigate(L"about:blank", 0, 0, 0, 0);
pBrowser->put_Visible(true);
pBrowser->Release();


Все создаётся просто на ура... НО
после создания окна и до запуска обработчика событий нельзя получить pBrowser->get_Document(&pDispatch) в windows 98
то есть get_Document возвращяет S_OK но pDispatch == NULL
Под WindowsXP все нормально.

HWND hWnd = ::CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, "Window class", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 300, 300, 300, 300, NULL, 0, NULL, NULL);

// от тута вот нифига нельзя получить в win98
// hWnd - уже отрисовался и стал активным а OleObject еще не видно
// ole object отрисуется позже и тогда всё можно получить

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}


в документации по IOleObject::DoVerb написано:
"When showing a window as a result of DoVerb, it is very important for the object to explicitly call SetForegroundWindow on its editing window. This ensures that the object's window will be visible to the user even if another process originally obscured it. For more information see SetForegroundWindow and SetActiveWindow."

Тобишь я понимаю что надо активизировать hWnd и он отрисует мне OleObject.
Cмотрел Spy-ем какие сообщения получает hWnd и полностью их копировал и посылал до обработчика — и нифига. Изгалялся по-разному. Активизирповал повторно окно, сообщение проходило но на OleObject действия не возымело.

Где у меня ошибка помимо ДНК?
Re: Отображение ActiveX в целом и IWebBrowser2 в частности
От: al Россия  
Дата: 26.02.05 20:07
Оценка: 3 (1)
Мой долгий личный опыт общения с IE позволяет мне утверждать, что тот документ, который возвращается в XP сразу после вызова Navigate не совсем полноценный. Уже не помню в чем были грабли, но пользоваться им по нормальному нельзя. Документ соедует запрпшивать после прихода сообщения DocumentComplete. Т.е. порядок действий такой:

1) Создаем WebBrowser и подключаемся к его событиям.
2) Вызываем Navigate
3) Возвращаемся в цикл рассылки сообщений Windows. Это очень важно, т.к. он нужен IE для того чтобы "прочухаться"
4) Ждем событие DocumentComplete
5) Получаем Document


Re[2]: Отображение ActiveX в целом и IWebBrowser2 в частност
От: ilyxan  
Дата: 27.02.05 00:36
Оценка:
Здравствуйте, al, Вы писали:

al>Мой долгий личный опыт общения с IE позволяет мне утверждать, что тот документ, который возвращается в XP сразу после вызова Navigate не совсем полноценный. Уже не помню в чем были грабли, но пользоваться им по нормальному нельзя. Документ соедует запрпшивать после прихода сообщения DocumentComplete. Т.е. порядок действий такой:


al>1) Создаем WebBrowser и подключаемся к его событиям.

al>2) Вызываем Navigate
al>3) Возвращаемся в цикл рассылки сообщений Windows. Это очень важно, т.к. он нужен IE для того чтобы "прочухаться"
al>4) Ждем событие DocumentComplete
al>5) Получаем Document

Огромнейшее спасибо, отловил DocumentComplete запросил там Document и всё заработало под windows 98.
Мои благодарности незнают границ
А мой личный опыт с embedded browser только 2 дня и из низ 1,9 с это проблемой
Вопросик паралельно
От: Obukhov Россия  
Дата: 01.03.05 13:55
Оценка:
Тоже мучаюсь с IE.
Есть страничка с некоторым количеством ActiveX. При загрузке страницы нужно получить список своих ActiveX у меня получилось.
Но после этого нужно как то получить координаты этого активикса на странице, что бы затем сверху добавить свой behavior для отрисовки дополнительных "связей" между ними на самой страничке.
Если у активикса стоит стиль style="LEFT: 160px; TOP: 120px; POSITION: absolute" то все замечательно, выдергиваем значения координат из интерфейса IHTMLStyle.
А вот если такого стиля нет, то добыть координаты у меня никак не получается

Может сталкивались с этим ? Как можно координаты добыть ?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Возможное решение
От: Obukhov Россия  
Дата: 02.03.05 07:31
Оценка:
Нашел сейчас документ один
help://MS.MSDNQTR.2005JAN.1033/ProgIE/workshop/browser/editing/editdesignerimp2.htm

Там есть пример с функцией CAnnotator::OpenCommentEditBox(IHTMLElement* pSrcElem)

Вот если в ней покопаться, то может что и получится.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Возможное решение
От: Obukhov Россия  
Дата: 04.03.05 06:34
Оценка:
O>Нашел сейчас документ один
O>help://MS.MSDNQTR.2005JAN.1033/ProgIE/workshop/browser/editing/editdesignerimp2.htm

O>Там есть пример с функцией CAnnotator::OpenCommentEditBox(IHTMLElement* pSrcElem)


O>Вот если в ней покопаться, то может что и получится.


Данный способ работает далеко не всегда, и к тому же все равно не получается точно найти координаты активикса
Может кто еще знает как можно сделать ?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Отображение ActiveX в целом и IWebBrowser2 в частности
От: nik_unt  
Дата: 11.11.05 09:29
Оценка:
Здравствуйте, ilyxan, Вы писали:

I>Собственно есть HWND окошечко. При событие WM_CREATE создаю Ole объектик:

I>
I>IWebBrowser2* pBrowser = NULL;
I>IOleObject* pOleObject = NULL;
I>OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, 0, (IOleClientSite*)&h, &oStore, (void**)&pOleObject);
I>...
I>pOleObject->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite*)&h, 0, hWnd, &rc);
I>...
I>pOleObject->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
I>pBrowser->put_Left(0);
I>pBrowser->put_Top(0);
I>pBrowser->put_Width(rc.right);
I>pBrowser->put_Height(rc.bottom);
I>pBrowser->Navigate(L"about:blank", 0, 0, 0, 0);
I>pBrowser->put_Visible(true);
I>pBrowser->Release();
I>


I>Все создаётся просто на ура... НО


У меня татая проблема: надо создать WebBrowser. Импленентацию IOleClientSite и IStorage взял с cwebpage (нераз встречаеться в форуме). Пример работает. Перевел на с++. Вызов OleCreate возвращает "Не могу найти файл". Пробовал перед OleCreate вставить CoLoadLibrary("shdocvw.dll",true), ответ: Класс не зарегистрирован. CoCreateInstance аналогично, только с NULL оказателем на IUnknown.
Что я не так сделал?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.