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/

Reply via email to