We value your input! Please participate in Archicad 28 Home Screen and Tooltips/Quick Tutorials survey
2020-02-02 05:43 PM - last edited on 2022-10-04 04:22 PM by Daniel Kassai
#include "APICommon.h" #include "ResourceIDs.hpp" #include "DG.h" #include <windows.h> // Window callback procedure LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); break; default: return ::DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } // creating a window with the Windows API HWND CreateWindow(WNDCLASS wc, HWND hwndMainWindow) { // Create the window. HWND hwnd = ::CreateWindowEx(0, wc.lpszClassName, L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndMainWindow, NULL, wc.hInstance, NULL); if (hwnd == NULL) { return 0; } ::ShowWindow(hwnd, SW_MAXIMIZE); return hwnd; } bool OpenBrowser() { HWND hwndMainWindow = ACAPI_GetMainWindow(); // disable the main window of Archicad ::EnableWindow(hwndMainWindow, FALSE); // get instance of application HINSTANCE hInstance = ACAPI_GetExtensionInstance(); // create window class WNDCLASS wc = { }; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = L"Browser Window Class"; // register window class if (!::RegisterClass(&wc)) { return false; } bool bResult = false; DG::Browser* browser = nullptr; // create a modal window HWND hWndBrowser = CreateWindow(wc, hwndMainWindow); if (hWndBrowser != nullptr) { RECT rect; const BOOL bRect = GetWindowRect(hWndBrowser, &rect); if (bRect) { const DG::Rect dgRect((short)rect.left, (short)rect.top, (short)rect.right, (short)rect.bottom); // create browser in modal window browser = new DG::Browser(dgRect); browser->SetUpForNativeWindow(hWndBrowser, dgRect); browser->LoadURL("https://google.com/"); // Main message loop: MSG msg; while (::GetMessage(&msg, NULL, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } bResult = true; } } // unregister window class, freeing the memory ::UnregisterClass(wc.lpszClassName, hInstance); // enable the main window of Archicad ::EnableWindow(hwndMainWindow, TRUE); // TODO: crashes if deleted //delete browser; return bResult; }
Solved! Go to Solution.
2020-02-04 02:40 PM
2020-02-02 06:59 PM
Martin wrote:Would there be a problem creating the window using the ARCHICAD API rather than the Windows API? I believe your efforts are much more likely to be successful if you use one API for your UI workflow.
I'd like to use the DG::Browser embedded in a modal window created by the Windows API.
2020-02-04 01:14 AM
2020-02-04 11:21 AM
2020-02-04 01:40 PM
#include "DialogBrowser.h" #include "APICommon.h" #include "ResourceIDs.hpp" #include "DG.h" #include "DGModule.hpp" DG::Browser* browser; // ----------------------------------------------------------------------------- // browser dialog handler (callback) // ----------------------------------------------------------------------------- static short DGCALLBACK DialogBrowserHandler( short message, short dialogID, short item, DGUserData /*userData*/, DGMessageData /*msgData*/) { short result = 0; switch (message) { case DG_MSG_INIT: { HWND hWndMain = ACAPI_GetMainWindow(); if (hWndMain) { HWND hWndDialog = GetWindow(hWndMain, GW_HWNDPREV); if (hWndDialog) { RECT rect; if (GetWindowRect(hWndDialog, &rect)) { // create browser in modal window const DG::Rect dgRect((short)rect.left, (short)rect.top, (short)rect.right, (short)rect.bottom); browser = new DG::Browser(dgRect); browser->LoadURL("https://google.com/"); } } } } break; case DG_MSG_CLICK: { switch (item) { case DG_OK: case DG_CANCEL: result = item; break; } } break; case DG_MSG_CLOSE: { result = item; } break; } return result; } bool OpenBrowser() { // Get the browser dialog from our resource file const short result = DGModalDialog(ACAPI_GetOwnResModule(), ID_DIALOG_BROWSER, ACAPI_GetOwnResModule(), DialogBrowserHandler, 0); return result; }And the .grc:
2020-02-04 02:05 PM
Browser (const Panel& panel, short item);
2020-02-04 02:18 PM
2020-02-04 02:40 PM