GetBitmapDC example for Delphi

Take the following steps to demonstrate how GDI functions can be used to print text on the bitmap and on the control. The text printed on the bitmap is a permanent part of the bitmap and becomes permanent if the bitmap is saved; whereas the text on the control is superficial and does not affect the bitmap.

Note:

For an easier way of drawing text, refer to the DrawTextStr example.

 

1.

Start with the project that you created in Loading and Displaying an Image.

2.

image\btndbtn.gif Select the Button control; then add the control to your main form

3.

Change the Button control's Caption property to GDI for Text.

4.

Code the GDI for Text button's Click procedure as follows. In online help, you can copy the block of code and paste it into your application.

 

Notice that the code prints in two different places: the bitmap and the control. You can see the difference when you run the program.

procedure TForm1.Button3Click(Sender: TObject);

var
LeadDC, LeadClientDC: HDC;
hfnt, hOldFont: THandle;
mystring: String;
myCString: array[0..80] of Char;

begin
{First, print text on the bitmap.}
{Create a device context for the bitmap that the GDI functions can access}
LeadDC := Lead1.GetBitmapDC;

{Get the system font and select it. The old font is saved so that it can be restored.}
{Using other fonts is more complex. Refer to the Windows API documentation.}
hfnt := GetStockObject(SYSTEM_FONT);
hOldFont := SelectObject(LeadDC, hfnt);

{Make the background transparent, so that the text will overlay the image}
SetBkMode(LeadDC, TRANSPARENT);

{Assign the string value}
mystring := 'Text on the bitmap';
StrPCopy(myCString, mystring);

{Print the text on the bitmap. This is a permanent change in the bitmap}
TextOut(LeadDC, 20, 40, myCstring, Length(mystring) );

{Restore the previous font}
SelectObject(LeadDC, hOldFont);

{Remove the lock from the device control}
Lead1.ReleaseBitmapDC;

{Repaint the part of the image that has changed}
Lead1.BackErase := False;
Lead1.ForceRepaint;

{Allow full repainting again}
Lead1.BackErase := True;

{Next, print text on the control.}
{Create a device context for the control that the GDI functions can access}
LeadClientDC := Lead1.GetClientDC;

{Get the system font and select it. The old font is saved so that it can be restored.}
{Using other fonts is more complex. Refer to the Windows API documentation.}
hfnt := GetStockObject(SYSTEM_FONT);
hOldFont := SelectObject(LeadDC, hfnt);

{Make the background transparent, so that the text will overlay the image}
SetBkMode(LeadClientDC, TRANSPARENT);

{Assign the string value}
mystring := 'Text on the LEAD control';
StrPCopy(myCString, mystring);

{Print the text on the control. This is an overlay that does not affect the bitmap.}
TextOut(LeadClientDC, 20, 80, myCstring, Length(mystring));

{Restore the previous font}
SelectObject(LeadClientDC, hOldFont);

{Remove the lock from the device control}
Lead1.ReleaseClientDC;

end;

5.

Run your program to test it. Notice that the text printed on the bitmap is scaled as part of the bitmap. If you zoom in, it becomes larger, and if you zoom out, it becomes smaller. The text printed on the control is the normal size for the system font and is not affected by zooming.