Lazarus

Programming => LCL => Topic started by: stoffman on May 15, 2018, 08:40:23 pm

Title: Painting directly on the form using GDI
Post by: stoffman on May 15, 2018, 08:40:23 pm
Hi I created the most simple app you can think of and in the FormPaint event I do the following:

procedure TForm1.FormPaint(Sender: TObject);
var
  x : HWND;
  dc : HDC;
  rect : TRect;
  blueBrush : HBRUSH;
  newPen : HPEN;
begin
  x := Handle;
  dc := GetDeviceContext(x);

  newPen := CreatePen(PS_SOLID,1,RGB(0,0,255));
  SelectObject(dc,newPen);
  movetoex(dc,70,70,nil);
  lineto(dc,500,500);

  rect := TRect.Create(100,100,100,100);
  blueBrush := CreateSolidBrush(RGB(0,123,255));
  FillRect(dc,rect,bluebrush);
end;

And while the line is being drawn the Rect doesn't. Any ideas?
Title: Re: Painting directly on the form using GDI
Post by: knuckles on May 15, 2018, 08:57:35 pm
Aren't  the rect parameters wrong? Unless I'm being stupid your making a rect at the same place with no actual size difference.
Title: Re: Painting directly on the form using GDI
Post by: stoffman on May 15, 2018, 10:01:09 pm
You are right about this specific rectangle (although I would expect a rectangle of 1 pixel)  but this is just an example. No matter what I try it doesn't work. Very strange. I'm using 1.8rc1 I'll upgrade and test again.

Thanks anyway!
Title: Re: Painting directly on the form using GDI
Post by: wp on May 15, 2018, 10:58:20 pm
although I would expect a rectangle of 1 pixel
The width of a rectangle is Rect.Right - Rect.Left, i.e. when Rect.Left = Rect.Right the width is zero, not 1 pixel. How would you draw a zero-size rectangle if this case would show 1 pixel?

Side note: Of course, you may have good reasons for this, but painting using the GDI directly is the hard way. Why don't you go the easy way and use the TCanvas which Lazarus has for you?
Title: Re: Painting directly on the form using GDI
Post by: howardpc on May 15, 2018, 11:22:10 pm
You need to select the object you want drawn into the device context. You also need to clean up after yourself or you will leak resources badly.
Code: Pascal  [Select][+][-]
  1. procedure TForm1.FormPaint(Sender: TObject);
  2. var
  3.   x : HWND;
  4.   dc : HDC;
  5.   rect : TRect;
  6.   blueBrush : HBRUSH;
  7.   newPen : HPEN;
  8. begin
  9.   x := Handle;
  10.   dc := GetDeviceContext(x);
  11.  
  12.   newPen := CreatePen(PS_SOLID,1,RGB(0,0,230));
  13.   SelectObject(dc,newPen);
  14.   movetoex(dc,115,115,nil);
  15.   lineto(dc,200,200);
  16.   DeleteObject(newPen);
  17.  
  18.   rect := TRect.Create(90,90,100,100);
  19.   blueBrush := CreateSolidBrush(RGB(0,123,255));
  20.   SelectObject(dc, blueBrush);
  21.   FillRect(dc,rect,bluebrush);
  22.   DeleteObject(blueBrush);
  23.  
  24.   ReleaseDC(x, dc);
  25. end;
Title: Re: Painting directly on the form using GDI
Post by: RobbieL91 on May 17, 2018, 10:24:42 pm
Thank you so much for the useful info.!!
TinyPortal © 2005-2018