Hola compipas del foro, necesito hacerles una consulta técnica, y que el titulo lo refleja, ¿cómo puedo dibujar sobre un hDC de una ventana en Windowless?, específicamente un Usercontrol. Necesito dibujar un texto con Drawtext (algo común, ya que no quiero usar un Label dentro del control :xD).
La cosa es que estoy haciendo un playlist, pero hacer cada botón de esa lista con una ventana vi que acumula mucha memoria, quisiera saber ademas si el control sin ventana gasta mas o menos memoria, ya que si no tendría que dibujar los botones directo sobre el contenedor y no como otro usercontrol aparte.
Por otra parte "creo" haber visto por ahí pero no recuerdo donde, un control de estas características en el cual se le creaba un hDC, jaja si alguien tiene algún datito y tiempo favor me ayuda.
Gracias!! :rolleyes:
EDITO:
<!--- Solucionado --->
Igual gracias por los que pasaron por aquí.
Estaria bien que pusieses la respuesta para que todo el mundo pueda resolver un problema igual o similar
Bueno aca dejo la respuesta que me dieron en el foro de Leandro Ascierto.
Respuesta en código:
Option Explicit
'propiedades del usercontrol en tiempo de diseño
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Private Const DT_CENTER = &H1
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Sub UserControl_Initialize()
'Propiedades del usercontrol en tiempo de diseño "Windowless = True"
UserControl.BackStyle = 0 'Transparent << opcional
UserControl.ClipBehavior = 0 'none
UserControl.ScaleMode = vbPixels '<< opcional
End Sub
Private Sub UserControl_Paint()
Dim Rec As RECT
Rec.Right = UserControl.ScaleWidth
Rec.Bottom = UserControl.ScaleHeight
DrawText UserControl.hdc, "hola mundo", 10, Rec, DT_CENTER
End Sub
Private Sub UserControl_HitTest(X As Single, Y As Single, HitResult As Integer)
HitResult = 1
End Sub
Aunque yo en realidad ya tenía este código, el problema es que yo pensaba que le faltaba algo o había que declarar algo más, como lo expuse en mi pregunta.
Lo curioso es que al correr el Usercontrol, este provocaba un error al dibujar el texto (o lo que sea que dibujes mediante el método PAINT), entonces me aparece el famoso error:
Error "398" en tiempo de ejecución:
El sitio cliente no esta disponible. :xD
De ahí mi pregunta.
La verdad me siguió saliendo el error, el cual nunca supe por qué. La solución simplemente fue agregar "On Error Resume Next" al principio del evento Paint antes de dibujar el texto. Por otra parte probé el código en un Usercontrol nuevo y no da error en ninguna circunstancia.
En fin, gracias a Leandro por darse el tiempo de responder.
Saludos.
Sonic88 , el error seguramente es porque haces referencia al parent, o el extender en algun lugar seguramente lo puede solucionar con
If Ambient.UserMode Then
si no funciona pone la linea del error
Saludos.
alguna vez alguien me dijo que asi se solucionaba...
rem Declaraciones API:
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
rem Variables privadas del control:
private lib32 as long
rem control_Initialize:
lib32=loadlibrary ("Shell32.dll")
rem control_finalize:
call FreeLibrary (lib32)
Rem Declaraciones API:
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Rem Variables privadas del control:
Private lib32 As Long
Private Sub UserControl_Initialize()
lib32 = LoadLibrary("Shell32.dll")
End Sub
Private Sub UserControl_Terminate()
FreeLibrary (lib32)
End Sub
Dulce Infierno Lunar.
Hola compipas, gracias por sus respuestas.
Bueno y si, era eso del extender que provocaba el error, lo que pasa es que los botones de la lista los hice como si fueran OptionButton con lo cual necesitaba esa opción para cuando se seleccione un boton el otro pierda la selección. En fin era algo simple, yo pensaba que me faltaba algo de código, pero no era así, la verdad no sabía que se provocara esto. Me di cuenta de lo del extender cuando fui borrando partes del código :xD , porque a mi me marcaba el error en el método PAINT, jaja entonces quedé medio perdido, porque antes no me había pasado.
Bueno chicos muchas gracias por todo y será hasta la próxima.
Saludos desde Chile!!!