winapi - Styring af størrelsen af ​​et indlejret Vim-vindue (i plugin-tilstand)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at indlejre et GVim-vindue inde i en Qt-applikation på Windows ved at få winId af en QWidget og sende det til Vim ved hjælp af --windowid. [8] [9]]]


Jeg har to problemer:



  1. Det egentlige Vim-vindue kan kun have bestemte størrelser (fordi det har et helt tal kolonner og rækker), så det vil være mindre end QWidget, der tjener det. Hvordan kan jeg få de tilladte (skrifttypeafhængige) størrelser, så jeg kan dimensionere QWidget i overensstemmelse hermed?

  2. Vim er stadig aktiv, og ændrer størrelsen på Vim indenfor QWidget, selvfølgelig uden at ændre størrelsen af ​​QWidget. Hvordan kan jeg forhindre dette og deaktivere Vim resize-grebet?



EDIT: Jeg forsøger at bundle et Vim-vindue sammen med en PDF-viewer, der skal bruges som en LaTeX previewer

Bedste reference


Hvis du vil integrere din eksterne applikation, skal du først fjerne stilarterne fra vinduet, og først derefter reparere det:


void CWinSystemTools::reparentWindow(HWND hWindow, QWidget *widget)
    {
    if (hWindow == 0)
        return;
    DWORD style = GetWindowLong(hWindow, GWL\_STYLE);
    style = style & ~(WS\_POPUP);
    style = style & ~(WS\_OVERLAPPEDWINDOW);
    style = style | WS\_CHILD;
    SetWindowLong(hWindow, GWL\_STYLE, style);

    SetParent(hWindow, widget->winId());
    }


For at opretholde størrelsen korrekt skal du gennemføre størrelsesbegivenheden:


void TrVisApp::resizeEvent(QResizeEvent *event)
    {
    resizeClients();
    }


og videre:


void TrVisApp::resizeClients()
    {
    if (hWndGvim != 0)
        CWinSystemTools::resizeWindowToWidget(hWndGvim, ui.wdgGvim->geometry());
    }


hvor:


void CWinSystemTools::resizeWindowToWidget(HWND hWnd, QRect geometry, bool moveToTopLeftCorner = true)
    {
    int x = geometry.left();
    int y = geometry.top();
    if (moveToTopLeftCorner)
        {
        x = 0;
        y = 0;
        }
    int width = geometry.width();
    int height = geometry.height();
    SetWindowPos(hWnd, HWND\_TOP, x, y, width, height, SWP\_NOACTIVATE);
    }


Fungerer pænt for mig :)