控制嵌入式Vim窗口的大小(在插件模式下)

时间:2011-09-01 08:47:50

标签: windows winapi qt vim

我正在尝试在Windows上的Qt应用程序中嵌入一个GVim窗口,方法是获取QWidget的{​​{3}}并使用winId将其传递给Vim。

我有两个问题:

  1. 实际的Vim窗口只能有一定的大小(因为它有一个整数列和行),所以它会小于嵌入它的QWidget。如何获得允许的(字体相关的)大小,以便我可以相应地调整QWidget的大小?

  2. Vim的大小调整仍处于活动状态,并且在QWidget中调整Vim 的大小,当然不会改变QWidget的大小。如何防止这种情况并禁用Vim调整大小?

  3. 编辑:我正在尝试将Vim窗口与PDF查看器捆绑在一起以用作LaTeX预览器

1 个答案:

答案 0 :(得分:1)

要嵌入外部应用程序,首先要从窗口中删除样式,然后才重新显示它:

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

很适合我:)