2009-06-12 64 views
0

在我的應用程序中,用戶雙擊表格行打開對話窗口。問題在於窗口即時顯示 - 我想讓窗口看起來像跳出表格行(就像窗口從任務欄中跳出一樣)。爲此,我需要將對話窗口繪製到內存設備上下文中 - 如何在不首先將其繪製到屏幕上的情況下如何執行此操作?如何繪製一個窗口到內存設備上下文?

謝謝

------------------編輯----------------------

@bubbafat: 謝謝 - 是的,我需要使用CreateCompatibleDC,然後將內存DC的大小設置爲對話窗口的大小。但是之後我需要在窗口繪製一個「圖片」給存儲設備像素。然後這將允許我提請「彈出」動畫的每一幀 - 即:

  • 幀1:將圖像從 緩衝液中的10%正常 尺寸和10%的不透明度
  • 複製到屏幕
  • 2幀:從緩衝器到 屏幕複製 圖像在20%正常尺寸和20%的不透明度

回答

1

如果您試圖將窗口繪製到內存DC中,請考慮向其發送WM_PRINT消息。假設你的窗口過程在正常情況下沒有做任何特別奇怪的事情,它應該將所有東西都渲染到DC中。動畫可以從那裏拍攝。

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(); 
} 
+0

謝謝 - 看起來很有希望! – Mark 2009-06-12 22:54:16

0

這聽起來像你的問題是「我怎麼創建一個與我的屏幕兼容,這樣我可以畫給它的內存設備上下文?」在這種情況下,答案是使用CreateCompatibleDC。如果這不是你的問題,那麼請提供更多的信息,以便在你遇到問題的過程中更加清楚。

+0

請查看原文,瞭解更多詳情 – Mark 2009-06-12 22:46:31

相關問題