This example shows several different ways to store and get a handle on pictures. From file, a range, another control, and the imagelist control. Needs improvement, but, if you spend a little time on this, you should have no problem spicing up up your userforms a bit...
MouseEventsUserformControls.zip
Class module named "FrameHotTracker":
<table width="100%" border="1" bgcolor="White" style="filter
rogid:DXImageTransform.Microsoft.Gradient(endColorstr='#C0CFE2', startColorstr='#FFFFFF', gradientType='0');"><tr><TD><font size="2" face=Courier New> <font color="#0000A0">Option</font> <font color="#0000A0">Explicit</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> GetCursorPos <font color="#0000A0">Lib</font> "user32" (lpPoint <font color="#0000A0">As</font> POINTAPI) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> WindowFromPoint <font color="#0000A0">Lib</font> "user32" (ByVal xPoint <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> yPoint <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> SetCapture <font color="#0000A0">Lib</font> "user32" (ByVal hwnd <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> ReleaseCapture <font color="#0000A0">Lib</font> "user32" () <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> GetCapture <font color="#0000A0">Lib</font> "user32" () <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Type</font> POINTAPI
X <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
Y <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">End</font> <font color="#0000A0">Type</font>
<font color="#0000A0">Private</font> <font color="#0000A0">WithEvents</font> pFrame <font color="#0000A0">As</font> MSForms.Frame
<font color="#0000A0">Private</font> pUF <font color="#0000A0">As</font> <font color="#0000A0">Object</font>
<font color="#0000A0">Private</font> pHwnd <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Private</font> pEnableEvents <font color="#0000A0">As</font> <font color="#0000A0">Boolean</font>
<font color="#0000A0">Private</font> pEnableCapture <font color="#0000A0">As</font> <font color="#0000A0">Boolean</font>
<font color="#0000A0">Private</font> pDefaultPicture <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Private</font> pMouseEnterPicture <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Private</font> pMouseDownPicture <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Private</font> pMouseExitPicture <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Private</font> <font color="#0000A0">Sub</font> pFrame_MouseDown(ByVal Button <font color="#0000A0">As</font> Integer, <font color="#0000A0">ByVal</font> Shift <font color="#0000A0">As</font> Integer, <font color="#0000A0">ByVal</font> X <font color="#0000A0">As</font> Single, <font color="#0000A0">ByVal</font> Y <font color="#0000A0">As</font> Single)
<font color="#0000A0">Dim</font> PicArg <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Set</font> PicArg = pMouseDownPicture
<font color="#0000A0">If</font> pEnableEvents <font color="#0000A0">Then</font> <font color="#0000A0">Call</font> pUF.MouseDown(Me, PicArg, Button, Shift, X, Y)
<font color="#0000A0">Call</font> SetPicture(pMouseDownPicture, PicArg)
<font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Sub</font> pFrame_MouseMove(ByVal Button <font color="#0000A0">As</font> Integer, <font color="#0000A0">ByVal</font> Shift <font color="#0000A0">As</font> Integer, <font color="#0000A0">ByVal</font> X <font color="#0000A0">As</font> Single, <font color="#0000A0">ByVal</font> Y <font color="#0000A0">As</font> Single)
<font color="#0000A0">Dim</font> PicArg <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">If</font> hwnd = 0 <font color="#0000A0">Then</font> pHwnd = GetFrameHwnd()
<font color="#0000A0">If</font> (X < 0) <font color="#0000A0">Or</font> (Y < 0) <font color="#0000A0">Or</font> (X > pFrame.Width) <font color="#0000A0">Or</font> (Y > pFrame.Height) <font color="#0000A0">Then</font>
ReleaseCapture
<font color="#0000A0">Set</font> PicArg = pMouseExitPicture
<font color="#0000A0">If</font> pEnableEvents <font color="#0000A0">Then</font> <font color="#0000A0">Call</font> pUF.MouseExit(Me, PicArg)
<font color="#0000A0">Call</font> SetPicture(pMouseExitPicture, PicArg)
<font color="#0000A0">ElseIf</font> GetCapture() <> hwnd <font color="#0000A0">Then</font>
SetCapture hwnd
<font color="#0000A0">Set</font> PicArg = pMouseEnterPicture
<font color="#0000A0">If</font> pEnableEvents <font color="#0000A0">Then</font> <font color="#0000A0">Call</font> pUF.MouseEnter(Me, PicArg)
<font color="#0000A0">Call</font> SetPicture(pMouseEnterPicture, PicArg)
<font color="#0000A0">End</font> <font color="#0000A0">If</font>
<font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Sub</font> SetPicture(DefaultEventPic <font color="#0000A0">As</font> stdole.Picture, OverRideDefaultEventPic <font color="#0000A0">As</font> stdole.Picture)
<font color="#0000A0">On</font> <font color="#0000A0">Error</font> <font color="#0000A0">Resume</font> <font color="#0000A0">Next</font>
<font color="#0000A0">If</font> pEnableCapture <font color="#0000A0">Then</font>
<font color="#0000A0">If</font> (OverRideDefaultEventPic.handle = DefaultEventPic.handle) <font color="#0000A0">Then</font>
<font color="#0000A0">If</font> (Not DefaultEventPic <font color="#0000A0">Is</font> Nothing) <font color="#0000A0">Then</font>
pFrame.Picture = DefaultEventPic
<font color="#0000A0">End</font> <font color="#0000A0">If</font>
<font color="#0000A0">End</font> <font color="#0000A0">If</font>
<font color="#0000A0">Else</font>
pFrame.Picture = OverRideDefaultEventPic
<font color="#0000A0">End</font> <font color="#0000A0">If</font>
<font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Function</font> GetFrameHwnd() <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Dim</font> PT <font color="#0000A0">As</font> POINTAPI
GetCursorPos PT
GetFrameHwnd = WindowFromPoint(PT.X, PT.Y)
<font color="#0000A0">End</font> <font color="#0000A0">Function</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Sub</font> HotTrack(UF <font color="#0000A0">As</font> Object, _
o <font color="#0000A0">As</font> MSForms.Frame, _
<font color="#0000A0">Optional</font> EnableEvents <font color="#0000A0">As</font> <font color="#0000A0">Boolean</font> = True, _
<font color="#0000A0">Optional</font> EnableCapture <font color="#0000A0">As</font> <font color="#0000A0">Boolean</font> = False, _
<font color="#0000A0">Optional</font> DefaultPicture <font color="#0000A0">As</font> stdole.Picture = Nothing, _
<font color="#0000A0">Optional</font> MouseEnterPicture <font color="#0000A0">As</font> stdole.Picture = Nothing, _
<font color="#0000A0">Optional</font> MouseDownPicture <font color="#0000A0">As</font> stdole.Picture = Nothing, _
<font color="#0000A0">Optional</font> MouseExitPicture <font color="#0000A0">As</font> stdole.Picture = Nothing)
<font color="#0000A0">Set</font> pUF = UF
<font color="#0000A0">Set</font> pFrame = o
pEnableEvents = EnableEvents
pEnableCapture = EnableCapture
<font color="#0000A0">Set</font> pDefaultPicture = DefaultPicture
<font color="#0000A0">Set</font> pMouseEnterPicture = MouseEnterPicture
<font color="#0000A0">Set</font> pMouseDownPicture = MouseDownPicture
<font color="#0000A0">Set</font> pMouseExitPicture = MouseExitPicture
<font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> hwnd() <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
hwnd = pHwnd
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> Frame() <font color="#0000A0">As</font> MSForms.Frame
<font color="#0000A0">Set</font> Frame = pFrame
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Set</font> Frame(ByVal vNewValue <font color="#0000A0">As</font> MSForms.Frame)
<font color="#0000A0">Set</font> pFrame = vNewValue
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> EnableEvents() <font color="#0000A0">As</font> <font color="#0000A0">Boolean</font>
EnableEvents = pEnableEvents
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Let</font> EnableEvents(ByVal vNewValue <font color="#0000A0">As</font> Boolean)
pEnableEvents = vNewValue
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> EnableCapture() <font color="#0000A0">As</font> <font color="#0000A0">Boolean</font>
EnableCapture = pEnableCapture
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Let</font> EnableCapture(ByVal vNewValue <font color="#0000A0">As</font> Boolean)
pEnableCapture = vNewValue
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> DefaultPicture() <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Set</font> DefaultPicture = pDefaultPicture
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Set</font> DefaultPicture(ByVal vNewValue <font color="#0000A0">As</font> stdole.Picture)
<font color="#0000A0">Set</font> pDefaultPicture = vNewValue
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> MouseEnterPicture() <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Set</font> MouseEnterPicture = pMouseEnterPicture
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Set</font> MouseEnterPicture(ByVal vNewValue <font color="#0000A0">As</font> stdole.Picture)
<font color="#0000A0">Set</font> pMouseEnterPicture = vNewValue
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> MouseDownPicture() <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Set</font> MouseDownPicture = pMouseDownPicture
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Set</font> MouseDownPicture(ByVal vNewValue <font color="#0000A0">As</font> stdole.Picture)
<font color="#0000A0">Set</font> pMouseDownPicture = vNewValue
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Get</font> MouseExitPicture() <font color="#0000A0">As</font> stdole.Picture
<font color="#0000A0">Set</font> MouseExitPicture = pMouseExitPicture
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
<font color="#0000A0">Public</font> <font color="#0000A0">Property</font> <font color="#0000A0">Set</font> MouseExitPicture(ByVal vNewValue <font color="#0000A0">As</font> stdole.Picture)
<font color="#0000A0">Set</font> pMouseExitPicture = vNewValue
<font color="#0000A0">End</font> <font color="#0000A0">Property</font>
</FONT></td></tr></table><button onclick='document.all("9102006155023687").value=document.all("9102006155023687").value.replace(/<br \/>\s\s/g,"");document.all("9102006155023687").value=document.all("9102006155023687").value.replace(/<br \/>/g,"");window.clipboardData.setData("Text",document.all("9102006155023687").value);'>Copy to Clipboard</BUTTON><textarea style="position:absolute;visibility:hidden" name="9102006155023687" wrap="virtual">
Option Explicit
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCapture Lib "user32" () As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private WithEvents pFrame As MSForms.Frame
Private pUF As Object
Private pHwnd As Long
Private pEnableEvents As Boolean
Private pEnableCapture As Boolean
Private pDefaultPicture As stdole.Picture
Private pMouseEnterPicture As stdole.Picture
Private pMouseDownPicture As stdole.Picture
Private pMouseExitPicture As stdole.Picture
Private Sub pFrame_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim PicArg As stdole.Picture
Set PicArg = pMouseDownPicture
If pEnableEvents Then Call pUF.MouseDown(Me, PicArg, Button, Shift, X, Y)
Call SetPicture(pMouseDownPicture, PicArg)
End Sub
Private Sub pFrame_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim PicArg As stdole.Picture
If hwnd = 0 Then pHwnd = GetFrameHwnd()
If (X < 0) Or (Y < 0) Or (X > pFrame.Width) Or (Y > pFrame.Height) Then
ReleaseCapture
Set PicArg = pMouseExitPicture
If pEnableEvents Then Call pUF.MouseExit(Me, PicArg)
Call SetPicture(pMouseExitPicture, PicArg)
ElseIf GetCapture() <> hwnd Then
SetCapture hwnd
Set PicArg = pMouseEnterPicture
If pEnableEvents Then Call pUF.MouseEnter(Me, PicArg)
Call SetPicture(pMouseEnterPicture, PicArg)
End If
End Sub
Private Sub SetPicture(DefaultEventPic As stdole.Picture, OverRideDefaultEventPic As stdole.Picture)
On Error Resume Next
If pEnableCapture Then
If (OverRideDefaultEventPic.handle = DefaultEventPic.handle) Then
If (Not DefaultEventPic Is Nothing) Then
pFrame.Picture = DefaultEventPic
End If
End If
Else
pFrame.Picture = OverRideDefaultEventPic
End If
End Sub
Private Function GetFrameHwnd() As Long
Dim PT As POINTAPI
GetCursorPos PT
GetFrameHwnd = WindowFromPoint(PT.X, PT.Y)
End Function
Public Sub HotTrack(UF As Object, _
o As MSForms.Frame, _
Optional EnableEvents As Boolean = True, _
Optional EnableCapture As Boolean = False, _
Optional DefaultPicture As stdole.Picture = Nothing, _
Optional MouseEnterPicture As stdole.Picture = Nothing, _
Optional MouseDownPicture As stdole.Picture = Nothing, _
Optional MouseExitPicture As stdole.Picture = Nothing)
Set pUF = UF
Set pFrame = o
pEnableEvents = EnableEvents
pEnableCapture = EnableCapture
Set pDefaultPicture = DefaultPicture
Set pMouseEnterPicture = MouseEnterPicture
Set pMouseDownPicture = MouseDownPicture
Set pMouseExitPicture = MouseExitPicture
End Sub
Public Property Get hwnd() As Long
hwnd = pHwnd
End Property
Public Property Get Frame() As MSForms.Frame
Set Frame = pFrame
End Property
Public Property Set Frame(ByVal vNewValue As MSForms.Frame)
Set pFrame = vNewValue
End Property
Public Property Get EnableEvents() As Boolean
EnableEvents = pEnableEvents
End Property
Public Property Let EnableEvents(ByVal vNewValue As Boolean)
pEnableEvents = vNewValue
End Property
Public Property Get EnableCapture() As Boolean
EnableCapture = pEnableCapture
End Property
Public Property Let EnableCapture(ByVal vNewValue As Boolean)
pEnableCapture = vNewValue
End Property
Public Property Get DefaultPicture() As stdole.Picture
Set DefaultPicture = pDefaultPicture
End Property
Public Property Set DefaultPicture(ByVal vNewValue As stdole.Picture)
Set pDefaultPicture = vNewValue
End Property
Public Property Get MouseEnterPicture() As stdole.Picture
Set MouseEnterPicture = pMouseEnterPicture
End Property
Public Property Set MouseEnterPicture(ByVal vNewValue As stdole.Picture)
Set pMouseEnterPicture = vNewValue
End Property
Public Property Get MouseDownPicture() As stdole.Picture
Set MouseDownPicture = pMouseDownPicture
End Property
Public Property Set MouseDownPicture(ByVal vNewValue As stdole.Picture)
Set pMouseDownPicture = vNewValue
End Property
Public Property Get MouseExitPicture() As stdole.Picture
Set MouseExitPicture = pMouseExitPicture
End Property
Public Property Set MouseExitPicture(ByVal vNewValue As stdole.Picture)
Set pMouseExitPicture = vNewValue
End Property
</textarea>
Standard module:
<table width="100%" border="1" bgcolor="White" style="filter
rogid:DXImageTransform.Microsoft.Gradient(endColorstr='#C0CFE2', startColorstr='#FFFFFF', gradientType='0');"><tr><TD><font size="2" face=Courier New> <font color="#008000">'***************************************************************************</font>
<font color="#008000">'*</font>
<font color="#008000">'* MODULE NAME: Paste Picture</font>
<font color="#008000">'* AUTHOR & DATE: STEPHEN BULLEN, Office Automation Ltd</font>
<font color="#008000">'* 15 November 1998</font>
<font color="#008000">'*</font>
<font color="#008000">'* CONTACT:
Stephen@oaltd.co.uk</font>
<font color="#008000">'* WEB SITE: http://www.oaltd.co.uk</font>
<font color="#008000">'*</font>
<font color="#008000">'* DESCRIPTION: Creates a standard Picture object from whatever is on the clipboard.</font>
<font color="#008000">'* This object can then be assigned to (for example) and Image control</font>
<font color="#008000">'* on a userform. The PastePicture function takes an optional argument of</font>
<font color="#008000">'* the picture type - xlBitmap or xlPicture.</font>
<font color="#008000">'*</font>
<font color="#008000">'* The code requires a reference to the "OLE Automation" type library</font>
<font color="#008000">'*</font>
<font color="#008000">'* The code in this module has been derived from a number of sources</font>
<font color="#008000">'* discovered on MSDN.</font>
<font color="#008000">'*</font>
<font color="#008000">'* To use it, just copy this module into your project, then you can use:</font>
<font color="#008000">'* Set Image1.Picture = PastePicture(xlPicture)</font>
<font color="#008000">'* to paste a picture of whatever is on the clipboard into a standard image control.</font>
<font color="#008000">'*</font>
<font color="#008000">'* PROCEDURES:</font>
<font color="#008000">'* PastePicture The entry point for the routine</font>
<font color="#008000">'* CreatePicture Private function to convert a bitmap or metafile handle to an OLE reference</font>
<font color="#008000">'* fnOLEError Get the error text for an OLE error code</font>
<font color="#008000">'***************************************************************************</font>
<font color="#0000A0">Option</font> <font color="#0000A0">Explicit</font>
<font color="#0000A0">Option</font> <font color="#0000A0">Compare</font> <font color="#0000A0">Text</font>
<font color="#008000">''' User-Defined Types for API Calls</font>
<font color="#008000">'Declare a UDT to store a GUID for the IPicture OLE Interface</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Type</font> GUID
Data1 <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
Data2 <font color="#0000A0">As</font> <font color="#0000A0">Integer</font>
Data3 <font color="#0000A0">As</font> <font color="#0000A0">Integer</font>
Data4(0 <font color="#0000A0">To</font> 7) <font color="#0000A0">As</font> <font color="#0000A0">Byte</font>
<font color="#0000A0">End</font> <font color="#0000A0">Type</font>
<font color="#008000">'Declare a UDT to store the bitmap information</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Type</font> uPicDesc
Size <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">Type</font> <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
hPic <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
hPal <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#0000A0">End</font> <font color="#0000A0">Type</font>
<font color="#008000">'''Windows API Function Declarations</font>
<font color="#008000">'Does the clipboard contain a bitmap/metafile?</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> IsClipboardFormatAvailable <font color="#0000A0">Lib</font> "user32" (ByVal wFormat <font color="#0000A0">As</font> Integer) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#008000">'Open the clipboard to read</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> OpenClipboard <font color="#0000A0">Lib</font> "user32" (ByVal hwnd <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#008000">'Get a pointer to the bitmap/metafile</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> GetClipboardData <font color="#0000A0">Lib</font> "user32" (ByVal wFormat <font color="#0000A0">As</font> Integer) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#008000">'Close the clipboard</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> CloseClipboard <font color="#0000A0">Lib</font> "user32" () <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#008000">'Convert the handle into an OLE IPicture interface.</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> OleCreatePictureIndirect <font color="#0000A0">Lib</font> "olepro32.dll" (PicDesc <font color="#0000A0">As</font> uPicDesc, RefIID <font color="#0000A0">As</font> GUID, <font color="#0000A0">ByVal</font> fPictureOwnsHandle <font color="#0000A0">As</font> Long, IPic <font color="#0000A0">As</font> IPicture) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#008000">'Create our own copy of the metafile, so it doesn't get wiped out by subsequent clipboard updates.</font>
<font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> CopyEnhMetaFile <font color="#0000A0">Lib</font> "gdi32" <font color="#0000A0">Alias</font> "CopyEnhMetaFileA" (ByVal hemfSrc <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> lpszFile <font color="#0000A0">As</font> String) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#008000">'Create our own copy of the bitmap, so it doesn't get wiped out by subsequent clipboard updates.</font>
<font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> CopyImage <font color="#0000A0">Lib</font> "user32" (ByVal handle <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> un1 <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> n1 <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> n2 <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> un2 <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
<font color="#008000">'The API format types we're interested in</font>
<font color="#0000A0">Const</font> CF_BITMAP = 2
<font color="#0000A0">Const</font> CF_PALETTE = 9
<font color="#0000A0">Const</font> CF_ENHMETAFILE = 14
<font color="#0000A0">Const</font> IMAGE_BITMAP = 0
<font color="#0000A0">Const</font> LR_COPYRETURNORG = &H4
<font color="#008000">''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
<font color="#008000">''' Subroutine: PastePicture</font>
<font color="#008000">'''</font>
<font color="#008000">''' Purpose: Get a Picture object showing whatever's on the clipboard.</font>
<font color="#008000">'''</font>
<font color="#008000">''' Arguments: lXlPicType - The type of picture to create. Can be one of:</font>
<font color="#008000">''' xlPicture to create a metafile (default)</font>
<font color="#008000">''' xlBitmap to create a bitmap</font>
<font color="#008000">'''</font>
<font color="#008000">''' Date Developer Action</font>
<font color="#008000">''' --------------------------------------------------------------------------</font>
<font color="#008000">''' 30 Oct 98 Stephen Bullen Created</font>
<font color="#008000">''' 15 Nov 98 Stephen Bullen Updated to create our own copies of the clipboard images</font>
<font color="#008000">'''</font>
<font color="#0000A0">Function</font> PictureFromRange(Target <font color="#0000A0">As</font> Range, <font color="#0000A0">Optional</font> lXlPicType <font color="#0000A0">As</font> <font color="#0000A0">Long</font> = xlPicture) <font color="#0000A0">As</font> IPictureDisp
<font color="#008000">'Some pointers</font>
<font color="#0000A0">Dim</font> h <font color="#0000A0">As</font> Long, hPicAvail <font color="#0000A0">As</font> Long, hPtr <font color="#0000A0">As</font> Long, hPal <font color="#0000A0">As</font> Long, lPicType <font color="#0000A0">As</font> Long, hCopy <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
Target.CopyPicture
<font color="#008000">'Convert the type of picture requested from the xl constant to the API constant</font>
lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE)
<font color="#008000">'Check if the clipboard contains the required format</font>
hPicAvail = IsClipboardFormatAvailable(lPicType)
<font color="#0000A0">If</font> hPicAvail <> 0 <font color="#0000A0">Then</font>
<font color="#008000"> 'Get access to the clipboard</font>
h = OpenClipboard(0&)
<font color="#0000A0">If</font> h > 0 <font color="#0000A0">Then</font>
<font color="#008000"> 'Get a handle to the image data</font>
hPtr = GetClipboardData(lPicType)
<font color="#008000"> 'Create our own copy of the image on the clipboard, in the appropriate format.</font>
<font color="#0000A0">If</font> lPicType = CF_BITMAP <font color="#0000A0">Then</font>
hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
<font color="#0000A0">Else</font>
hCopy = CopyEnhMetaFile(hPtr, vbNullString)
<font color="#0000A0">End</font> <font color="#0000A0">If</font>
<font color="#008000"> 'Release the clipboard to other programs</font>
h = CloseClipboard
<font color="#008000"> 'If we got a handle to the image, convert it into a Picture object and return it</font>
<font color="#0000A0">If</font> hPtr <> 0 <font color="#0000A0">Then</font> <font color="#0000A0">Set</font> PictureFromRange = CreatePicture(hCopy, 0, lPicType)
<font color="#0000A0">End</font> <font color="#0000A0">If</font>
<font color="#0000A0">End</font> <font color="#0000A0">If</font>
<font color="#0000A0">End</font> <font color="#0000A0">Function</font>
<font color="#008000">''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
<font color="#008000">''' Subroutine: CreatePicture</font>
<font color="#008000">'''</font>
<font color="#008000">''' Purpose: Converts a image (and palette) handle into a Picture object.</font>
<font color="#008000">'''</font>
<font color="#008000">''' Requires a reference to the "OLE Automation" type library</font>
<font color="#008000">'''</font>
<font color="#008000">''' Arguments: None</font>
<font color="#008000">'''</font>
<font color="#008000">''' Date Developer Action</font>
<font color="#008000">''' --------------------------------------------------------------------------</font>
<font color="#008000">''' 30 Oct 98 Stephen Bullen Created</font>
<font color="#008000">'''</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Function</font> CreatePicture(ByVal hPic <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> hPal <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> lPicType) <font color="#0000A0">As</font> IPictureDisp
<font color="#008000">' IPicture requires a reference to "OLE Automation"</font>
<font color="#0000A0">Dim</font> r <font color="#0000A0">As</font> Long, uPicInfo <font color="#0000A0">As</font> uPicDesc, IID_IDispatch <font color="#0000A0">As</font> GUID, IPic <font color="#0000A0">As</font> IPictureDisp
<font color="#008000">'OLE Picture types</font>
<font color="#0000A0">Const</font> PICTYPE_BITMAP = 1
<font color="#0000A0">Const</font> PICTYPE_ENHMETAFILE = 4
<font color="#008000">' Create the Interface GUID (for the IPicture interface)</font>
<font color="#0000A0">With</font> IID_IDispatch
.Data1 = &H7BF80980
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
<font color="#0000A0">End</font> <font color="#0000A0">With</font>
<font color="#008000">' Fill uPicInfo with necessary parts.</font>
<font color="#0000A0">With</font> uPicInfo
.Size = Len(uPicInfo) ' Length of structure.
.Type = IIf(lPicType = CF_BITMAP, PICTYPE_BITMAP, PICTYPE_ENHMETAFILE) ' <font color="#0000A0">Type</font> of Picture
.hPic = hPic ' Handle to image.
.hPal = IIf(lPicType = CF_BITMAP, hPal, 0) ' Handle to palette (if bitmap).
<font color="#0000A0">End</font> <font color="#0000A0">With</font>
<font color="#008000">' Create the Picture object.</font>
r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic)
<font color="#008000">' If an error occured, show the description</font>
<font color="#0000A0">If</font> r <> 0 <font color="#0000A0">Then</font> Debug.Print "Create Picture: " & fnOLEError(r)
<font color="#008000">' Return the new Picture object.</font>
<font color="#0000A0">Set</font> CreatePicture = IPic
<font color="#0000A0">End</font> <font color="#0000A0">Function</font>
<font color="#008000">''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
<font color="#008000">''' Subroutine: fnOLEError</font>
<font color="#008000">'''</font>
<font color="#008000">''' Purpose: Gets the message text for standard OLE errors</font>
<font color="#008000">'''</font>
<font color="#008000">''' Arguments: None</font>
<font color="#008000">'''</font>
<font color="#008000">''' Date Developer Action</font>
<font color="#008000">''' --------------------------------------------------------------------------</font>
<font color="#008000">''' 30 Oct 98 Stephen Bullen Created</font>
<font color="#008000">'''</font>
<font color="#0000A0">Private</font> <font color="#0000A0">Function</font> fnOLEError(lErrNum <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">String</font>
<font color="#008000">'OLECreatePictureIndirect return values</font>
<font color="#0000A0">Const</font> E_ABORT = &H80004004
<font color="#0000A0">Const</font> E_ACCESSDENIED = &H80070005
<font color="#0000A0">Const</font> E_FAIL = &H80004005
<font color="#0000A0">Const</font> E_HANDLE = &H80070006
<font color="#0000A0">Const</font> E_INVALIDARG = &H80070057
<font color="#0000A0">Const</font> E_NOINTERFACE = &H80004002
<font color="#0000A0">Const</font> E_NOTIMPL = &H80004001
<font color="#0000A0">Const</font> E_OUTOFMEMORY = &H8007000E
<font color="#0000A0">Const</font> E_POINTER = &H80004003
<font color="#0000A0">Const</font> E_UNEXPECTED = &H8000FFFF
<font color="#0000A0">Const</font> S_OK = &H0
<font color="#0000A0">Select</font> <font color="#0000A0">Case</font> lErrNum
<font color="#0000A0">Case</font> E_ABORT
fnOLEError = " Aborted"
<font color="#0000A0">Case</font> E_ACCESSDENIED
fnOLEError = " <font color="#0000A0">Access</font> Denied"
<font color="#0000A0">Case</font> E_FAIL
fnOLEError = " General Failure"
<font color="#0000A0">Case</font> E_HANDLE
fnOLEError = " Bad/Missing Handle"
<font color="#0000A0">Case</font> E_INVALIDARG
fnOLEError = " Invalid Argument"
<font color="#0000A0">Case</font> E_NOINTERFACE
fnOLEError = " No Interface"
<font color="#0000A0">Case</font> E_NOTIMPL
fnOLEError = " <font color="#0000A0">Not</font> Implemented"
<font color="#0000A0">Case</font> E_OUTOFMEMORY
fnOLEError = " Out of Memory"
<font color="#0000A0">Case</font> E_POINTER
fnOLEError = " Invalid Pointer"
<font color="#0000A0">Case</font> E_UNEXPECTED
fnOLEError = " Unknown Error"
<font color="#0000A0">Case</font> S_OK
fnOLEError = " Success!"
<font color="#0000A0">End</font> <font color="#0000A0">Select</font>
<font color="#0000A0">End</font> <font color="#0000A0">Function</font>
</FONT></td></tr></table><button onclick='document.all("9102006155045156").value=document.all("9102006155045156").value.replace(/<br \/>\s\s/g,"");document.all("9102006155045156").value=document.all("9102006155045156").value.replace(/<br \/>/g,"");window.clipboardData.setData("Text",document.all("9102006155045156").value);'>Copy to Clipboard</BUTTON><textarea style="position:absolute;visibility:hidden" name="9102006155045156" wrap="virtual">
'***************************************************************************
'*
'* MODULE NAME: Paste Picture
'* AUTHOR & DATE: STEPHEN BULLEN, Office Automation Ltd
'* 15 November 1998
'*
'* CONTACT:
Stephen@oaltd.co.uk
'* WEB SITE:
http://www.oaltd.co.uk
'*
'* DESCRIPTION: Creates a standard Picture object from whatever is on the clipboard.
'* This object can then be assigned to (for example) and Image control
'* on a userform. The PastePicture function takes an optional argument of
'* the picture type - xlBitmap or xlPicture.
'*
'* The code requires a reference to the "OLE Automation" type library
'*
'* The code in this module has been derived from a number of sources
'* discovered on MSDN.
'*
'* To use it, just copy this module into your project, then you can use:
'* Set Image1.Picture = PastePicture(xlPicture)
'* to paste a picture of whatever is on the clipboard into a standard image control.
'*
'* PROCEDURES:
'* PastePicture The entry point for the routine
'* CreatePicture Private function to convert a bitmap or metafile handle to an OLE reference
'* fnOLEError Get the error text for an OLE error code
'***************************************************************************
Option Explicit
Option Compare Text
''' User-Defined Types for API Calls
'Declare a UDT to store a GUID for the IPicture OLE Interface
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
'Declare a UDT to store the bitmap information
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
'''Windows API Function Declarations
'Does the clipboard contain a bitmap/metafile?
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long
'Open the clipboard to read
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
'Get a pointer to the bitmap/metafile
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As Long
'Close the clipboard
Private Declare Function CloseClipboard Lib "user32" () As Long
'Convert the handle into an OLE IPicture interface.
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
'Create our own copy of the metafile, so it doesn't get wiped out by subsequent clipboard updates.
Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
'Create our own copy of the bitmap, so it doesn't get wiped out by subsequent clipboard updates.
Declare Function CopyImage Lib "user32" (ByVal handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
'The API format types we're interested in
Const CF_BITMAP = 2
Const CF_PALETTE = 9
Const CF_ENHMETAFILE = 14
Const IMAGE_BITMAP = 0
Const LR_COPYRETURNORG = &H4
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: PastePicture
'''
''' Purpose: Get a Picture object showing whatever's on the clipboard.
'''
''' Arguments: lXlPicType - The type of picture to create. Can be one of:
''' xlPicture to create a metafile (default)
''' xlBitmap to create a bitmap
'''
''' Date Developer Action
''' --------------------------------------------------------------------------
''' 30 Oct 98 Stephen Bullen Created
''' 15 Nov 98 Stephen Bullen Updated to create our own copies of the clipboard images
'''
Function PictureFromRange(Target As Range, Optional lXlPicType As Long = xlPicture) As IPictureDisp
'Some pointers
Dim h As Long, hPicAvail As Long, hPtr As Long, hPal As Long, lPicType As Long, hCopy As Long
Target.CopyPicture
'Convert the type of picture requested from the xl constant to the API constant
lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE)
'Check if the clipboard contains the required format
hPicAvail = IsClipboardFormatAvailable(lPicType)
If hPicAvail <> 0 Then
'Get access to the clipboard
h = OpenClipboard(0&)
If h > 0 Then
'Get a handle to the image data
hPtr = GetClipboardData(lPicType)
'Create our own copy of the image on the clipboard, in the appropriate format.
If lPicType = CF_BITMAP Then
hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
Else
hCopy = CopyEnhMetaFile(hPtr, vbNullString)
End If
'Release the clipboard to other programs
h = CloseClipboard
'If we got a handle to the image, convert it into a Picture object and return it
If hPtr <> 0 Then Set PictureFromRange = CreatePicture(hCopy, 0, lPicType)
End If
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: CreatePicture
'''
''' Purpose: Converts a image (and palette) handle into a Picture object.
'''
''' Requires a reference to the "OLE Automation" type library
'''
''' Arguments: None
'''
''' Date Developer Action
''' --------------------------------------------------------------------------
''' 30 Oct 98 Stephen Bullen Created
'''
Private Function CreatePicture(ByVal hPic As Long, ByVal hPal As Long, ByVal lPicType) As IPictureDisp
' IPicture requires a reference to "OLE Automation"
Dim r As Long, uPicInfo As uPicDesc, IID_IDispatch As GUID, IPic As IPictureDisp
'OLE Picture types
Const PICTYPE_BITMAP = 1
Const PICTYPE_ENHMETAFILE = 4
' Create the Interface GUID (for the IPicture interface)
With IID_IDispatch
.Data1 = &H7BF80980
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
End With
' Fill uPicInfo with necessary parts.
With uPicInfo
.Size = Len(uPicInfo) ' Length of structure.
.Type = IIf(lPicType = CF_BITMAP, PICTYPE_BITMAP, PICTYPE_ENHMETAFILE) ' Type of Picture
.hPic = hPic ' Handle to image.
.hPal = IIf(lPicType = CF_BITMAP, hPal, 0) ' Handle to palette (if bitmap).
End With
' Create the Picture object.
r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic)
' If an error occured, show the description
If r <> 0 Then Debug.Print "Create Picture: " & fnOLEError(r)
' Return the new Picture object.
Set CreatePicture = IPic
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: fnOLEError
'''
''' Purpose: Gets the message text for standard OLE errors
'''
''' Arguments: None
'''
''' Date Developer Action
''' --------------------------------------------------------------------------
''' 30 Oct 98 Stephen Bullen Created
'''
Private Function fnOLEError(lErrNum As Long) As String
'OLECreatePictureIndirect return values
Const E_ABORT = &H80004004
Const E_ACCESSDENIED = &H80070005
Const E_FAIL = &H80004005
Const E_HANDLE = &H80070006
Const E_INVALIDARG = &H80070057
Const E_NOINTERFACE = &H80004002
Const E_NOTIMPL = &H80004001
Const E_OUTOFMEMORY = &H8007000E
Const E_POINTER = &H80004003
Const E_UNEXPECTED = &H8000FFFF
Const S_OK = &H0
Select Case lErrNum
Case E_ABORT
fnOLEError = " Aborted"
Case E_ACCESSDENIED
fnOLEError = " Access Denied"
Case E_FAIL
fnOLEError = " General Failure"
Case E_HANDLE
fnOLEError = " Bad/Missing Handle"
Case E_INVALIDARG
fnOLEError = " Invalid Argument"
Case E_NOINTERFACE
fnOLEError = " No Interface"
Case E_NOTIMPL
fnOLEError = " Not Implemented"
Case E_OUTOFMEMORY
fnOLEError = " Out of Memory"
Case E_POINTER
fnOLEError = " Invalid Pointer"
Case E_UNEXPECTED
fnOLEError = " Unknown Error"
Case S_OK
fnOLEError = " Success!"
End Select
End Function
</textarea>
see more next post...
MouseEventsUserformControls.zip