如何在WM_SIZE上强制重绘IE控件?

时间:2014-09-22 18:29:34

标签: winapi activex

在我的Win32应用程序中,我在对话框中嵌入了Internet Explorer ActiveX控件。当用户调整对话框大小时,我处理WM_SIZE事件并设置IE控件的大小以占用对话框的客户端矩形。

虽然控件的大小调整有效,但控件本身不会刷新。我想知道是否有一些命令我可以发送到控件刷新/重绘自己。问候。

这是我要调整大小的DlgProc代码:

case WM_SIZE:   {
    HWND hX = GetDlgItem(hh, IDC_EXPLORER);
    if (hX) {
        RECT rc = { 0 };
        GetClientRect(hh, &rc);
        ::SetWindowPos(hX, 0, 0, 0, rc.right, rc.bottom, SWP_SHOWWINDOW);
        // ::MoveWindow(hX, 0, 0, rc.right, rc.bottom, TRUE);
    }
    return 0;
}

我还试过MoveWindow而不是SetWindowPos。但是,它似乎没有任何区别。

1 个答案:

答案 0 :(得分:0)

我有类似的代码。一个嵌有IE Ax控件的对话框(以及工具栏和状态栏)。我所做的只是一个MoveWindow(),其中bRepaint = TRUE,IE将重绘。

wndIE是我的成员CWindow ATL包装器,但是如果你只使用直接的HWND,请将MoveWindow()调整为。

// Common private function to handle resizing of the child windows on our browser dialog.
void CBrowserWindow::resize_dialog_and_controls(RECT *rcClient) {

// Tell the toolbar to resize 
m_wndToolbar.SendMessage(TB_AUTOSIZE, 0, 0);

RECT rcTool;
m_wndToolbar.GetClientRect(&rcTool);
int iToolHeight = rcTool.bottom - rcTool.top;

// Tell the statusbar to auto-size
m_wndStatus.SendMessage(WM_SIZE, 0, 0);

// Now get the new height of the statusbar 
RECT rcStatus;   
m_wndStatus.GetClientRect(&rcStatus); 
int iStatusHeight = rcStatus.bottom - rcStatus.top;

// Now set the adjusted size of our IE host window
rcClient->top += iToolHeight;
rcClient->bottom -= iStatusHeight;

wndIE.MoveWindow(rcClient, true);
}