Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: _Grey en 23 de Marzo de 2006, 06:11:29 AM

Título: Acceder Al Hbitmap De Un Hdc De Una Ventana
Publicado por: _Grey en 23 de Marzo de 2006, 06:11:29 AM
 Estoy intentando acceder al HBITMAP de una ventana, para ello cojo el HDC de la ventana con GetDC(), despues cojo el HBITMAP con GetCurrentObject(), pero al usar GetObject() para acceder a los datos de este, los datos son incorrectos, es mas la funcion retorna un 0.

He probado a acceder a HBITMAP's de otros HDC's (que no son ventanas), y todo funciona bien.

Alguien sabe que puedo estar haciendo mal?! quiza no se pueda acceder al HBITMAP de un HDC de una ventana?

Gracias, y saludos.
Título: Acceder Al Hbitmap De Un Hdc De Una Ventana
Publicado por: zupervaca en 23 de Marzo de 2006, 10:48:57 AM
 Un dispositivo de contexto no tiene ningun bitmap selecciondo por defecto, si quieres capturar el contenido de la ventana debes de crear otro dc compatible, crear un bitmap compatible, seleccionarlo y realizar un bitblt del primer dc al que creaste, asi tendras la su contenido en el bitmap, algo asi:


CDC cDC;
cDC.CreateCompatibleDC( pSource );
CBitmap cBmp, *pOldBmp;
cBmp.CreateCompatibleBitmap( pSource, nWidth, nHeight );
pOldBmp = cDC.SelectObject( &cBmp );
cDC.BitBlt( 0, 0, nWidth, nHeight, pSource, 0, 0, SRCCOPY );
// Aqui ya tenemos en el bitmap seleccionado el contenido de pSource
...
...
cDC.SelectObject( &pOldBmp );

No te puedo decir si funciona o no al 100% ya que no lo he probado, estas son clases de MFC, pero existen sus gemelas en el api de win32.
Título: Acceder Al Hbitmap De Un Hdc De Una Ventana
Publicado por: marcode en 23 de Marzo de 2006, 12:04:10 PM
 Quizá te puede ayudar a saber por donde puede estar el fallo usando GetLastError().
Título: Acceder Al Hbitmap De Un Hdc De Una Ventana
Publicado por: _Grey en 23 de Marzo de 2006, 03:24:50 PM
 Buen punto el de GetLastError(), pero no todas las funciones de Win32 se apoyan en ella, y lamentablemente estas no lo hacen :angry: .

Parece que tiene razón zupervaca, y que el DC de la ventana no tiene por que tener un Bitmap por defecto, no tenia ni idea. Ya pensé en lo de crearle uno pero el campo bmBits cuando pides los datos (El puntero a la imagen) sale como NULL.... y lo necesito, vamos que tendría que crearlo con CreateDIBSection().

Tendré que encontrar un método suficiente eficiente o pasar, y dejarlo cutrecillo pero funcional como lo tenia.

Gracias a todos.
Título: Acceder Al Hbitmap De Un Hdc De Una Ventana
Publicado por: marcode en 23 de Marzo de 2006, 03:52:15 PM
 
Cita de: "_Grey"Buen punto el de GetLastError(), pero no todas las funciones de Win32 se apoyan en ella, y lamentablemente estas no lo hacen :angry:

Que sí que vale, o al menos eso pone en la ayuda de la función GetObject().

Citar
Return Values

If the function succeeds, and lpvObject is a valid pointer, the return value is the number of bytes stored into the buffer.

If the function succeeds, and lpvObject is NULL, the return value is the number of bytes required to hold the information the function would store into the buffer.

If the function fails, the return value is zero. To get extended error information, call GetLastError.


Por probar...
Título: Acceder Al Hbitmap De Un Hdc De Una Ventana
Publicado por: _Grey en 23 de Marzo de 2006, 10:06:20 PM
 ups! si, fallo mio. De todas formas, cuando lo probé, me daba el mismo código que tenia antes de llamar esas funciones, por eso pensé que no se apoyaban en el  :rolleyes: .

Me da el 8º código, de falta de memoria, pero que me lo haga bien con otros y teniendo 1Gb.... no me cuadra, por eso pensaba que se tratase de lo dicho por vaca.

En fin, gracias a todos, saludos!