Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Problema con Evento paint de un user control

Estas en el tema de Problema con Evento paint de un user control en el foro de Visual Basic clásico en Foros del Web. Hola tengo un problema con el evento Paint de un usercontrol Este se ejecuta cuando se repinta la ventana completa (toda el area del mismo), ...
  #1 (permalink)  
Antiguo 22/07/2006, 11:22
 
Fecha de Ingreso: abril-2004
Mensajes: 192
Antigüedad: 20 años
Puntos: 0
Problema con Evento paint de un user control

Hola tengo un problema con el evento Paint de un usercontrol
Este se ejecuta cuando se repinta la ventana completa (toda el area del mismo), pero no se dispara cuando se repinta solo una parte del mismo, ¿alguien sabe como forzar a que se dispare cuando se repinta solo una parte?

Salu2
__________________
Recursos visual basic
  #2 (permalink)  
Antiguo 22/07/2006, 12:29
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 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
  #3 (permalink)  
Antiguo 22/07/2006, 13:19
 
Fecha de Ingreso: abril-2004
Mensajes: 192
Antigüedad: 20 años
Puntos: 0
Hola Leandro, si es como decis, con el AutoRedaw en true no se dispara el Paint, y en los formularios tampoco. Yo estaba usabndo el autoredraw en false, por lo que si se ejecutaba el Paint.

El problema era que yo queria que se disparara el Paint no cuando se hace un repintado completo de la ventana del userC, si no que tambien se dispare cuando se repinta una porcion de la ventana.(un sector de la misma)

La solucion estaba en colocar la propiedad ClipControls en false, de este modo, por ejemplo si tengo el usercontrol en la ventana de diseño, y coloco cualquier control encima del mismo, se dispara, del otro modo, no se disparaba, a no ser que un control tapase completamente el control, o que maximize y minimize la ventana del formulario o del ide del vb. No se si me abré explicado bien, ya que es medio choto explicarlo. Igual el módulo ese está muy bueno, ya que como decis , si queres intercetar el paint, y una ventana tiene activada el autoredraw, es imposibkle de hacerlo.

Con lo que me preguntás, me enteré el otro dia de como determinar si se esta en tiempo de diseño o de ejecución. Tenes que usar la propiedad UserMode del objeto Ambient

por ej:

Código:
Private Sub UserControl_Show()
If Ambient.UserMode Then
   MsgBox "Estoy en tiempo de ejecución"
End If

If Ambient.UserMode = False Then
   MsgBox "Estoy en tiempo de diseño"
End If

End Sub
saludos.

Pd para los moderadores: ¿no se puede cambiar el lapso de tiempo para sacar de sesión al estar inactivo? es muy incomodo postear de esta forma, si no me acordaba de hacer un copy paste perdia el mensaje y tenia que volver a escribir


saludos
__________________
Recursos visual basic
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:27.