在我的应用中,用户双击表格行以打开对话框窗口。问题是窗口立即显示 - 我想让窗口显示为“跳出”表格行(就像Windows从任务栏中跳出'一样)。为此,我需要将对话框窗口绘制到存储设备上下文中 - 如何在不先将其绘制到屏幕的情况下执行此操作?
由于
------------------编辑----------------------
@bubbafat: 谢谢 - 是的,我需要使用CreateCompatibleDC,然后将内存DC的大小设置为对话框窗口的大小。但后来我需要将窗口的“图片”绘制到存储设备像素。这将允许我绘制'弹出'动画的每一帧 - 即:
答案 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。如果那不是您的问题,那么请提供其他信息,以便在您遇到问题的过程中更清楚。