ToolBar的模样自己画(四)
[作者]:菩提树下的杨过 [来源]:互联网 [收录时间]:2007-9-16 12:54:13

´几个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