2009-06-12 14 views
0

In meiner App doppelklickt der Benutzer auf eine Tabellenzeile, um ein Dialogfenster zu öffnen. Das Problem ist, dass das Fenster sofort angezeigt wird - ich möchte das Fenster so aussehen lassen, als ob es aus der Tabellenzeile herausspringt (auf die gleiche Weise, wie Fenster aus der Taskleiste herausspringen). Dazu muss ich das Dialogfenster auf einen Speichergerätekontext zeichnen - wie kann ich das tun, ohne es vorher auf den Bildschirm zu zeichnen?Wie zeichnet man ein Fenster zu einem Speichergerätekontext?

Dank

------------------ bearbeiten ----------------------

@bubbafat: Danke - ja, ich muss CreateCompatibleDC verwenden, dann legen Sie die Größe des Arbeitsspeichers DC auf die Größe des Dialogfelds. Aber dann muss ich ein 'Bild' des Fensters zu den Speichergerätpixeln zeichnen. Dies wird dann erlauben Sie mir jeden Rahmen der ‚Pop-up‘ Animation zu ziehen - das heißt:

  • Frame 1: Kopieren Sie das Bild aus dem Puffer auf den Bildschirm bei 10% normale Größe und 10% Opazität
  • Frame 2: Kopieren das Bild aus dem Puffer an den Schirm bei 20% normaler Größe und 20% Opazität
  • etc

Antwort

1

Wenn Sie versuchen, das Fenster in einen Speicher-DC zu zeichnen, sollten Sie die WM_PRINT-Nachricht senden. Vorausgesetzt, Ihr Fensterprozedur tut im Normalfall nichts besonders merkwürdig, sollte alles in Ihren DC rendern. Die Animation kann von dort übernommen werden.

1

DrawAnimatedRects die Funktion ist, was das „j tut "für die Taskleiste" - es gibt keine Notwendigkeit, die Fensteranimation selbst zu rendern.

Bearbeiten: Außer, dass das nicht auf Vista funktioniert. Hier einige entsprechende Code:

// 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

danke - das sieht vielversprechend aus! – Mark

0

Es ist wie Ihre Frage klingt ist „wie kann ich einen Speichergerätekontext erstellen, die mit meinem Bildschirm kompatibel ist, so dass ich es ziehen kann?“ In diesem Fall lautet die Antwort CreateCompatibleDC. Wenn das nicht Ihre Frage ist, dann stellen Sie bitte zusätzliche Informationen zur Verfügung, so dass es klarer ist, wo genau Sie im Prozess Probleme haben.

+0

Bitte lesen Sie den ursprünglichen Beitrag für weitere Details – Mark

Verwandte Themen