Avatar billede cvpcvp Nybegynder
07. juli 2003 - 19:48 Der er 9 kommentarer og
1 løsning

Opbygning af billede på forhånd for at undgå flimmer (MFC)

Jeg indsætter et billede i min applikation, men når jeg enten ændre størrelsen eller bruger nogle af de ting jeg har indlagt i framen "flimrer" billedet.

Det bliver ikke gentegnet hurtigt nok eller nogen lignende i OnPaint funktionen.. derfor kan det ses når billedet tegnes igen...

Er der en måde hvorpå man kan undgå dette?
Ved f.eks. på en eller anden måde at tegne billedet inden det skal vises og så derefter vise det?

Som det er nu bruger jeg BitBlt til at indsætte billedet..
Avatar billede bertelbrander Novice
07. juli 2003 - 19:57 #1
Når du bruger BitBlt tegner du netop billedet inden det vises.
Du kan evt se på WNDCLASS og flagene CS_HREDRAW  og CS_VREDRAW til denne.
Det kan være en ide at lave en handler til WM_ERASEBKGND, som ikke gør noget.
Avatar billede bertelbrander Novice
07. juli 2003 - 20:01 #2
Hvis du poster din kode kan vi måske give dig lidt flere tips.
Avatar billede cvpcvp Nybegynder
07. juli 2003 - 20:05 #3
Følgende bliver udført når applikationen initialiseres...

m_menu.LoadBitmap( IDB_menu1_2 );
CClientDC dc(this);

m_menuMemDC.CreateCompatibleDC( &dc );   
m_menuMemDC.SelectObject( &m_menu );

Følgende bliver udført i OnPaint()...

CPaintDC dc(this);

  BITMAP menu1;

  dc.BitBlt(0,0,menu1.bmWidth, menu1.bmHeight, &m_menuMemDC,0,0, SRCCOPY);
Avatar billede cvpcvp Nybegynder
07. juli 2003 - 20:06 #4
hvis jeg tager fat i hjørnet af applikationen og ændrer størrelsen på vinduet kommer der nogle hvide horisontale linier der hvor billedet bliver tegnet..
Avatar billede sovsekoder Nybegynder
09. juli 2003 - 09:04 #5
kig på <a href="http://www.codeproject.com/gdi/flickerfree.asp">http://www.codeproject.com/gdi/flickerfree.asp</a> her kan du se hvordan det skal gøres, der er en fin vejledning til hvad du skal gøre i dit MFC program.

ideen er at udvidde CDC (device context-klassen) således at når du skriver til den sker det i hukommelsen. Når klassen nedlægges (når du går ud af OnDraw ell. OnPaint) blittes alle ændringer til vinduet. For at dette skal virke skal man huske at sørge for at vinduet ikke slettes (dvs OnEraseBkgnd(...) skal overloades med en "tom" funktion - der returnerer false).

På den side, hvor linket fører til, skal du downloade en .h fil og inkludere den i dit projekt - og så skal du lave ganske få ændringer. Ved at bruge denne metode skal du ikke lave ændringer (i måden du tegner på) i din OnPaint/OnDraw

Men dette er beskrevet på linket som jeg gav i toppen.
Avatar billede cvpcvp Nybegynder
09. juli 2003 - 09:50 #6
det virker ikke rigtigt med OnPaint.....
Da jeg bruger CPaintDC i stedet for CDC..
jeg syntes ikke lige jeg kan få det hen..
Avatar billede sovsekoder Nybegynder
09. juli 2003 - 10:15 #7
burde kunne virke således

#include "memdc.h"

...
void xxx::OnPaint() {
  CPaintDC dc(this);
  CMemDC pDC (&dc);
  pDC->BitBlt( ...blah... )
}

hvis du kalder Invalidate ell. InvalidateRect, skal den have false (erase=false)
Avatar billede cvpcvp Nybegynder
09. juli 2003 - 14:51 #8
CMemDC kan ikke konvertere fra CPaintDC til CDC
Avatar billede cvpcvp Nybegynder
09. juli 2003 - 14:59 #9
jo.... det ville den alligevel godt.. ved ikke lige hvad jeg har nollert rundt i.. det virker i hvert tilfælde nu..
Den laver ingen "flicker" når jeg bruger applikationen..
Den gør det dog stadigvæk når jeg "trækker" i vinduet og gør det større...
Avatar billede cvpcvp Nybegynder
12. juli 2003 - 17:07 #10
..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester