Hi Jeremy I noticed that with Validate() in the meanwhile. The flickering came back as I added more DC-elements. A terminating $DC{'dc'}{'object'} -> Validate(); # (Uncommented this at line 43 of the example) stopped further flickering, respectively endless repaint. My example was probably a little bit too simple. Big question mark is still that:
WIN_Paint { my $dc = shift; # <-- ??? } I don't need that. Is my code working without an assigned parameter, because my DC-Object is global? The Validate() happens in my example-sub repaint{}. But it's probably the wrong approach (see section below). As to the performance: As you said, in the examples BitmapScroll.pl and Region.pl is BitBlt used. I will look into them. Well, thanks for this hint. Concerning to function describing, the DC-documentation is, let me say a little bit minimalist. Thanks a lot. Greetings, Raphael ________________________________________ Von: Jeremy White [mailto:jez_wh...@.....com] Gesendet: Montag, 9. März 2009 19:39 An: win32...@.....ch; m...@.....net Cc: perl-win32-gui-users@lists.sourceforge.net Betreff: RE: [perl-win32-gui-users] flickering static-DC Hi Raphael, I don't have Win32::GUI in front of me - but: You always need Validate, as this tells windows that you have finished drawing for the paint event. Drawing to a "live" DC will always be slow and flickery. You need to draw to a memory DC and bitblit the result to the window DC - I think there is an example of this in the examples that comes with Win32::GUI. Cheers, Jeremy. > From: win32...@.....ch > To: m...@warheads.net > Date: Mon, 9 Mar 2009 12:22:02 +0100 > CC: perl-win32-gui-users@lists.sourceforge.net > Subject: Re: [perl-win32-gui-users] flickering static-DC > > Hi Jason > > Thanks for the fast response. > Serendipitously I found a usable solution for the problem, just some minutes > ago. > There is a window-event called Paint, with the mysterious description "Sent > when the window needs to be repainted." > Here is the updated code: > > ------------------------------------- > use strict; > use Win32::GUI(); > our $WIN; > our %DC; > > &build_gui; > Win32::GUI::Dialog(); > > sub build_gui # Building the GUI > { > $WIN = new Win32::GUI::Window( > -left => 200, -top => 200, -width => 300, -height => 300, > -name => "WIN", > -text => "Static-DC-Test v2", > #-noflicker => 1, # Will not work with the Paint-event > ); > $WIN->Show(); > $DC{'color'}{'white'} = [255,255,255]; > $DC{'color'}{'red'} = [255,0,0]; > $DC{'pen'} = new Win32::GUI::Pen( -color => $DC{'color'}{'red'}, -width => > 3, ); > $DC{'brush'} = new Win32::GUI::Brush( -color => $DC{'color'}{'white'}, > -width => 1, ); > &repaint; > } > > sub WIN_Terminate { return -1; } > > sub WIN_Paint # re-/paint-event of the window > { > #my $DC = shift; # seems to be no need for this (in that case?) > &repaint; > } > > sub repaint # Create/rebuild DC-Object > { > $DC{'dc'}{'object'} = $WIN -> GetDC; > $DC{'dc'}{'object'} -> FillRect(10, 10, 280, 260,$DC{'brush'}); > $DC{'dc'}{'object'} -> SelectObject($DC{'pen'}); > $DC{'dc'}{'object'} -> BeginPath(); > $DC{'dc'}{'object'} -> MoveTo(10, 10); > $DC{'dc'}{'object'} -> LineTo(280, 260); > $DC{'dc'}{'object'} -> EndPath(); > $DC{'dc'}{'object'} -> StrokePath(); > # $DC{'dc'}{'object'} -> Validate(); # seems to be no need for this (in that > case?) > } > ------------------------------------- > > Flickering is reduced to the times, when an other window moves over the > DC-window, (or the DC-window is resizing). But in my case that's not very > annoying. What I'm not getting at the moment is the thing with Validate() of > the DC (seems nothing to do), or if there is a more efficient way to draw > the DC. > > Nevertheless I hope, I can help other people with the example above. > > Greetings, > Raphael > > ________________________________________ > Von: Jason Plum [mailto:m...@.....net] > Gesendet: Montag, 9. März 2009 10:02 > An: Raphael Stoeckli > Cc: perl-win32-gui-users@lists.sourceforge.net > Betreff: Re: [perl-win32-gui-users] flickering static-DC > > Hello Raphael, > > I unfortunately do not have a breadth of experience with the DC object as > some on this list, but having seen this I can at least offer some tid-bit of > possible use. I would say that the one means I can come to think of is > ignoring repaint wherein there is no cause to redraw this particular > rectangle. Ok, this sounds a simple concept, but I realize this may not be > as easy to complete in reality. This of course, offers no help with the > issue of the bad flicker during dragging, but it offers some to the regular > usage flickering. > > > Jason P > On Sun, Mar 8, 2009 at 7:54 PM, Raphael Stoeckli <win32...@.....ch> wrote: > Hi @ all > > I try to plot a static DC-Object (means: the graphic is calculated uniquely > at runtime, depending of several parameters, and does not change while > displaying the window) in a window. > The problem is that this object continuously needs to be redrawn, because it > vanishes during moving the window around, or if an other window is moving > over it. > I thought, a repaint-routine like that would solve the problem: > ------------------------------------- > use strict; > use Win32::GUI(); > our $WIN; > our %DC; > > &build_gui; > Win32::GUI::Dialog(); > > sub build_gui # Building the GUI > { > $WIN = new Win32::GUI::Window( > -left => 200, -top => 200, -width => 300, -height => 300, > -name => "WIN", > -text => "Static-DC-Test", > #-noflicker => 1, # Useless/worse result > ); > $WIN->Show(); > $DC{'color'}{'white'} = [255,255,255]; > $DC{'color'}{'red'} = [255,0,0]; > $DC{'pen'} = new Win32::GUI::Pen( -color => $DC{'color'}{'red'}, -width => > 3, ); > $DC{'brush'} = new Win32::GUI::Brush( -color => $DC{'color'}{'white'}, > -width => 1, ); > &repaint; > $DC{'timer'} = $WIN ->AddTimer("timer", 100); > } > > sub ::timer_Timer # Repaint DC with interval of 'timer' > { &repaint; } > > sub WIN_Terminate { return -1; } > > sub repaint # Create/rebuild DC-Object > { > $DC{'dc'}{'object'} = $WIN -> GetDC; > $DC{'dc'}{'object'} -> FillRect(10, 10, 280, 260,$DC{'brush'}); > $DC{'dc'}{'object'} -> SelectObject($DC{'pen'}); > $DC{'dc'}{'object'} -> BeginPath(); > $DC{'dc'}{'object'} -> MoveTo(10, 10); > $DC{'dc'}{'object'} -> LineTo(280, 260); > $DC{'dc'}{'object'} -> EndPath(); > $DC{'dc'}{'object'} -> StrokePath(); > #$DC{'dc'}{'object'} -> Save(); # ??? Save() --> Restore() ??? > } > ------------------------------------- > But the result of the code above is a flickering, annoying graphic. > So the next thought, was to generate a bitmap from the DC. There is, if Im > not wrong, a method with DIBitmap. But, I would like to refrain from binding > in that module, only for converting a single graphic, because its bloating > up the program/PAR-binary. > > > Sadly, the DC-Documentation is frequent a sealed book for me. > Does anyone know an easy method (I also like to take a complex solution :-)) > to convert a DC into a bitmap-object, without using DIBitmap? Or, even > better, a way to prevent that flickering during the repaint? > > Thanks a lot. > > Regards, > Raphael > > > ---------------------------------------------------------------------------- > -- > Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA > -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise > -Strategies to boost innovation and cut costs with open source participation > -Receive a $600 discount off the registration fee with the source code: SFAD > http://p.sf.net/sfu/XcvMzF8H > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Perl-Win32-GUI-Users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > http://perl-win32-gui.sourceforge.net/ > > > > -- > Maximus* > WarheadsSE > MaxSource > > > ---------------------------------------------------------------------------- -- > Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA > -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise > -Strategies to boost innovation and cut costs with open source participation > -Receive a $600 discount off the registration fee with the source code: SFAD > http://p.sf.net/sfu/XcvMzF8H > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Perl-Win32-GUI-Users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > http://perl-win32-gui.sourceforge.net/ ________________________________________ Share your photos with Windows Live Photos Free. Try it Now! ------------------------------------------------------------------------------ Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise -Strategies to boost innovation and cut costs with open source participation -Receive a $600 discount off the registration fee with the source code: SFAD http://p.sf.net/sfu/XcvMzF8H _______________________________________________ Perl-Win32-GUI-Users mailing list Perl-Win32-GUI-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users http://perl-win32-gui.sourceforge.net/