如何在存储设备上下文中绘制窗口?

时间:2009-06-12 22:04:09

标签: winapi

在我的应用中,用户双击表格行以打开对话框窗口。问题是窗口立即显示 - 我想让窗口显示为“跳出”表格行(就像Windows从任务栏中跳出'一样)。为此,我需要将对话框窗口绘制到存储设备上下文中 - 如何在不先将其绘制到屏幕的情况下执行此操作?

由于

------------------编辑----------------------

@bubbafat: 谢谢 - 是的,我需要使用CreateCompatibleDC,然后将内存DC的大小设置为对话框窗口的大小。但后来我需要将窗口的“图片”绘制到存储设备像素。这将允许我绘制'弹出'动画的每一帧 - 即:

  • 第1帧:从中复制图像 缓冲到屏幕正常10% 大小和10%不透明度
  • 第2帧:复制 从缓冲区到图像的图像 屏幕正常尺寸为20%,屏幕尺寸为20% 不透明度

3 个答案:

答案 0 :(得分:1)

DrawAnimatedRects 函数就是“跳出”任务栏的功能 - 不需要自己渲染窗口动画。

修改:除非在Vista上无效。这是一些等效的代码:

// DrawAnimatedRects(wnd->GetSafeHwnd(), IDANI_CAPTION, animateFrom, &rect);
const DWORD MILLIs = 500;
DWORD startTime = GetTickCount();
DWORD now = startTime;
CRect offset(rect.left - animateFrom->left, rect.top - animateFrom->top,
             rect.right - animateFrom->right, rect.bottom - animateFrom->bottom);
wnd->Invalidate();
while (now - MILLIs < startTime)
{
    int fraction100 = (int) (((now - startTime) * 100) / MILLIs);
    CRect step(animateFrom->left + (fraction100 * offset.left) / 100,
               animateFrom->top + (fraction100 * offset.top) / 100,
               animateFrom->right + (fraction100 * offset.right) / 100,
               animateFrom->bottom + (fraction100 * offset.bottom) / 100);
    wnd->SetWindowPos(0, step.left, step.top,
                      step.right - step.left, step.bottom - step.top,
                      SWP_NOZORDER);
    wnd->ShowWindow(SW_SHOWNORMAL);
    Sleep(5);
    now = GetTickCount();
}

答案 1 :(得分:1)

如果您尝试将窗口绘制到内存DC中,请考虑向其发送WM_PRINT消息。假设您的窗口过程在正常情况下没有做任何特别奇怪的事情,它应该将所有内容渲染到您的DC中。动画可以从那里拍摄。

答案 2 :(得分:0)

听起来你的问题是“我如何创建一个与我的屏幕兼容的内存设备上下文,以便我可以绘制它?”在这种情况下,答案是使用CreateCompatibleDC。如果那不是您的问题,那么请提供其他信息,以便在您遇到问题的过程中更清楚。