Autor Tema: Ayuda con algunas Funciones de GDI32  (Leído 201 veces)

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

TOLO68

  • Bytes
  • *
  • Mensajes: 49
  • Reputación: +2/-0
    • Ver Perfil
Ayuda con algunas Funciones de GDI32
« en: Junio 02, 2020, 02:56:24 pm »
Hola a todo el foro

Estoy con el tema de graficos pero hay algunas funciones API que no entiendo
he buscado ejemplos pero no explican exactamente que funcion tienen

por ejemplo..

la funcion BitBlt
se que lo que hace es.... copiar una parte del HDC en el mismo u otro HDC

que en un programa de dibujo vendria a ser, como seleccionar una parte de la imagen
y pegarla en otra posicion de esta misma u otra imagen

StretchBlt hace lo mismo, pero pudiendo redimensionar la imagen

igual que GetDC devuelve el HDC de un HWND

pero..............

las funciones que no entiendo son las siguientes


- CreateCompatibleDC

- CreateCompatibleBitmap

- SelectObject

- ReleaseDC

- DeleteDC

- DeleteObject


y algunas variables como....

hBitmap=LoadImage...

posiblemente me deje alguna que ahora no recuerdo, que si se usa me la podrias decir

si me lo podeis explicar de forma en como usaria estas funciones un programa de dibujo

o si conoceis algun tutorial donde este explicado de una manera como si fuera  un programa de dibujo

Graciasss.....

Saludos desde España


LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1087
  • Reputación: +147/-8
    • Ver Perfil
Re:Ayuda con algunas Funciones de GDI32
« Respuesta #1 en: Junio 04, 2020, 07:24:30 pm »
Hola Tolo yo mas de lo que dice la msdn no te voy a poder explicar pero voy a tratar de decirtelo en criollo como decimos en Argentina que es a como yo entiendo o lo uso


CreateCompatibleDC  como dice la palabra crea un DC o hdc, luego lo suelo utilizar acomapado de CreateCompatibleBitmap

CreateCompatibleBitmap como dice la palabra crea un bitmap (mapa de bits) ahora bien todo hdc tiene objetos asociados, Brocha, pen, font, bitmap, paleta y algunas cosas mas que ahora no recuerdo, bien entonces cuando utilizao CreateCompatibleBitmap ese hbitmap se lo asigno a el hdc devuelto por CreateCompatibleDC  (SelectObject(hDC, hBmp) )  el api SelectObject es quien se encarga de asociar ese bmp al DC, SelectObject  en este caso retorno el viejo bmp que tenia ese hdc, el que luego deveremos devolver a ese hdc porque es windows quien se encargara de elminarlo, tu tendras que eliminar el que creaste con CreateCompatibleBitmap
enfocando ahora en SelectObject  si al hdc le hubieras asociado una fuente SelectObject  retornaria la vieja fuente del hdc.
DeleteObject elemina a esos objectos bitmap, brochas, pen, fonts etc etc

ReleaseDC se usa para GetDC
DeleteDC se usa para CreateCompatibleDC  tambien se pude utilizar DeleteObject

ahora vamos a un ejemplo para que se entienda mejor, vamos a crear un lienzo o hdc virtual no se bien como llamarlo porque algunos le dicen de otra forma pero la idea seria por ejemplo no depender de un picturebox para pintar algo temporalmente.

Código: Visual Basic
  1. Option Explicit
  2. Private Declare Function StretchBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
  3. Private Declare Function SetStretchBltMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
  4. Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  5. Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
  6. Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
  7. Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
  8. Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
  9. Private Declare Function GdiTransparentBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
  10. Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
  11. Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
  12. Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
  13.  
  14.  
  15. Private Sub Form_Load()
  16.     Dim ScreenDC          As Long
  17.     Dim MiHdc      As Long
  18.     Dim hBmp        As Long
  19.     Dim hOldBmp     As Long
  20.  
  21.     Me.AutoRedraw = True
  22.     ScreenDC = GetDC(0) 'al pasar el paramentro 0 recuperamos el hdc de la pantalla
  23.    MiHdc = CreateCompatibleDC(0) 'crea un nuevo hdc
  24.    hBmp = CreateCompatibleBitmap(ScreenDC, 100, 100) ' crea un nuevo bitmap de 100x100 pixels
  25.    hOldBmp = SelectObject(MiHdc, hBmp) 'asociamos nuestro bitmap al hdc, rertorna el el viejo bmp y lo guardamos para luego restaurarlo.
  26.  
  27.     BitBlt MiHdc, 0, 0, 100, 100, ScreenDC, 300, 300, vbSrcCopy 'copia parte de la pantalla en nuestro buffer
  28.    BitBlt Me.hdc, 20, 20, 100, 100, MiHdc, 0, 0, vbSrcCopy 'luego copia el buffer a nuestro formulario
  29.  
  30.     SelectObject MiHdc, hOldBmp 'restaura el viejo bitmap al hdc
  31.    ReleaseDC 0&, ScreenDC 'liberamos el dc de la pantalla
  32.    DeleteDC MiHdc 'eliminamos nuestro hdc
  33.    DeleteObject hBmp 'elminamos el bmp
  34. End Sub

este ejemplo copio parte de la pantalla la almaceno en un buffer (hdc) y luego pinto este buffer en el formulario
no tiene mucha utilidad el ejemplo pero podras entender para que sirve cada api en cuestion.


si utilizas el api loadimage esta puede retornar un bmp un icono u otros, en caso de un bmp puedes pintarlo en un form con bitblt pero antenes necesitas su hdc para ello

Código: [Seleccionar]
hBitmap=LoadImage...
PicDC = CreateCompatibleDC(0)
OldhBmp = SelectObject(PicDC, hBitmap)

listo ya tienes tu PicDC

si fuera un icono
Código: [Seleccionar]
Private Declare Function DrawIcon Lib "user32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long

hIcon = LoadImage...
DrawIcon  me.hdc,x,y, hIcon
   


espero que haya aclarado alguna duda.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2851
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ayuda con algunas Funciones de GDI32
« Respuesta #2 en: Junio 05, 2020, 06:43:48 pm »
Hola Lea, siguiendo en la linea y basándome un poco en la sugerencia de Coco.

Si por ejemplo tengo 50 formularios y a todos les quiero aplicar un degrade, podría tener una imagen con el degrade y asignarlo al form pero seria 50 veces y es muy costoso.
La otra entonces es crear ese degrade por código y aquí no tengo problema de memoria pero si de proceso pq tendría que estar dibujando el degrade cada vez que abra el form.

La tercera opción seria crear una sola vez por código ese degrade y pintarlo en un picture y luego la imagen de ese picture (no se si lo tratara como imagen) pasarlo al form que abra.

En este caso seria crear el degrade en un buffer - para prescindir del picture - y ese buffer lo asigno al formulario que desee.

¿Podría entonces mantener ese buffer toda la vida que se este ejecutando el programa?
¿Podría tener varios "buffer" por si quiero tener diferentes degrades a la vez?

Voy a intentarlo. Muchas gracias
« última modificación: Junio 05, 2020, 06:46:09 pm por YAcosta »
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1087
  • Reputación: +147/-8
    • Ver Perfil
Re:Ayuda con algunas Funciones de GDI32
« Respuesta #3 en: Junio 05, 2020, 08:09:39 pm »
Yvan,viendo por partes,  crear degrade por códigos puede ser mas costoso que pintar una imagen, hablando de CPU
desde ya descarto poner una imagen a cada form en tiempo de diseño eso si ocuparia mucha ram y o agrandaria el ejecutable incesariamente.
ahora dos opciones una es tener una imagen grande de un degrade (leida desde disco archivo de recurso)  en memoria (buffer) y luego pintarla a cada form, o crear un buffer como el de que hablamos mas arriba y pintar un degrade en el hdc,  luego cada vez que se abre un formulario pintarlo (stretchblt + SetStretchBltMode ) asi no tener que generar ese degrade por cada form que abris, esto para acelerar la apertura del form,
ahora bien que va a pasar, aca es tenes que tomar otra decicion, si queres ahorar un poco mas de ram es conveniente que no uses autoredraw ya que esto crea otro buffer aparte por cada form, lo conveniente seria que pintes tu buffer principal en el evento Paint de tu form. peeeeroooo jaja si hay peros, en el form resize tenes que llamar a Refresh lo cual produce un poco de parpadeo, entonces si no queres el parpadeo autoredraw =true
una forma de dicimular el parpadeo este tener el backcolor con uno de los colores del degrade,
« última modificación: Junio 05, 2020, 08:17:18 pm por LeandroA »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2851
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ayuda con algunas Funciones de GDI32
« Respuesta #4 en: Junio 05, 2020, 08:49:46 pm »
Ok doctor, varias cositas que considerar.

Voy a ver en que concluyo, gracias Doc.
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2851
  • Reputación: +159/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ayuda con algunas Funciones de GDI32
« Respuesta #5 en: Junio 05, 2020, 08:55:25 pm »
Por cierto, lo que pretendía era crear una interfaz para TODOS mis formularios (casi 100) similar a este:





Como es harta chamba el cambio de cara necesito estar seguro de cual seria el mejor camino.
Me encuentras en YAcosta.com