Полезная информация

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№106-03-2009 14:39:29

lemax
Участник
 
Группа: Members
Зарегистрирован: 12-11-2008
Сообщений: 36
UA: Opera 9.6

открыть окно XUL и получить возможность управлять xul содержимым

XPCOM компонент на С++.
Как открыть диалоговое окно xul( window.openDialog(.....,args) ), но из С++?
Как, потом, получить возможность влиять на внешний вид окна (влиять на xul элементы окна)?


В этом коде nsIWindowWatcher::OpenWindow возвращает nsIDOMWindow, через который не удается влиять на xul элементы:

Выделить код

Код:

nsCOMPtr<nsIServiceManager> servMan;
			nsresult rv = NS_GetServiceManager(getter_AddRefs(servMan));
			NS_ENSURE_SUCCESS (rv, 1);

			nsCOMPtr<nsIWindowWatcher> window;
			rv = servMan->GetServiceByContractID("@mozilla.org/embedcomp/window-watcher;1",
				NS_GET_IID(nsIWindowWatcher),
				getter_AddRefs(window));
			NS_ENSURE_SUCCESS (rv, 2);


			nsCOMPtr<nsIDOMWindow> domWindow;
			rv=window->OpenWindow(nsnull,"chrome://ext/content/file.xul","Name","dialog=no,chrome,centerscreen,scrollbars=yes,resizable=yes",nsnull,getter_AddRefs(domWindow));
			NS_ENSURE_SUCCESS (rv, 7);

Отсутствует

 

№207-03-2009 17:42:20

lemax
Участник
 
Группа: Members
Зарегистрирован: 12-11-2008
Сообщений: 36
UA: Opera 9.6

Re: открыть окно XUL и получить возможность управлять xul содержимым

Может кто скажет:
Как с помощью С++ можно "построить" диалоговое окно браузера FireFox?

P.S: Понять природу хотелось бы

Отсутствует

 

№308-07-2009 21:04:13

Ёсъ
Участник
 
Группа: Members
Зарегистрирован: 08-07-2009
Сообщений: 4
UA: Firefox 3.0

Re: открыть окно XUL и получить возможность управлять xul содержимым

Пытаюсь сделать тоже самое, вызвать диалог из c++. Но я пошёл другим путём:

Выделить код

Код:

nsCOMPtr<nsIWebBrowser> pBrowser (do_GetService("@mozilla.org/embedding/browser/nsWebBrowser;1"));

nsCOMPtr<nsIDOMWindow> domWindow;
pBrowser->GetContentDOMWindow(getter_AddRefs(domWindow));

nsCOMPtr<nsIDOMWindowInternal> domWindowInt;
domWindowPrivate->GetPrivateRoot(getter_AddRefs(domWindowInt));

а уже из domWindowInt пытаюсь вызвать openDialog(.....);

но проблема в строке с методом GetContentDOMWindow, после неё domWindow нуловый.
может кто-нибудь знает в чём проблема?

Отсутствует

 

№415-07-2009 14:37:42

lemax
Участник
 
Группа: Members
Зарегистрирован: 12-11-2008
Сообщений: 36
UA: Safari 4.0

Re: открыть окно XUL и получить возможность управлять xul содержимым

Ёсъ пишет

Пытаюсь сделать тоже самое, вызвать диалог из c++. Но я пошёл другим путём:

Выделить код

Код:

nsCOMPtr<nsIWebBrowser> pBrowser (do_GetService("@mozilla.org/embedding/browser/nsWebBrowser;1"));

nsCOMPtr<nsIDOMWindow> domWindow;
pBrowser->GetContentDOMWindow(getter_AddRefs(domWindow));

nsCOMPtr<nsIDOMWindowInternal> domWindowInt;
domWindowPrivate->GetPrivateRoot(getter_AddRefs(domWindowInt));

а уже из domWindowInt пытаюсь вызвать openDialog(.....);

но проблема в строке с методом GetContentDOMWindow, после неё domWindow нуловый.
может кто-нибудь знает в чём проблема?

Попробуем так https://developer.mozilla.org/en/Mozilla_embedding_APIs_overview

Выделить код

Код:

nsresult rv; 
      nsCOMPtr<nsIBaseWindow> baseWindow; 
      nsCOMPtr<nsIWebBrowser> webBrowser; 

      // Create a nsWebBrowser instance... 
      webBrowser = do_CreateInstance(NS_WEBBROWSER_CONTRACTID, &rv); 
      if (NS_FAILED(rv)) return rv; 

      // Give the WebBrowser a pointer to the embedding component which 
      // implements the callback interfaces.  Replace 'this' with 
      // an appropriate object... 
      rv = webBrowser->SetContainerWindow((nsIWebBrowserChrome*)this); 
      if (NS_FAILED(rv)) return rv; 

      baseWindow = do_QueryInterface(webBrowser); 

      // Initialize the WebBrowser with a native parent window 
      // (ie. HWND on Win32).  Replace 'nativeWindow' with a 
      // reference to an appropriate native resource... 
      rv = baseWindow->InitWindow(nativeWindow,   // Native window 
                                  nsnull,         // Always nsnull. 
                                  x, y, cx, cy);  // Initial dimensions... 
      if (NS_FAILED(rv)) return rv; 

      // Create the child window for the WebBrowser. 
      rv = baseWindow->Create(); 
      if (NS_FAILED(rv)) return rv; 

      // At this point webBrowser contains the new initialized instance 
      // of the nsWebBrowser component... 
      // Save webBrowser before it goes out of scope :-)

Отсутствует

 

№527-07-2009 18:00:03

Ёсъ
Участник
 
Группа: Members
Зарегистрирован: 08-07-2009
Сообщений: 4
UA: Firefox 3.0

Re: открыть окно XUL и получить возможность управлять xul содержимым

спасибо, lemax, за помощь.

резюмирую.

получилось сделать двумя способами:
1. через nsIWindowWatcher и OpenWindow.
не устраивал, потому что нельзя было сделать окно модальным...

2. а так меня всё устроило:
    nsCOMPtr <nsIWindowMediator> mediator(do_GetService("@mozilla.org/appshell/window-mediator;1"));
    nsIDOMWindowInternal *win;
    mediator->GetMostRecentWindow(L"navigator:browser",&win);
    nsCOMPtr<nsIDOMWindow> tWindow;

    win->OpenDialog(
        NS_LITERAL_STRING("chrome://******.htm"),
        NS_LITERAL_STRING(""),
        NS_LITERAL_STRING("chrome,dialog,modal,centerscreen,resizable=no"),
        args,
        getter_AddRefs(tWindow)
        );

далее, обрабатываю параметры полученные из диалога.
т.к. изменять что-то в открытом окне из CPP мне не надо, то остановился, на достигнутом.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]