Dibujar en hDC de Un Usercontrol Windowless [Solucionado]

Iniciado por SONIC88, 17 Mayo 2010, 16:42 PM

0 Miembros y 1 Visitante están viendo este tema.

SONIC88

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í.
∞•••∞ MαЯcΘ™ ∞•••∞

Karcrack

Estaria bien que pusieses la respuesta para que todo el mundo pueda resolver un problema igual o similar

SONIC88

#2
Bueno aca dejo la respuesta que me dieron en el foro de Leandro Ascierto.

Respuesta en código:

Código (vb) [Seleccionar]

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.
∞•••∞ MαЯcΘ™ ∞•••∞

LeandroA

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.

BlackZeroX

#4
alguna vez alguien me dijo que asi se solucionaba...

Código (vb) [Seleccionar]


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)



Código (vb) [Seleccionar]


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.
The Dark Shadow is my passion.

SONIC88

#5
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!!!
∞•••∞ MαЯcΘ™ ∞•••∞