如何在没有闪烁的情况下恢复最小化窗口

时间:2008-12-08 17:46:28

标签: c# windows winapi

我为Vista制作了一个暴露克隆,有时需要恢复最小化的窗口。 我已经设法使用SetWindowPlacement函数执行此操作。 问题是,当窗口很好地滑入屏幕后,这也会重新塑造看起来像垃圾的窗口。

这是我用来将窗口置于顶部并给予焦点的代码:

    private static void ActivateWindow(IntPtr windowToShow)
    {
        RectAPI r = new RectAPI();
        Win32.GetWindowRect(windowToShow, ref r);

        if (r.top == -32000) //r.top is -32000 if the window is in minimized state
        {
            WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
            Win32.GetWindowPlacement(windowToShow, ref wp);

            if (wp.flags == WindowPlacementFlags.WPF_RESTORETOMAXIMIZED)
                wp.showCmd = cmdShow.SW_SHOWMAXIMIZED;
            else
                wp.showCmd = cmdShow.SW_RESTORE;

            Win32.SetWindowPlacement(windowToShow, ref wp);
        }

        Win32.SetForegroundWindow(windowToShow);
    }

如果我在已经恢复的窗口上使用它,它将只调用SetForegroundWindow,窗口将到达z顺序的顶部并获得焦点而没有任何闪烁。

但是如果我在最小化的窗口上调用它,我还必须使用SetWindowPlacement将窗口恢复到恢复状态。这是导致窗口重新绘制和闪烁的原因:/

必须有一种方法可以在没有闪烁的情况下恢复最小化的窗口,因为内置的窗口管理器会这样做。

3 个答案:

答案 0 :(得分:2)

一种方法是使用双缓冲技术:绘制到屏幕外的位图,然后恢复,然后将位图blit到屏幕。但是,如果恢复最小化窗口是唯一需要它的情况,那似乎有些过分。也许其他人会有更好的想法?..

另外,如果你绘制整个窗口客户区,你可以禁用WM_ERASEBKGND(或者更确切地说,你处理它但不做任何事情)以避免不必要的填充背景然后重绘序列。

答案 1 :(得分:1)

MSDN上的

This link将解释您希望如何处理窗口绘制。窗口事件(如窗口刷新或最小化/最大化)将需要重新绘制窗口或窗口区域。

快乐编码!!

答案 2 :(得分:0)

我是OP ...偶然吃了我的饼干。

研究了windows flip3d和任务栏如何更接近地管理它们,他们实际重绘了之前的窗口他们开始了拇指的动画。 尝试最小化窗口,然后使用flip3d恢复它,在恢复之前,您将在3d窗口上看到一个小的闪烁。

用我的应用程序尝试了同样的事情,它看起来更好,不完美但可以接受:/