Bitmap Compatible

Bitmap Compatible

Postby antolin » Mon Mar 17, 2014 1:17 pm

Hola foreros,

¿Hay alguna manera de pintar un dialogo completo (incluidos sus controles) en DC compatible?

Me explico: necesito crear un bitmap del dialogo. En principio no tengo inconvenientes con WndBitmap(); el problema surge cuando parte del dialog se encuentra fuera de la pantalla, entonces las partes no visibles salen negras en el bitmap. Ahora mismo lo he solucionado moviendo el dialogo a un sitio enteramente visible antes de crear el bitmap, pero no me gusta el efecto del movimiento del dialogo antes de esa operación. Por eso me gustaría saber si se pudiera dibujar ese dialogo en un DC compatible para crear el bitmap desde ese DC y evitar así las partes negras sin tener que mover el dialogo previamente.

Gracias
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Bitmap Compatible

Postby pgfdz » Wed Mar 19, 2014 2:25 pm

Hola.
Hace tiempo que hice algo así. Mira a ver porque no lo he probado.

...
CaptureWnd( oDlg:hWnd, "bitmap.bmp")
...


#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC( CAPTUREWND )
{
HWND hWnd = ( HWND ) hb_parnl( 1 );
SendMessage( hWnd, WM_USER, (WPARAM) hb_parc( 2 ),130869856);
hb_ret();
}

#pragma ENDDUMP

Un saludo
Paco García
pgfdz
 
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Bitmap Compatible

Postby antolin » Thu Mar 20, 2014 10:28 am

Gracias pgfdz

He probado tu utilidad, pero no hace nada. No se corta el progrma pero tampoco da algún resultado. Tampoco ha creado ningún fichero "bitmap.bmp". Por cierto que mensaje es: 130869856

Saludos.
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Bitmap Compatible

Postby pgfdz » Thu Mar 20, 2014 2:10 pm

No me acuerdo que era ese mensaje. No recuerdo si tenía algo que ver con WM_PRINTCLIENT o WM_PRINT no lo recuerdo.
Acabo de montar este ejemplo y funciona sin problemas.
Mira a ver si te aclara algo

Code: Select all  Expand view
// Building an application just with a DialogBox

#include "FiveWin.ch"

static oDlg

//----------------------------------------------------------------------------//

function Main()

   // local oDlg

   DEFINE DIALOG oDlg FROM 6, 6 TO 20, 60 TITLE "Hello World!"

   @ 2, 2 BUTTON "&Hello" OF oDlg ;
      ACTION ( MsgAbout( FWVERSION, FWCOPYRIGHT ), _SetMenu() )

   @ 4, 2 BUTTON "&Bye!" OF oDlg ACTION oDlg:End()

   ACTIVATE DIALOG oDlg ON INIT CaptureWnd( oDlg:hWnd, ".\bitmap.bmp" )

return nil

//----------------------------------------------------------------------------//

function _SetMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&One"  ACTION MsgInfo( "One" )
      MENUITEM "&Two"  ACTION MsgInfo( "Two" )
   ENDMENU

   oDlg:SetMenu( oMenu )

return nil

//----------------------------------------------------------------------------//

procedure AppSys  //  XBase++ requirement

return

//----------------------------------------------------------------------------//




#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"

HB_FUNC( CAPTUREWND )
{
   HWND hWnd = ( HWND ) hb_parnl( 1 );
   SendMessage( hWnd, WM_USER, (WPARAM) hb_parc( 2 ),130869856);
   hb_ret();
}

#pragma ENDDUMP
 
Paco García
pgfdz
 
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Bitmap Compatible

Postby pgfdz » Thu Mar 20, 2014 2:14 pm

Rectifico, me ha funcionado la primera vez y ya ninguna mas. No se que pasa en el programa que lo corro funciona sin problemas
Paco García
pgfdz
 
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Bitmap Compatible

Postby pgfdz » Thu Mar 20, 2014 2:28 pm

Creo recordar que tenía algo que ver con este artículo:

http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21965694.html

Saludos
Paco García
pgfdz
 
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Bitmap Compatible

Postby karinha » Thu Mar 20, 2014 3:44 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Bitmap Compatible

Postby antolin » Fri Mar 21, 2014 8:56 am

Gracias por el interés.

El problema no es capturar la pantalla, hay varios métodos para ello. El problema es capturar el dialogo cuando parte de éste está fuera de la vista, fuera de pantalla. Las partes no visibles salen en negro en el bitmap compatible. Lo unico que se le acerca es SendMessage(hWnd,WM_PRINT,hDcMem,PRF....) pues captura las partes invisibes, pero sólo del dialogo, no de sus controles. Voy a seguir por ese camino y si no lo consigo tendré que pasar al plan B.

El plan B consistirá en captrar el dialogo por partes, primero su propio fondo y después sus contoles, un bitmap compatible por cada control. El problema es que el método PAINT() utiliza ::hDc que viene de sus propio BeginPaint(), y por ahí no se puede pintar en un DC compatible. La suerte es que como mi FWH es antiguo, tengo mis propios controles y podré modificarlos para insertarles un metodo PaintInCompDc() y a ver que pasa.

También lo he intentado saltandome el metodo Display(), llamando directamente a BeginPaint(), e intentando modificar el valor de la región a pintar insertando los valores directamente en el rcPaint de la PAINTSTRUCTURE (o como se llame) que se guarda en ::cPS, pero no consigo que funcione, pues no sé si es porque la estructura se guarda en ::cPS como string (no tene por qué), o porque rcPaint se reconfigura durante el pintado.

Seguiré probando.
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Bitmap Compatible

Postby antolin » Fri Mar 21, 2014 9:46 am

Definitivamente, voy a pasar al plan B. Ya os comenteré
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Bitmap Compatible (Solucionado)

Postby antolin » Mon Mar 24, 2014 7:31 am

Listo. El plan B a funcionado.

He añadido el método PaintInCompDC() a mis clases de esta manera:

Code: Select all  Expand view
METHOD PaintInCompDC() CLASS ...
   LOCAL hCDC := CreateCompatibleDC(::GetDc())
   LOCAL hBmp := CreateCompBmp(::hDc,::nWidth,::nHeight)
   *
   SelectObject(hCDC,hBmp)
   ::ReleaseDc()
   ::hDc := hCDC    // PARA QUE SE EVALUE EL bPainted
   ::EraseBkGnd(hCDC)
   ::Paint()        // PARA QUE SE EVALUE EL bPainted
   DeleteDc(hCDC)
   ::hDc := NIL
RETURN hBmp     // NO OLVIDAR DeleteObject(hBmp) AL ACABAR

En teoría con ::EraseBkGnd(hCDC) sería suficiente y no sería necesario todo esto, pero para poder evaluar los distintos bPainted tenía que hacerlo así:

Después he utilizado los distintos 'hBmp' para componer el bitmap compatible que es el bitmap que necesitaba para mi propósito. Lo he implementado más o menos así:

Code: Select all  Expand view
oDlA:GetDc()
  hCDC := CreateCompatibleDC(oDlA:hDc)
  hBmp := CreateCompBmp(oDlA:hDc,oDlA:nWidth,oDlA:nHeight)
  SelectObject(hCDC,hBmp)
  hCBm := oDlA:PaintInCompDC()
  PalBmpDraw(hCDC,0,0,hCBm)
  DeleteObject(hCBm)
  FOR EACH xDat IN oDlA:aControls
      hCBm := xDat:PaintInCompDC()
      PalBmpDraw(hCDC,xDat:nTop,xDat:nLeft,hCBm)
      DeleteObject(hCBm)
  NEXT
  DeleteDc(hCDC)
oDlA:ReleaseDc()

Y ya tengo mi hBmp completo para trabajar, aunque el dialogo esté parcialmente escondido.

A ver si esta tarde, desde casa, puedo subir unos pantallazos del programa para que vean el resultdo.

Saludos
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Bitmap Compatible (solucionado)

Postby antolin » Mon Mar 24, 2014 6:12 pm

He aqui un par de patallas para que vean el resultado.

He de aclarar que, a la hora de programar, soy un poco especial. Primero visualizo qué es lo que quiero conseguir, y después me pongo mano a la obra y no paro hasta que no quede exactamente como me lo imaginaba. Tengo la ventaja de que no me dedico comercialmente a la informática y puedo disponer de mucho tiempo (cuando la familia me deja). Es una afición. Sólo programo para crear herramientas que me asistan en mi trabajo y de paso investigo nuevos métodos, funciones y algoritmos. En este caso se trata de un programa que consiste en una serie de browses/listboxs (de clase propia) que contienen datos que tengo que analizar comparándolos con una base de datos, para finalmente presentar los resultados en un dialogo. Para poder alternar entre el dialogo de resultados y el window de los listboxs de partida (un entorno MDI no me servía), necesitaba minimizar el dialogo, pero de forma especial, pues quería una pantallita NOWAIT a pie de pantalla con una representación en miniatura del dialogo, y que ésta se pudiese desplazar con el ratón para no molestar la consulta y poder interactuar libremente con los listboxs. En realidad lo que hago es guardar los datos de los resultados y cerrar el dialogo, aparentemente, minimizándolo de forma progresiva (en 20 pasos). Para volver a 'maximizarlo' vuelvo a crear el dialogo recuperando los datos guardados, y así no tener que esperar a un nuevo análisis, que tarda un poquito. En realidad, no hacía falta tanta parafernalia, pero lo quería así...

Esta es la pantalla inicial donde pueden ver el dialogo azul de resultados (parcialmente invisible, porque se puede desplazar con el ratón), sobre el window de presentación de los datos (verde claro). Ese era el problema, inicialmente el dialogo se crea centrado en la pantalla y se ve entero, pero como se puede desplazar, debía contemplar la posibilidad de que alguién lo minimizara cuando está parcialmente escondido, y al minimizarlo la parte no visible salía en negro en el bitmap obtenido con WndBitmap(). Ahora ya sale bien.

Image

En las dos siguientes pantallas se ve que el dialogo ya está 'minimizado', en diversoas posiciones, representado por una pantallita azul, que además del bitmap miniaturizado, que como ve, se puede desplazar con el ratón, tiene dos botones: "Restaurar" y "Cerrar".
Image
Image
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Bitmap Compatible (solucionado)

Postby antolin » Mon Mar 24, 2014 6:13 pm

He aqui un par de patallas para que vean el resultado.

He de aclarar que, a la hora de programar, soy un poco especial. Primero visualizo qué es lo que quiero conseguir, y después me pongo mano a la obra y no paro hasta que no quede exactamente como me lo imaginaba. Tengo la ventaja de que no me dedico comercialmente a la informática y puedo disponer de mucho tiempo (cuando la familia me deja). Es una afición. Sólo programo para crear herramientas que me asistan en mi trabajo y de paso investigo nuevos métodos, funciones y algoritmos. En este caso se trata de un programa que consiste en una serie de browses/listboxs (de clase propia) que contienen datos que tengo que analizar comparándolos con una base de datos, para finalmente presentar los resultados en un dialogo. Para poder alternar entre el dialogo de resultados y el window de los listboxs de partida (un entorno MDI no me servía), necesitaba minimizar el dialogo, pero de forma especial, pues quería una pantallita NOWAIT a pie de pantalla con una representación en miniatura del dialogo, y que ésta se pudiese desplazar con el ratón para no molestar la consulta y poder interactuar libremente con los listboxs. En realidad lo que hago es guardar los datos de los resultados y cerrar el dialogo, aparentemente, minimizándolo de forma progresiva (en 20 pasos). Para volver a 'maximizarlo' vuelvo a crear el dialogo recuperando los datos guardados, y así no tener que esperar a un nuevo análisis, que tarda un poquito. En realidad, no hacía falta tanta parafernalia, pero lo quería así...

Esta es la pantalla inicial donde pueden ver el dialogo azul de resultados (parcialmente invisible, porque se puede desplazar con el ratón), sobre el window de presentación de los datos (verde claro). Ese era el problema, inicialmente el dialogo se crea centrado en la pantalla y se ve entero, pero como se puede desplazar, debía contemplar la posibilidad de que alguién lo minimizara cuando está parcialmente escondido, y al minimizarlo la parte no visible salía en negro en el bitmap obtenido con WndBitmap(). Ahora ya sale bien.

Image

En las dos siguientes pantallas se ve que el dialogo ya está 'minimizado', en diversoas posiciones, representado por una pantallita azul, que además del bitmap miniaturizado, que como ve, se puede desplazar con el ratón, tiene dos botones: "Restaurar" y "Cerrar".
Image
Image
Peaaaaaso de foro...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Bitmap Compatible

Postby cnavarro » Mon Mar 24, 2014 6:42 pm

Antolin
Me parece muy buen trabajo, y lo de la miniatura, genial
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 93 guests