2011-05-27 2 views
0

J'ai des problèmes avec l'utilisation de BitBlt dans ce programme. Vous redimensionnez la fenêtre et l'ellipse est redimensionnée avec. Bien sûr, avec la méthode hdc normale, il est saccadé et flickery. J'ai essayé la méthode BitBlt, mais cela ne fonctionne pas non plus (probablement parce que je le fais mal). Quelqu'un peut-il réparer ce que je ne peux pas faire? ThanxProblème BitBlt GDI

bool sizing; //global 
case WM_PAINT: 
    { 
     RECT rect; 
     GetClientRect(hwnd, &rect); 
     hdc = BeginPaint(hwnd, &ps); 
     mem = CreateCompatibleDC(hdc); 
     SelectObject(mem, GetStockObject(HOLLOW_BRUSH)); 
     if(sizing) 
     { 
     Ellipse(mem,rect.left, rect.top, rect.right, rect.bottom); 
     } 
    BitBlt(hdc, rect.left, rect.top, rect.left - rect.right, rect.top -rect.bottom , mem, rect.left, rect.top, SRCCOPY); 
     DeleteDC(mem); 
     EndPaint(hwnd, &ps); 
     break; 
    } 
    case WM_SIZE: 
     sizing = true; 
     break; 
+0

Vous devrez gérer WM_ERASEBKGND pour éviter le scintillement. –

Répondre

6

On dirait que vous essayez de dessiner un bitmap à base de mémoire, puis BitBlt que l'écran, pour éviter le scintillement? Le premier problème concerne le flicker: vous devez d'abord remplacer WM_ERASEBKGND comme le signale Hans - sinon Windows effacera l'arrière-plan avec le pinceau de fenêtre (de RegisterClass), et cet effacement est la cause habituelle du flicker. Le problème suivant est que vous utilisez un DC "vide": CreateCompatibleDC vous donne un DC - qui est juste un contexte de dessin - mais le contexte contient un bitmap de 1 pixel par 1 pixel. Pour dessiner hors écran, vous avez besoin d'un DC et un bitmap. Prenez le temps de lire the MSDN page for CreateCompatible - il appelle ce problème exact.

Si vous êtes nouveau dans ce domaine, pensez à un bitmap comme toile de fond sur laquelle vous dessinez - le DC est juste la structure de support pour faire ce dessin. Comme votre code l'indique, vous avez installé le chevalet et les pinceaux, mais vous ne peignez rien.

L'approche habituelle est ici:

  • CreateCompatibleDC pour créer le DC
  • CreateCompatibleBitmap pour créer le bitmap que vous allez réellement attirer
  • SelectObject votre nouvelle image dans la mémoire DC
  • Tirage au sort à la mémoire DC - qui s'inspire de l'image bitmap que vous avez sélectionné
  • BitBlt de la mémoire DC (c'est-à-dire votre bitmap, qui y est sélectionnée) à celle de WM _PAINT
  • Nettoyage: SélectionnezObjecter le bitmap d'origine dans la mémoire DC et supprimez le bitmap et le contrôleur de domaine.