Страницы: 1
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);
Отсутствует
Пытаюсь сделать тоже самое, вызвать диалог из 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 нуловый.
может кто-нибудь знает в чём проблема?
Отсутствует
Пытаюсь сделать тоже самое, вызвать диалог из 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 :-)
Отсутствует
спасибо, 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 мне не надо, то остановился, на достигнутом.
Отсутствует
Страницы: 1