Управление размером встроенного окна Vim (в режиме плагина) - PullRequest
0 голосов
/ 01 сентября 2011

Я пытаюсь встроить окно GVim в приложение Qt в Windows, получив winId из QWidget и передав его в Vim с помощью --windowid.

У меня две проблемы:

  1. Фактическое окно Vim может иметь только определенные размеры (потому что оно имеет целое число столбцов и строк), поэтому оно будет меньше, чем QWidget, который его встраивает. Как я могу получить разрешенные (зависящие от шрифта) размеры, чтобы я мог соответственно изменить размер QWidget?

  2. Ручка изменения размера Vim все еще активна и изменяет размеры Vim внутри QWidget, разумеется, без изменения размера QWidget. Как я могу предотвратить это и отключить ручку изменения размера Vim?

РЕДАКТИРОВАТЬ: я пытаюсь связать окно Vim вместе со средством просмотра PDF для использования в качестве средства предварительного просмотра LaTeX

1 Ответ

1 голос
/ 12 января 2012

Чтобы встроить ваше внешнее приложение, сначала удалите стили из окна, и только после этого перефразируйте его:

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());
    }

Теперь, чтобы правильно сохранить изменение размера, реализуйте событие resize:

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

и далее:

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

где:

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);
    }

Прекрасно работает для меня:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...