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...@rabanti.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 I’m
> not wrong, a method with DIBitmap. But, I would like to refrain from binding
> in that module, only for converting a single graphic, because it’s 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/
_________________________________________________________________
25GB of FREE Online Storage – Find out more
http://clk.atdmt.com/UKM/go/134665320/direct/01/
------------------------------------------------------------------------------
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/