Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: SONIC88 en 17 Mayo 2010, 16:42 pm



Título: Dibujar en hDC de Un Usercontrol Windowless [Solucionado]
Publicado por: SONIC88 en 17 Mayo 2010, 16:42 pm
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í.


Título: Re: Dibujar en hDC de Un Usercontrol Windowless [Solucionado]
Publicado por: Karcrack en 18 Mayo 2010, 21:30 pm
Estaria bien que pusieses la respuesta para que todo el mundo pueda resolver un problema igual o similar


Título: Re: Dibujar en hDC de Un Usercontrol Windowless [Solucionado]
Publicado por: SONIC88 en 18 Mayo 2010, 22:47 pm
Bueno aca dejo la respuesta que me dieron en el foro de Leandro Ascierto.

Respuesta en código:

Código
  1. Option Explicit
  2. 'propiedades del usercontrol en tiempo de dise&#241;o
  3. 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
  4.  
  5. Private Const DT_CENTER = &H1
  6.  
  7. Private Type RECT
  8.    Left As Long
  9.    Top As Long
  10.    Right As Long
  11.    Bottom As Long
  12. End Type
  13.  
  14. Private Sub UserControl_Initialize()
  15.    'Propiedades del usercontrol en tiempo de dise&#241;o "Windowless = True"
  16.    UserControl.BackStyle = 0 'Transparent << opcional
  17.    UserControl.ClipBehavior = 0 'none
  18.    UserControl.ScaleMode = vbPixels '<< opcional
  19. End Sub
  20.  
  21. Private Sub UserControl_Paint()
  22.  
  23.    Dim Rec As RECT
  24.  
  25.    Rec.Right = UserControl.ScaleWidth
  26.    Rec.Bottom = UserControl.ScaleHeight
  27.  
  28.    DrawText UserControl.hdc, "hola mundo", 10, Rec, DT_CENTER
  29.  
  30.  
  31. End Sub
  32.  
  33.  
  34. Private Sub UserControl_HitTest(X As Single, Y As Single, HitResult As Integer)
  35.    HitResult = 1
  36. End Sub
  37.  

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.


Título: Re: Dibujar en hDC de Un Usercontrol Windowless [Solucionado]
Publicado por: LeandroA en 19 Mayo 2010, 12:18 pm
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.


Título: Re: Dibujar en hDC de Un Usercontrol Windowless [Solucionado]
Publicado por: BlackZeroX en 19 Mayo 2010, 15:05 pm
alguna vez alguien me dijo que asi se solucionaba...

Código
  1.  
  2. rem Declaraciones API:
  3. Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
  4. Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
  5.  
  6. rem Variables privadas del control:
  7. private lib32 as long
  8.  
  9. rem control_Initialize:
  10. lib32=loadlibrary ("Shell32.dll")
  11.  
  12. rem control_finalize:
  13. call FreeLibrary (lib32)
  14.  
  15.  

Código
  1.  
  2. Rem Declaraciones API:
  3. Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
  4. Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
  5. Rem Variables privadas del control:
  6. Private lib32 As Long
  7.  
  8. Private Sub UserControl_Initialize()
  9.    lib32 = LoadLibrary("Shell32.dll")
  10. End Sub
  11.  
  12. Private Sub UserControl_Terminate()
  13.    FreeLibrary (lib32)
  14. End Sub
  15.  
  16.  
  17.  

Dulce Infierno Lunar.


Título: Re: Dibujar en hDC de Un Usercontrol Windowless [Solucionado]
Publicado por: SONIC88 en 19 Mayo 2010, 18:52 pm
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!!!