|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||
|
Visual Basic Imaging Routines CreateEnhMetaFile: Saving a PrintScreen as a Windows Enhanced Metafile |
||
| Posted: | Wednesday February 05, 2003 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6 | |
| Developed with: | VB6, Windows XP | |
| OS restrictions: | None | |
| Author: | Mike Sutton, 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 |
| None. |
|
|
Based
on a newsgroup post by Mike D. Sutton, and reproduced here with
permission, this code shows how to save a PrintScreen of the desktop
client area (or the client area of any hwnd passed) to disk in Windows
Enhanced Metafile format. For demo purposes the image is also displayed
in a picture box on the form. |
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| To the form containing a picture box (Picture1) and a command button (Command1), add the following code: |
|
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const HORZSIZE As Long = 4 'Horizontal size in millimetres
Private Const VERTSIZE As Long = 6 'Vertical size in millimetres
Private Const HORZRES As Long = 8 'Horizontal width in pixels
Private Const VERTRES As Long = 10 'Vertical width in pixels
Private Const STRETCH_ANDSCANS As Long = 1
Private Const STRETCH_ORSCANS As Long = 2
Private Const STRETCH_DELETESCANS As Long = 3
Private Const STRETCH_HALFTONE As Long = 4
Private Type Rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function CreateEnhMetaFile Lib "gdi32" _
Alias "CreateEnhMetaFileA" _
(ByVal hdcRef As Long, _
ByVal lpFileName As String, _
ByRef lpRect As Rect, _
ByVal lpDescription As String) As Long
Private Declare Function CloseEnhMetaFile Lib "gdi32" _
(ByVal hDC As Long) As Long
Private Declare Function DeleteEnhMetaFile Lib "gdi32" _
(ByVal hEMF As Long) As Long
Private Declare Function PlayEnhMetaFile Lib "gdi32" _
(ByVal hDC As Long, _
ByVal hEMF As Long, _
ByRef lpRect As Any) As Long
Private Declare Function BitBlt Lib "gdi32" _
(ByVal hDestDC As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, _
ByVal nIndex As Long) As Long
Private Declare Function GetClientRect Lib "user32" _
(ByVal hwnd As Long, _
ByRef lpRect As Rect) As Long
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As Rect) As Long
Private Declare Function GetDC Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, _
ByVal hDC As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32" _
(ByVal hDC As Long, _
ByVal nStretchMode As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Sub Form_Load()
Picture1.AutoRedraw = True
Command1.Caption = "Create Metafile"
End Sub
Private Sub Picture1_Click()
Picture1.Cls 'Reset
End Sub
Private Sub Command1_Click()
Dim hEMF As Long
Dim rc As Rect
'Obtain a handle to a Windows
'enhanced metafile of the desktop
'(or to the client area of another
'form or window specified by hwnd),
'and optionally display the result
'in a picturebox using metafile APIs,
'then clean up
hEMF = WindowClientToEMF(GetDesktopWindow(), "C:\TempEMF.emf")
Call Picture1.Cls
Call GetClientRect(Picture1.hwnd, rc)
Call PlayEnhMetaFile(Picture1.hDC, hEMF, rc)
Call Picture1.Refresh
Call DeleteEnhMetaFile(hEMF)
End Sub
Private Function WindowClientToEMF(ByVal hwndIn As Long, _
sOutputFile As String) As Long
Dim rc As Rect
Dim hTmpDc As Long
'obtain the display context (DC)
'to the window passed
hTmpDc = GetDC(hwndIn)
If hTmpDc <> 0 Then
'get the size of the client
'area of the passed handle
If GetClientRect(hwndIn, rc) <> 0 Then
'pass the DC, rectangle and filename
'to create the file, returning the
'handle to the memory metafile
WindowClientToEMF = DcToEmf2(hTmpDc, rc, sOutputFile)
'release the temporary DC
Call ReleaseDC(hwndIn, hTmpDc)
End If
End If
End Function
Private Function DcToEmf2(ByVal hDcIn As Long, _
inArea As Rect, _
sOutputFile As String) As Long
Dim rc As Rect
Dim MetaDC As Long
Dim OldMode As Long
Dim hsize As Long
Dim vsize As Long
Dim hres As Long
Dim vres As Long
'Convert the area from pixels to .01mm's
'Rectangle coordinates must be normalised
hsize = GetDeviceCaps(hDcIn, HORZSIZE) * 100
vsize = GetDeviceCaps(hDcIn, VERTSIZE) * 100
hres = GetDeviceCaps(hDcIn, HORZRES)
vres = GetDeviceCaps(hDcIn, VERTRES)
With rc
.Left = (inArea.Left * hsize) / hres
.Top = (inArea.Top * vsize) / vres
.Right = (inArea.Right * hsize) / hres
.Bottom = (inArea.Bottom * vsize) / vres
End With
'Create a new MetaDC and output file
MetaDC = CreateEnhMetaFile(hDcIn, sOutputFile, rc, vbNullString)
If (MetaDC) Then
'Draw the image to the MetaDC
'Set STRETCH_HALFTONE stretch mode here for higher quality
OldMode = SetStretchBltMode(MetaDC, STRETCH_HALFTONE)
Call BitBlt(MetaDC, _
0, 0, _
(inArea.Right - inArea.Left), _
(inArea.Bottom - inArea.Top), _
hDcIn, _
inArea.Left, _
inArea.Top, _
vbSrcCopy)
'restore the saved dc mode
Call SetStretchBltMode(MetaDC, OldMode)
'delete the MetaDC and return the
'EMF object's handle
DcToEmf2 = CloseEnhMetaFile(MetaDC)
End If
End Function
|
| Comments |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |