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

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

TOLO68

  • Kilobyte
  • **
  • Mensajes: 60
  • 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: 1128
  • Reputación: +150/-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: (Vb) [Seleccionar]
Option Explicit
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
Private Declare Function SetStretchBltMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
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
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
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
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long


Private Sub Form_Load()
    Dim ScreenDC          As Long
    Dim MiHdc      As Long
    Dim hBmp        As Long
    Dim hOldBmp     As Long
 
    Me.AutoRedraw = True
    ScreenDC = GetDC(0) 'al pasar el paramentro 0 recuperamos el hdc de la pantalla
    MiHdc = CreateCompatibleDC(0) 'crea un nuevo hdc
    hBmp = CreateCompatibleBitmap(ScreenDC, 100, 100) ' crea un nuevo bitmap de 100x100 pixels
    hOldBmp = SelectObject(MiHdc, hBmp) 'asociamos nuestro bitmap al hdc, rertorna el el viejo bmp y lo guardamos para luego restaurarlo.

    BitBlt MiHdc, 0, 0, 100, 100, ScreenDC, 300, 300, vbSrcCopy 'copia parte de la pantalla en nuestro buffer
    BitBlt Me.hdc, 20, 20, 100, 100, MiHdc, 0, 0, vbSrcCopy 'luego copia el buffer a nuestro formulario

    SelectObject MiHdc, hOldBmp 'restaura el viejo bitmap al hdc
    ReleaseDC 0&, ScreenDC 'liberamos el dc de la pantalla
    DeleteDC MiHdc 'eliminamos nuestro hdc
    DeleteObject hBmp 'elminamos el bmp
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: 2853
  • Reputación: +160/-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: 1128
  • Reputación: +150/-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: 2853
  • Reputación: +160/-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: 2853
  • Reputación: +160/-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