'*********************************************************************** ' DrawEdge.bas - Contains API declarations and constants for the ' DrawEdge API function. '*********************************************************************** Option Explicit Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End TypePublic Const BDR_RAISEDOUTER = &H1 Public Const BDR_SUNKENOUTER = &H2 Public Const BDR_RAISEDINNER = &H4 Public Const BDR_SUNKENINNER = &H8Public Const BDR_OUTER = &H3 Public Const BDR_INNER = &HC Public Const BDR_RAISED = &H5 Public Const BDR_SUNKEN = &HAPublic Const EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER) Public Const EDGE_SUNKEN = (BDR_SUNKENOUTER Or BDR_SUNKENINNER) Public Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER) Public Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER)Public Const BF_LEFT = &H1 Public Const BF_TOP = &H2 Public Const BF_RIGHT = &H4 Public Const BF_BOTTOM = &H8Public Const BF_TOPLEFT = (BF_TOP Or BF_LEFT) Public Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT) Public Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT) Public Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT) Public Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)Public Const BF_DIAGONAL = &H10' For diagonal lines, the BF_RECT flags specify the end point of the ' vector bounded by the rectangle parameter. Public Const BF_DIAGONAL_ENDTOPRIGHT = (BF_DIAGONAL Or BF_TOP _ Or BF_RIGHT) Public Const BF_DIAGONAL_ENDTOPLEFT = (BF_DIAGONAL Or BF_TOP Or BF_LEFT) Public Const BF_DIAGONAL_ENDBOTTOMLEFT = (BF_DIAGONAL Or BF_BOTTOM _ Or BF_LEFT) Public Const BF_DIAGONAL_ENDBOTTOMRIGHT = (BF_DIAGONAL Or BF_BOTTOM _ Or BF_RIGHT)Public Const BF_MIDDLE = &H800 ' Fill in the middle Public Const BF_SOFT = &H1000 ' For softer buttons Public Const BF_ADJUST = &H2000 ' Calculate the space left over Public Const BF_FLAT = &H4000 ' For flat rather than 3D borders Public Const BF_MONO = &H8000 ' For monochrome bordersPublic Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, _ qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Boolean'*********************************************************************** ' DrawEdge.frm - Demonstrates a simple example of how to use DrawEdge. '*********************************************************************** Option Explicit'*********************************************************************** ' Prepares the form and Picture1 for use with DrawEdge. '*********************************************************************** Private Sub Form_Load() '------------------------------------------------------------------- ' Always set the ScaleMode to pixels when using API drawing ' functions. '------------------------------------------------------------------- ScaleMode = vbPixels With Picture1 '--------------------------------------------------------------- ' The next line is not required if you put your drawing code ' in the Paint event. '--------------------------------------------------------------- .AutoRedraw = True '--------------------------------------------------------------- ' Set the Backcolor, set the Borderstyle to none, and size ' the picture box to a more realistic button size. '--------------------------------------------------------------- .BackColor = vb3DFace .BorderStyle = 0 .Move 60, 10, 90, 30 '-------------------- ------------------------------------------- ' Make sure the picture box uses the pixel ScaleMode, and ' set the tag of the control to a caption for later use with ' DrawControl. '--------------------------------------------------------------- .ScaleMode = vbPixels .Tag = "DrawEdge Test" End With '------------------------------------------------------------------- ' Draw the initial button. '------------------------------------------------------------------- DrawControl Picture1, Picture1.Tag, EDGE_RAISED End Sub'*********************************************************************** ' When the picture box gets a click event, an etched box is drawn on ' the upper left corner of the form. '*********************************************************************** Private Sub Picture1_Click() Dim r As RECT ' used by DrawEdge to determine where to draw '------------------------------------------------------------------- ' Location of the etched box. '------------------------------------------------------------------- With r .Left = 10 .Top = 10 .Right = 50 .Bottom = 50 End With '------------------------------------------------------------------- ' Draw it. '------------------------------------------------------------------- DrawEdge hdc, r, EDGE_ETCHED, BF_RECT End Sub'*********************************************************************** ' When the user presses the mouse down on the picture box a sunken edge ' is drawn to simulate a depresessed button. '*********************************************************************** Private Sub Picture1_MouseDown(Button%, Shift%, X!, Y!) DrawControl Picture1, Picture1.Tag, EDGE_SUNKEN End Sub'*********************************************************************** ' When the user releases the mouse over the picture box a standard ' button is drawn. '*********************************************************************** Private Sub Picture1_MouseUp(Button%, Shift%, X!, Y!) DrawControl Picture1, Picture1.Tag, EDGE_RAISED End Sub'*********************************************************************** ' The DrawControl helper function is designed to make it easier to ' draw a button on a picture box. '*********************************************************************** Private Sub DrawControl(picControl As PictureBox, _ strCaption As String, Optional vntEdge) Dim r As RECT ' Holds the location of the DrawEdge rectangle. Dim intOffset% ' Used to shift the caption when the button is ' pressed. '------------------------------------------------------------------- ' If the user doesn't provide a Edge flag, then use a default value. '------------------------------------------------------------------- vntEdge = IIf(IsMissing(vntEdge), EDGE_RAISED, vntEdge) '------------------------------------------------------------------- ' Clear the picture control and determine where to draw the new ' rectangle and caption. '------------------------------------------------------------------- With picControl .Cls r.Left = .ScaleLeft r.Top = .ScaleTop r.Right = .ScaleWidth r.Bottom = .ScaleHeight If vntEdge = EDGE_SUNKEN Then intOffset = 2 .CurrentX = (.ScaleWidth - .TextWidth(strCaption) _ + intOffset) / 2 .CurrentY = (.ScaleHeight - .TextHeight(strCaption) _ + intOffset) / 2 End With '------------------------------------------------------------------- ' Draw the caption, then draw the rectangle. '------------------------------------------------------------------- Picture1.Print strCaption DrawEdge picControl.hdc, r, CLng(vntEdge), BF_RECT '------------------------------------------------------------------- ' If AutoRedraw is True, then any drawing done by an API call cannot ' be seen until until the picture box gets refreshed. '------------------------------------------------------------------- If picControl.AutoRedraw Then picControl.Refresh End Sub
这个办法不错...................................
自定义控件,加上Label,再封装一下,hehe...也够复杂的。
' DrawEdge.bas - Contains API declarations and constants for the
' DrawEdge API function.
'***********************************************************************
Option Explicit
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePublic Const BDR_RAISEDOUTER = &H1
Public Const BDR_SUNKENOUTER = &H2
Public Const BDR_RAISEDINNER = &H4
Public Const BDR_SUNKENINNER = &H8Public Const BDR_OUTER = &H3
Public Const BDR_INNER = &HC
Public Const BDR_RAISED = &H5
Public Const BDR_SUNKEN = &HAPublic Const EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER)
Public Const EDGE_SUNKEN = (BDR_SUNKENOUTER Or BDR_SUNKENINNER)
Public Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER)
Public Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER)Public Const BF_LEFT = &H1
Public Const BF_TOP = &H2
Public Const BF_RIGHT = &H4
Public Const BF_BOTTOM = &H8Public Const BF_TOPLEFT = (BF_TOP Or BF_LEFT)
Public Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT)
Public Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT)
Public Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT)
Public Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)Public Const BF_DIAGONAL = &H10' For diagonal lines, the BF_RECT flags specify the end point of the
' vector bounded by the rectangle parameter.
Public Const BF_DIAGONAL_ENDTOPRIGHT = (BF_DIAGONAL Or BF_TOP _
Or BF_RIGHT)
Public Const BF_DIAGONAL_ENDTOPLEFT = (BF_DIAGONAL Or BF_TOP Or BF_LEFT)
Public Const BF_DIAGONAL_ENDBOTTOMLEFT = (BF_DIAGONAL Or BF_BOTTOM _
Or BF_LEFT)
Public Const BF_DIAGONAL_ENDBOTTOMRIGHT = (BF_DIAGONAL Or BF_BOTTOM _
Or BF_RIGHT)Public Const BF_MIDDLE = &H800 ' Fill in the middle
Public Const BF_SOFT = &H1000 ' For softer buttons
Public Const BF_ADJUST = &H2000 ' Calculate the space left over
Public Const BF_FLAT = &H4000 ' For flat rather than 3D borders
Public Const BF_MONO = &H8000 ' For monochrome bordersPublic Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, _
qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Boolean'***********************************************************************
' DrawEdge.frm - Demonstrates a simple example of how to use DrawEdge.
'***********************************************************************
Option Explicit'***********************************************************************
' Prepares the form and Picture1 for use with DrawEdge.
'***********************************************************************
Private Sub Form_Load()
'-------------------------------------------------------------------
' Always set the ScaleMode to pixels when using API drawing
' functions.
'-------------------------------------------------------------------
ScaleMode = vbPixels
With Picture1
'---------------------------------------------------------------
' The next line is not required if you put your drawing code
' in the Paint event.
'---------------------------------------------------------------
.AutoRedraw = True
'---------------------------------------------------------------
' Set the Backcolor, set the Borderstyle to none, and size
' the picture box to a more realistic button size.
'---------------------------------------------------------------
.BackColor = vb3DFace
.BorderStyle = 0
.Move 60, 10, 90, 30
'-------------------- -------------------------------------------
' Make sure the picture box uses the pixel ScaleMode, and
' set the tag of the control to a caption for later use with
' DrawControl.
'---------------------------------------------------------------
.ScaleMode = vbPixels
.Tag = "DrawEdge Test"
End With
'-------------------------------------------------------------------
' Draw the initial button.
'-------------------------------------------------------------------
DrawControl Picture1, Picture1.Tag, EDGE_RAISED
End Sub'***********************************************************************
' When the picture box gets a click event, an etched box is drawn on
' the upper left corner of the form.
'***********************************************************************
Private Sub Picture1_Click()
Dim r As RECT ' used by DrawEdge to determine where to draw
'-------------------------------------------------------------------
' Location of the etched box.
'-------------------------------------------------------------------
With r
.Left = 10
.Top = 10
.Right = 50
.Bottom = 50
End With
'-------------------------------------------------------------------
' Draw it.
'-------------------------------------------------------------------
DrawEdge hdc, r, EDGE_ETCHED, BF_RECT
End Sub'***********************************************************************
' When the user presses the mouse down on the picture box a sunken edge
' is drawn to simulate a depresessed button.
'***********************************************************************
Private Sub Picture1_MouseDown(Button%, Shift%, X!, Y!)
DrawControl Picture1, Picture1.Tag, EDGE_SUNKEN
End Sub'***********************************************************************
' When the user releases the mouse over the picture box a standard
' button is drawn.
'***********************************************************************
Private Sub Picture1_MouseUp(Button%, Shift%, X!, Y!)
DrawControl Picture1, Picture1.Tag, EDGE_RAISED
End Sub'***********************************************************************
' The DrawControl helper function is designed to make it easier to
' draw a button on a picture box.
'***********************************************************************
Private Sub DrawControl(picControl As PictureBox, _
strCaption As String, Optional vntEdge) Dim r As RECT ' Holds the location of the DrawEdge rectangle.
Dim intOffset% ' Used to shift the caption when the button is
' pressed.
'-------------------------------------------------------------------
' If the user doesn't provide a Edge flag, then use a default value.
'-------------------------------------------------------------------
vntEdge = IIf(IsMissing(vntEdge), EDGE_RAISED, vntEdge)
'-------------------------------------------------------------------
' Clear the picture control and determine where to draw the new
' rectangle and caption.
'-------------------------------------------------------------------
With picControl
.Cls
r.Left = .ScaleLeft
r.Top = .ScaleTop
r.Right = .ScaleWidth
r.Bottom = .ScaleHeight
If vntEdge = EDGE_SUNKEN Then intOffset = 2
.CurrentX = (.ScaleWidth - .TextWidth(strCaption) _
+ intOffset) / 2
.CurrentY = (.ScaleHeight - .TextHeight(strCaption) _
+ intOffset) / 2
End With
'-------------------------------------------------------------------
' Draw the caption, then draw the rectangle.
'-------------------------------------------------------------------
Picture1.Print strCaption
DrawEdge picControl.hdc, r, CLng(vntEdge), BF_RECT
'-------------------------------------------------------------------
' If AutoRedraw is True, then any drawing done by an API call cannot
' be seen until until the picture box gets refreshed.
'-------------------------------------------------------------------
If picControl.AutoRedraw Then picControl.Refresh
End Sub