|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||
| Visual Basic Bitmap Routines BitBlt: Mimicking PrintScreen to Create a 'PrintForm' |
||
| Posted: | Thursday December 26, 1996 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6, and VB3, VB4-16 with appropriate declarations | |
| Developed with: | VB4-32, Windows 95 | |
| OS restrictions: | None | |
| Author: | VBnet - Randy Birch | |
|
Related: |
BitBlt: Mimicking the PrintScreen Function BitBlt: Mimicking PrintScreen to Create a 'PrintForm' CreateEnhMetaFile: Saving a PrintScreen as a Windows Enhanced Metafile InflateRect: Highlighting External Windows keybd_event: Calling Windows' PrintScreen Function OleCreatePictureIndirect: Mimicking PrintScreen Using OLE |
|
| Prerequisites |
| Code from the article BitBlt: Mimicking the PrintScreen Function. |
|
|
| If you look closely at the value of hWndDesk set in the
BitBlt: Mimicking the PrintScreen Function routine, you will see that
the demo passes the handle to the desktop window. Since all windows
live on the desktop, this enables the PrintScreen routine to capture the desktop to the
picture. If you were to modify handle passed to that of the current form and change coordinates of the form size you would essentially then have a 'PrintForm' routine. This demo therefore utilizes the project developed in BitBlt: Mimicking the PrintScreen Function and adds an additional routine. |
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| To the form, add the following code: |
|
|
Option Explicit
Private Sub Command2_Click()
PrintForm
End Sub
Private Sub PrintForm()
Dim hWndForm As Long
Dim hDCForm As Long
Dim LeftForm As Long
Dim TopForm As Long
Dim WidthForm As Long
Dim HeightForm As Long
'define the screen coordinates (upper
'corner (0,0) and lower corner (Width, Height)
LeftForm = 0
TopForm = 0
WidthForm = Me.ScaleX(Me.Width, vbTwips, vbPixels)
HeightForm = Me.ScaleY(Me.Height, vbTwips, vbPixels)
'copy the form to the picture box
Call BitBlt(Picture1.hdc, 0, 0, WidthForm, HeightForm, _
Me.hDc, LeftForm, TopForm, vbSrcCopy)
End Sub |
| Variation |
By providing a means for delaying execution of the routine
(allowing the user time to select another open window) another slight
modification gives you a method to capture the active window instead:
Private Sub PrintAnyWindow()
MsgBox "Two seconds after you press _
OK to close this dialog, the currently _
active window will be copied into _
the picture box."
Dim delay As Date
Dim hWndActive As Long
Dim hDCActive As Long
Dim LeftActive As Long
Dim TopActive As Long
Dim WidthActive As Long
Dim HeightActive As Long
Dim RectActive As RECT
'delay activation for two seconds
delay = DateAdd("s", 2, Now)
Do Until Now > delay
DoEvents
Loop
'get the handle to the foreground window, its
'size and the display context of the window
hWndActive = GetForegroundWindow()
Call GetWindowRect(hWndActive, RectActive)
hDCActive = GetWindowDC(hWndActive)
'determine the coordinates of the active window
LeftActive = 0
TopActive = 0
WidthActive = RectActive.Right - RectActive.Left
HeightActive = RectActive.Bottom - RectActive.Top
'Copy the active window to the picture box
Call BitBlt(Picture1.hdc, 0, 0, WidthActive, HeightActive, _
hDCActive, LeftActive, TopActive, vbSrcCopy)
Call ReleaseDC(hWndActive, hDCActive) |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |