Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Acceder Al Hbitmap De Un Hdc De Una Ventana

Iniciado por _Grey, 23 de Marzo de 2006, 06:11:29 AM

« anterior - próximo »

_Grey

 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.

zupervaca

 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.

marcode

 Quizá te puede ayudar a saber por donde puede estar el fallo usando GetLastError().
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

_Grey

 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.

marcode

 
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...
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

_Grey

 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!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.