'幾個GDI繪圖函數功能的封裝,有一定通用性,有些是我平時自己就喜歡用的模塊。
Private Function NewMyHdc(dHdc As Long, w As Long, h As Long, Optional Bm As Long) As MemHdc
With NewMyHdc
.hdc = CreateCompatibleDC(dHdc)
If Bm = 0 Then
.Bmp = CreateCompatibleBitmap(dHdc, w, h)
Else
.Bmp = Bm
End If
.obm = SelectObject(.hdc, .Bmp)
End With
End Function
Private Function DelMyHdc(MyHdc As MemHdc, Optional nobmp As Boolean) As MemHdc
With MyHdc
If .hdc <> 0 Then
SelectObject .hdc, .obm
If nobmp = False Then DeleteObject .Bmp
DeleteDC .hdc
End If
End With
End Function
Private Sub DrawPloy3(hdc As Long, rcDrop As RECT, Up As Boolean)
'畫下拉菜單的小三角形
Dim ploy(2) As POINTL
Dim hBrush As Long, hOldBrush As Long
Dim hPen As Long, hOldPen As Long
With rcDrop
If Up Then
.Left = .Left - 1
.Right = .Right - 1
.Top = .Top - 1
.Bottom = .Bottom - 1
hBrush = CreateSolidBrush(m_lngTextHiColor)
hPen = CreatePen(PS_SOLID, 1, m_lngTextHiColor)
Else
hBrush = CreateSolidBrush(m_lngTextColor)
hPen = CreatePen(PS_SOLID, 1, m_lngTextColor)
End If
hOldPen = SelectObject(hdc, hPen)
hOldBrush = SelectObject(hdc, hBrush)
ploy(0).X = (.Left + .Right - 5) \ 2
ploy(0).Y = (.Top + .Bottom) \ 2
ploy(1).X = ploy(0).X + 4
ploy(1).Y = ploy(0).Y
ploy(2).X = ploy(0).X + 2
ploy(2).Y = ploy(0).Y + 2
End With
Polygon hdc, ploy(0), 3
SelectObject hdc, hOldPen
SelectObject hdc, hOldBrush
DeleteObject hPen
DeleteObject hBrush
End Sub
Private Sub GetIconSize(hIcon As Long)
'取得圖像列表框圖標的大小
Dim Bm As BITMAP, bi As ICONINFO
GetIconInfo hIcon, bi
GetObj bi.hbmColor, Len(Bm), Bm
DeleteObject bi.hbmColor
DeleteObject bi.hbmMask
mlngIconWidth = Bm.bmWidth
mlngIconHeight = Bm.bmHeight
End Sub
Private Sub DrawRect(hdc As Long, rc As RECT, State As Long, Optional IsDrop As Boolean)
Dim hPen As Long
If (State > 0 Or IsDrop) And m_lngBrdStyle > 3 Then
hPen = CreatePen(PS_SOLID, 1, m_lngBrdColor)
If IsDrop Then rc.Left = rc.Left - 1
FrameRect hdc, rc, hPen
If IsDrop Then rc.Left = rc.Left + 1
DeleteObject hPen
Exit Sub
End If
Select Case State
Case 0 '普通狀態
Select Case m_lngBrdStyle
Case 1
If IsDrop Then DrawEdge hdc, rc, BDR_OUTER, BF_RECT Or BF_FLAT
Case 2
DrawEdge hdc, rc, BDR_RAISEDOUTER, BF_RECT
Case 3
DrawEdge hdc, rc, EDGE_RAISED, BF_RECT
End Select
Case 1 '高亮狀態
Select Case m_lngBrdStyle
Case 0
DrawEdge hdc, rc, BDR_RAISEDINNER, BF_RECT
Case 1, 2, 3
DrawEdge hdc, rc, EDGE_RAISED, BF_RECT
End Select
Case 2 '按下狀態
Select Case m_lngBrdStyle
Case 0
DrawEdge hdc, rc, BDR_SUNKENOUTER, BF_RECT
Case 1
DrawEdge hdc, rc, BDR_SUNKENINNER, BF_RECT
Case 2, 3
DrawEdge hdc, rc, EDGE_SUNKEN, BF_RECT
End Select
End Select
End Sub