我为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);
}
Run Code Online (Sandbox Code Playgroud)
如果我在已经恢复的窗口上使用它,它将只调用SetForegroundWindow,窗口将到达z顺序的顶部并获得焦点而没有任何闪烁.
但是如果我在最小化窗口上调用它,我还必须使用SetWindowPlacement将窗口恢复到恢复状态.这是导致窗口重绘和闪烁的原因:/
必须有一种方法可以在没有闪烁的情况下恢复最小化的窗口,因为内置的窗口管理器可以做到这一点.
一种方法是使用双缓冲技术:绘制到离屏位图,然后恢复,然后将位图传输到屏幕。但如果恢复最小化窗口是唯一需要的情况,这似乎有点矫枉过正。也许其他人会有更好的想法?
另外,如果您绘制整个窗口客户区域,您可以禁用 WM_ERASEBKGND(或者更确切地说,说您处理了它但不执行任何操作)以避免不必要的填充背景然后重绘序列。
| 归档时间: |
|
| 查看次数: |
2693 次 |
| 最近记录: |