Affichage bitmap synchronisé avec le rafraichissement de l'ecran

Affichage bitmap synchronisé avec le rafraichissement de l'ecran - C++ - Programmation

Marsh Posté le 24-02-2006 à 13:39:35    

Bonjour,
 
Voila mon problème, j'ai créé une application MDI avec les mfc, j'affiche une image bitmap dans une fenetre, cependant, lorsqu'on redimensionne la taille de la fenêtre, la fonction OnDraw est appellé très souvent et réaffiche l'image aussi très souvent, du coup il y a un effet de clipping (je ne suis pas sur que ce sois le mot). Je sais qu'il est possible de faire en sorte de modifier le contexte de periferique (CDC *pDC) à chaques raffraichissement de de l'ecran(et non a chaque fois que la fonction ondraw est affiché) ce qui résoudrait le problème, seulement je ne trouve pas la sintaxe pour faire cela. si quelqu'un a la solution je l'en remercie d'avance (toute autre solution pour résoudre mon problème de clignotement est aussi la bienvenue).
je met le morceau de code que j'utilise: (je ne cherche pas specialement à optimiser le code au niveau de la vitesse d'affichage, c'est une application plutot scientifique, cependant le fait que l'image clignotte un peu a certains moment fait pas très propre lors de présentations donc j'aimerai bien corriger ce problème)
 
 
void CViewerView::OnDraw(CDC* pDC)
{
 CViewerDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;
 CvImage * working_image=((CViewerDoc *)GetDocument())->GetImage();
 
    if(working_image!=NULL)
 {
  DisplayImage(working_image, pDC) ;
 }
 
 // TODO : ajoutez ici le code de dessin pour les données natives
}
 
 
void CViewerView::DisplayImage( CvImage * in_pCvImage, CDC *pDC)  
{
 // Create BITMAPINFO
 
 BITMAPINFO bmpI;
 
 ZeroMemory(&bmpI.bmiHeader, sizeof(BITMAPINFOHEADER));
 bmpI.bmiHeader.biWidth = in_pCvImage->GetWidth();
 bmpI.bmiHeader.biHeight = -in_pCvImage->GetHeight();
 bmpI.bmiHeader.biPlanes = 1;
 bmpI.bmiHeader.biBitCount = 24;
 bmpI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 
 int status = SetDIBitsToDevice(pDC->GetSafeHdc(),
                             0, 0,
                             in_pCvImage->GetWidth(),in_pCvImage->GetHeight(),
                             0, 0,
                             0, in_pCvImage->GetHeight(),
        in_pCvImage->GetImageData(),
                             &bmpI,
                             DIB_RGB_COLORS);
 
}

Reply

Marsh Posté le 24-02-2006 à 13:39:35   

Reply

Marsh Posté le 25-02-2006 à 04:47:20    

J'aurais une solution, ce serait de déclarer ta fenêtre transparente lors du CreateWindow. Désolé, je ne suis que Win32, j'ai déja touché au MFC, mais plus jamais  :D

Reply

Marsh Posté le 25-02-2006 à 10:04:45    

Le plus simple est de désactiver le raffraichissement du background (OnEraseBackground il me semble).

Reply

Marsh Posté le 25-02-2006 à 10:49:19    

Encore plus simple : modifier les options dans Windows pour ne pas redessiner les fenêtres lors du redimensionnement/déplacement mais faire apparaître le rectangle de focus à la place (comportement Win98 si je ne m'abuse)
 
Mais c'est pas top, je le conçois!

Reply

Marsh Posté le 25-02-2006 à 10:54:41    

Sinon tu peux jongler avec CWnd::SetRedraw

Reply

Marsh Posté le 26-02-2006 à 15:02:54    

Merci pour ces idées, je vais tester tout ca et voir ce que ca donne.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed