|
From: Raphael S. <win...@ra...> - 2009-03-13 12:31:13
|
Hi @ all
Here is a sample-programm for displaying a static DC over a memory-DC.
The sample is adapted from 'Region.pl'.
Flickering while moving the window, or moving an other window over the DC is
gone. Only while resizing the window, flickering appears. I think that is
not a DC-problem, but a win32-gui-problem
-----------------
# proper displaying and refreshing of a static DC
# Please see the demo 'Region.pl' for further explanations
use strict;
use Win32::GUI();
our $WIN;
our %DC;
our @DATA; # Sample Data for the graph
$DATA[0] = {'x' => 10, 'y' => 100};
$DATA[1] = {'x' => 50, 'y' => 30};
$DATA[2] = {'x' => 90, 'y' => 200};
$DATA[3] = {'x' => 130, 'y' => 180};
$DATA[4] = {'x' => 170, 'y' => 210};
$DATA[5] = {'x' => 210, 'y' => 150};
&build_gui; # Inizialize program
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 v3",
#-noflicker => 1, # Will not work with the Paint-event
);
$WIN->Show();
# Defining the DC-styles
$DC{'color'}{'white'} = [255,255,255];
$DC{'color'}{'red'} = [255,0,0];
$DC{'color'}{'grey'} = [100,100,100];
$DC{'pen'} = new Win32::GUI::Pen( -color => $DC{'color'}{'red'}, -width =>
3, );
$DC{'grid'} = new Win32::GUI::Pen( -color => $DC{'color'}{'grey'}, -width =>
1, );
$DC{'brush'} = new Win32::GUI::Brush( -color => $DC{'color'}{'white'},
-width => 1, );
&repaint; # Generate the DC (first time)
}
sub WIN_Terminate { return -1; }
sub WIN_Paint # re-/paint-event of the window
{ &repaint; }
sub repaint # Create/rebuild DC-Object
{
# preparing the DC (memory-DC)
$DC{'dc'}{'object'} = $WIN -> GetDC; # Creating DC
$DC{'dc'}{'mem_object'} = $DC{'dc'}{'object'} -> CreateCompatibleDC(); #
Creating compatible DC
$DC{'dc'}{'bitmap'} = $DC{'dc'}{'object'} ->
CreateCompatibleBitmap(250,250); # Creating compatible Bitmap
$DC{'dc'}{'old_bitmap'} = $DC{'dc'}{'mem_object'} ->
SelectObject($DC{'dc'}{'bitmap'}); # Selecting the bitmap into the new DC
# Drawing into the memory-DC
$DC{'dc'}{'mem_object'} -> FillRect(10, 10, 260, 260,$DC{'brush'});
$DC{'dc'}{'mem_object'} -> SelectObject($DC{'grid'});
for (my $i = 10;$i < 270; $i+=24) # Create y-grid
{$DC{'dc'}{'mem_object'} -> Line(10,$i,250,$i);}
for (my $i = 10;$i < 280; $i+=24) # Create x-grid
{$DC{'dc'}{'mem_object'} -> Line($i,10,$i,260);}
$DC{'dc'}{'mem_object'} -> SelectObject($DC{'pen'});
$DC{'dc'}{'mem_object'} -> BeginPath();
$DC{'dc'}{'mem_object'} -> MoveTo($DATA[0]{'x'}, $DATA[0]{'y'}); # Create
graph (first point)
for (my $i = 1;$i < scalar @DATA;$i++)
{ $DC{'dc'}{'mem_object'} -> LineTo($DATA[$i]{'x'}, $DATA[$i]{'y'}); } #
Steps
$DC{'dc'}{'mem_object'} -> EndPath();
$DC{'dc'}{'mem_object'} -> StrokePath();
$DC{'dc'}{'object'} -> BitBlt(10, 10, 250,250,$DC{'dc'}{'mem_object'}, 10,
10); # Updating the screen
$DC{'dc'}{'mem_object'} -> SelectObject($DC{'dc'}{'old_bitmap'}); #
Restoring original bitmap
$DC{'dc'}{'mem_object'} -> DeleteDC(); # Removing the memory-DC
}
-----------------
Hope, the mail-linebreaks don't messing up the code
Greetings,
Raphael
-----Ursprüngliche Nachricht-----
Von: Raphael Stoeckli [mailto:win32gui@....ch]
Gesendet: Mittwoch, 11. März 2009 00:53
An: 'zak3'
Cc: per...@li...
Betreff: Re: [perl-win32-gui-users] flickering static-DC
Hi Zak
I run probably an old version of ASPerl (5.8.6.811). There is an error, when
I try to run test8.pl or test13.pl. Hook Perl_newXS_flags was not found in
perl58.dll. I think, I remained on 5.8.6.811, because of some
PAR-compatibility-issues (most likely obsolote now). I will try it on an
other machine with 5.8.8 or 5.10 the next days.
My program works now pretty good, without much flickering, only with
win32-GUI-corefunctions. I will also try to move my window-DC into a
memory-DC the next days, as I said in my last post. I will post some
sample-code when I finished that.
To tell the truth, DIBitmap and GD frighten me a little bit. Is not that I
don't understand it already worked with DIBitmap intensively. But my
program will be a standalone-binary for PCs without Perl. Even though
1TB-HDDs are on the advance, I am still skeptic if I have a binary of more
than 3 or 4 MB in front of me, to run a really simple program. Maybe I am
too conservative :-)
Anyhow, much thanks for your hint. I will also study the two posts from
mail-archive.com.
Greetings,
Raphael
-----Ursprüngliche Nachricht-----
Von: zak3 [mailto:zak31415@.....com]
Gesendet: Montag, 9. März 2009 12:57
An: per...@li...
Betreff: Re: [perl-win32-gui-users] flickering static-DC
Hi
also look to this link about drawing and refreshing:
http://www.nabble.com/Draw-on-click-and-refresh-the-window---resolved-td1809
3899.html
and the two tutorials by rob may about drawing and refreshing:
http://www.mail-archive.com/per...@li.../msg05
194.html
http://www.mail-archive.com/per...@li.../msg05
195.html
also before three days i have found an example in the win32gui demos :
demos\DIBitmap\ the first is test8.pl and test13.pl they draw a circle
without any flickering, they use GD graphics with DIBitmap, first install GD
Graphics from this site:http://www.bribes.org/perl/ppmdir.html
using the command:
ppm install http://www.bribes.org/perl/ppm/GD.ppd
and try the test8.pl and test13.pl, the GD graphics have many plotting
statements for drawing lines, polygons, points, etc
Raphael Stoeckli 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
> Per...@li...
> https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
> http://perl-win32-gui.sourceforge.net/
>
>
--
View this message in context:
http://www.nabble.com/flickering-static-DC-tp22404906p22411762.html
Sent from the perl-win32-gui-users mailing list archive at Nabble.com.
----------------------------------------------------------------------------
--
_______________________________________________
Perl-Win32-GUI-Users mailing list
Per...@li...
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
http://perl-win32-gui.sourceforge.net/
----------------------------------------------------------------------------
--
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
Perl-Win32-GUI-Users mailing list
Per...@li...
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
http://perl-win32-gui.sourceforge.net/
|