Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: F3B14N en 12 Marzo 2011, 14:48 pm



Título: [SNIPPET-VB6] DrawGraph - Dibujar sobre controles.
Publicado por: F3B14N en 12 Marzo 2011, 14:48 pm
Lo hice hace ya un tiempo para hacer poner imágenes en los commandbutton y que queden en la misma linea, pero se puede aplicar a cualquier control.

Código
  1. Option Explicit
  2.  
  3. Private Const WM_PAINT As Long = &HF
  4. Private Const GWL_WNDPROC = -4
  5.  
  6. Private Type DRAW_DATA
  7.    DrawPic As PictureBox
  8.    DrawTop As Long
  9.    DrawLeft As Long
  10.    lpPrevWndProc As Long
  11.    ControlHwnd As Long
  12.    ControlDC As Long
  13. End Type
  14.  
  15. Private Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  16. Private Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  17. Private Declare Function GetDC Lib "USER32" (ByVal Hwnd As Long) As Long
  18. Private Declare Function GdiTransparentBlt Lib "GDI32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
  19.  
  20. Private DrawArray() As DRAW_DATA
  21.  
  22. Public Sub DrawGraph(Hwnd As Long, Pic As PictureBox, Top As Long, Left As Long)
  23.    Dim i As Long
  24.  
  25.    If Not Not DrawArray Then: i = UBound(DrawArray) + 1
  26.    ReDim Preserve DrawArray(i)
  27.  
  28.    With DrawArray(i)
  29.        Set .DrawPic = Pic
  30.        .DrawPic.BorderStyle = 0
  31.        .DrawPic.ScaleMode = vbPixels
  32.        .DrawPic.BackColor = &HFF00FF
  33.        .DrawPic.AutoSize = True
  34.        .DrawPic.Refresh
  35.  
  36.        .ControlHwnd = Hwnd
  37.        .lpPrevWndProc = SetWindowLong(Hwnd, GWL_WNDPROC, AddressOf ControlProc)
  38.        .ControlDC = GetDC(Hwnd)
  39.        .DrawTop = Top: .DrawLeft = Left
  40.    End With
  41. End Sub
  42.  
  43. Public Sub UnDrawGraph(ByVal Hwnd As Long)
  44.    Dim i As Long
  45.  
  46.    For i = 0 To UBound(DrawArray)
  47.        If DrawArray(i).ControlHwnd = Hwnd Then
  48.            Call SetWindowLong(Hwnd, GWL_WNDPROC, DrawArray(i).lpPrevWndProc)
  49.        End If
  50.    Next i
  51. End Sub
  52.  
  53. Private Function ControlProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  54.    Dim i As Long
  55.  
  56.    For i = 0 To UBound(DrawArray)
  57.        With DrawArray(i)
  58.            If .ControlHwnd = Hwnd Then
  59.                ControlProc = CallWindowProc(.lpPrevWndProc, Hwnd, Msg, wParam, lParam)
  60.                If (Msg = WM_PAINT) Then
  61.                    Call GdiTransparentBlt(.ControlDC, .DrawLeft, .DrawTop, .DrawPic.ScaleWidth, .DrawPic.ScaleHeight, .DrawPic.hdc, 0, 0, .DrawPic.ScaleWidth, .DrawPic.ScaleHeight, &HFF00FF)
  62.                End If
  63.            End If
  64.        End With
  65.    Next i
  66. End Function