Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/07/2006, 12:29
LeandroA
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 20 años
Puntos: 3
Hola Luciano yo por lo que tengo entendido los eventos paint son medios cagada
y la solucion para eso es hacer un gancho hook
por las pruevas que hice el evento paint de los usercontrol no se da cuando tienen la propiedad AutoRedraw = True (seguramente tu lo deves tener asi)
te paso la forma de la que te decia

en un usercontrol
Cita:
Private Sub UserControl_Initialize()
UserControl.AutoRedraw = True 'Prova cambiar por false y mira los resultados
HookForm hwnd
End Sub

Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Print "Prueva"
'UserControl.Refresh
End Sub

Private Sub UserControl_Paint()
Debug.Print "Evento del UserControl_Paint"
End Sub

Private Sub UserControl_Terminate()
UnHookForm hwnd
End Sub
y en un modulo
Cita:
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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
Public Const WM_PAINT = &HF
Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Public Sub HookForm(hwnd As Long)
PrevProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
If uMsg = WM_PAINT Then
Static X As Integer
X = X + 1
Debug.Print "Pintando :" & X & " Veses"
End If
End Function
Anda cambiando la propiedad UserControl.AutoRedraw = False y fijate que entonses si se dispara el evento del UserControl en cambio con hook siempre lo intercepta

Saludos

PD: Por las dudas no sabes como hacer para que el evento UserControl_Show se dispare solo cuando esta realmente el formulario ejecutandose y no en tiempo de edicion, yo estoy haciendo con el api getparent comprovando si es getparent(hwnd) = 0 es porque se esta ejecutando de lo contrario es un formulario hijo (osea del caso de vb) pero no creo que sea la forma correcta ya que si el ocx se ejecuta en formulario mdi no funcaria
__________________
www.leandroascierto.com