创建画刷是CreateHatchBrush(m_FillStyle, m_FillColor)
创建画笔是CreatePen(m_BorderStytle, m_BorderWidth, m_BorderColor)
我的区域需要一个虚线的边界,但是区域只能用画刷描绘边界。怎么才能用画笔来描绘区域的边界?
FrameRgn函数是用画刷描绘区域,用FillRgn来填充区域。如何创建一个和画笔风格一样的画刷?让区域看上去象画笔描绘的?我需要一个Dot模式的画刷,怎么做?
请指教!
非常感谢!

解决方案 »

  1.   

    GDI32函数没有研究过,惭愧……
      

  2.   

    下面是一个用 CreatePatternBrush 的例子,
    适合画长方形,但不适合画圆等不规则形状。
    不过,你描绘区域的边界有什么用吗?Option ExplicitPrivate Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
    Private Declare Function FrameRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As LongPrivate Sub Form_Paint()
      Dim ptnBmp As Long, ptnBrush As Long
      Dim ptnData(3&) As Long
      Dim tmpRgn As Long
      ptnData(0&) = &HF00FF00F
      ptnData(1&) = &HF00FF00F
      ptnData(2&) = &HFF00FF0
      ptnData(3&) = &HFF00FF0
      ptnBmp = CreateBitmap(8&, 8&, 1&, 1&, ptnData(0&))
      If ptnBmp Then
        ptnBrush = CreatePatternBrush(ptnBmp)
        If ptnBrush Then
          tmpRgn = CreateRectRgn(10&, 10&, 39&, 39&)
          If tmpRgn Then
            SetTextColor Me.hdc, vbBlue
            FrameRgn Me.hdc, tmpRgn, ptnBrush, 1&, 1&
            DeleteObject tmpRgn
          End If
          DeleteObject ptnBrush
        End If
        DeleteObject ptnBmp
      End If
    End Sub'VB6 + WinME -> OK
      

  3.   

    '改了一下,修改成了一个函数。直接调用就行了Option Explicit'以下函数是 Form_Paint 所需要的。可以删除。
    Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long'以下函数是 FrameRegionDot 所需要的。
    Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
    Private Declare Function FrameRgn Lib "gdi32" (ByVal hDC As Long, ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function SetTextColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long
    Private Declare Function SetBkColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long
    Private Declare Function SetROP2 Lib "gdi32" (ByVal hDC As Long, ByVal nDrawMode As Long) As Long
    Private Declare Function GetROP2 Lib "gdi32" (ByVal hDC As Long) As Long
    Private Declare Function GetTextColor Lib "gdi32" (ByVal hDC As Long) As Long
    Private Declare Function GetBkColor Lib "gdi32" (ByVal hDC As Long) As Long'一段演示程序。不是描绘区域边框所需要的。可以删除。
    Private Sub Form_Paint()
      Dim tmpRgn As Long
      tmpRgn = CreateRectRgn(10&, 10&, 39&, 39&)
      If tmpRgn Then
        
        FrameRegionDot Me.hDC, tmpRgn, vbRed, True
        
        DeleteObject tmpRgn
      End If
      
      tmpRgn = CreateRectRgn(30&, 30&, 69&, 69&)
      If tmpRgn Then
        
        FrameRegionDot Me.hDC, tmpRgn, vbYellow, False
        
        DeleteObject tmpRgn
      End If
      
      tmpRgn = CreateEllipticRgn(10&, 80&, 110&, 110&)
      If tmpRgn Then
        
        FrameRegionDot Me.hDC, tmpRgn, vbGreen, False
        
        DeleteObject tmpRgn
      End If
    End Sub'以点的方式描绘区域边框的函数,适合于描绘正方形等规则区域。
    '参数                         解释
    'hDC                          边框描绘到的设备场景
    'hRgn                         需要描绘的区域
    'lColor                       描绘的边框的颜色
    'bThick                       是否以粗线来描绘(True:用粗线,2px  False:用细线,1px)(可选的)
    Sub FrameRegionDot(ByVal hDC As Long, ByVal hRgn As Long, ByVal lColor As Long, Optional ByVal bThick As Boolean)
      Dim ptnBmp As Long, ptnBrush As Long
      Dim ptnData(3&) As Long, lLen As Long
      Dim oTc As Long, oBc As Long, oRop As Long
      
      oTc = GetTextColor(hDC): oBc = GetBkColor(hDC): oRop = GetROP2(hDC)
      
      If bThick Then lLen = 2& Else lLen = 1&
      
      ptnData(0&) = &HF00FF00F
      ptnData(1&) = &HF00FF00F
      ptnData(2&) = &HFF00FF0
      ptnData(3&) = &HFF00FF0
      ptnBmp = CreateBitmap(8&, 8&, 1&, 1&, ptnData(0&))
      If ptnBmp Then
      
        ptnBrush = CreatePatternBrush(ptnBmp)
        If ptnBrush Then
        
          SetTextColor hDC, vbBlack
          SetBkColor hDC, vbWhite
          SetROP2 hDC, vbMaskPen
          FrameRgn hDC, hRgn, ptnBrush, lLen, lLen
          
          SetTextColor hDC, lColor
          SetBkColor hDC, vbBlack
          SetROP2 hDC, vbMergePen
          FrameRgn hDC, hRgn, ptnBrush, lLen, lLen
          
          DeleteObject ptnBrush
        End If
        DeleteObject ptnBmp
        
        SetTextColor hDC, oTc: SetBkColor hDC, oBc: SetROP2 hDC, oRop
      End If
    End Sub