GetBitmapDC example for Visual Basic

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 DrawText example.

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

2. image\btnapi.gif Open the API Viewer by double-clicking the API Text Viewer icon in the Visual Basic program group on your desktop.

3. From the File menu, choose Load Text File.

4. Open either WIN31API.TXT (16-bit Windows declares, types, and constants), or WIN32API.TXT (32-bit Windows declares, types, and constants), which are located in the \WINAPI subdirectory of the main Visual Basic directory.

5. In the API Type drop-down list box, select Declares; then select and add the following items:

SetBkMode
TextOut
GetStockObject
SelectObject

6. In the API Type drop-down list box, select Constants; then select and add the following items:

SYSTEM_FONT
TRANSPARENT

7. Copy the selected items, and paste them into the declarations procedure of the general object in your form. In this example, you must edit the declarations and constants to make them private. On a 16-bit system, they should appear as follows:

Private Declare Function SetBkMode Lib "GDI" (ByVal hDC As Integer, ByVal nBkMode As Integer) As Integer
Private Declare Function SelectObject Lib "GDI" (ByVal hDC As Integer, ByVal hObject As Integer) As Integer
Private Declare Function TextOut Lib "GDI" (ByVal hDC As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal lpString As String, ByVal nCount As Integer) As Integer
Private Declare Function GetStockObject Lib "GDI" (ByVal nIndex As Integer) As Integer
Const SYSTEM_FONT = 13
Const TRANSPARENT = 1

8. image\btncmd.gif Select the CommandButton control; then add the control to your main form. Put the control at the top of the form to keep it away from the image.

9. In the Properties box, change the CommandButton control's Caption property to GDI for Text.

10. Add the following code to the CommandButton control's Click procedure. In online help, you can use the Edit pull-down menu to copy the block of code.

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

Sub Command1_Click ()
    'Ensure that the Lead control is visible
    Lead1.Visible = True

    '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.
    '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
    MyReturn = SetBkMode(LeadDC, TRANSPARENT)
    'Assign the string value
    mystring$ = "Text on the bitmap"
    'Print the text on the bitmap. This is a permanent change in the bitmap
    MyReturn = TextOut(LeadDC, 20, 40, mystring$, Len(mystring$) )

    'Restore the previous font
    MyReturn = 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.
    '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
    MyReturn = SetBkMode(LeadClientDC, TRANSPARENT)
    'Assign the string value
    mystring$ = "Text on the LEAD control"
    'Print the text on the control. 
    'This is an overlay that does not affect the bitmap.
    MyReturn = TextOut(LeadClientDC, 20, 80, mystring$, Len(mystring$))

    'Restore the previous font
    MyReturn = SelectObject(LeadClientDC, hOldFont)
    'Remove the lock from the device control
    Lead1.ReleaseClientDC

End Sub

11. 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.