In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Convertir un control a im
Convertir un control a im
Pues eso, existe alguna manera en xailer de convertir un control pintado por
mí en una imágen????
Un Saludo,
Joaquín
mí en una imágen????
Un Saludo,
Joaquín
Convertir un control a im
Joaquín,
> Pues eso, existe alguna manera en xailer de convertir un control pintado
> por
> mí en una imágen????
Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo, ¿no?
La forma más sencilla y correcta es usar el método WMPrintClient(). Defínelo
así:
METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
De esta forma no tienes que hacer dos rutinas distintas de pintado, sino que
tanto un mensaje como el otro comparten el mismo código. Después, para
imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con el
hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
WM_PRINTCLIENT, hDC ).
En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
algo así, como un método de la propia clase (ojo que lo he escrito al vuelo,
y no lo he probado):
XA_FUNC_STATIC( TMICLASE_GETBITMAP )
{
PHB_ITEM Self = hb_stackSelfItem();
HANDLE handle = GetHandleOf( Self );
int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
HDC hDC;
HBITMAP hBitmap, hOldBitmap;
hDC = CreateCompatibleDC( NULL );
hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
hOldBitmap = SelectObject( hDC, hBitmap );
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
SelectObject( hDC, hOldBitmap );
DeleteDC( hDC );
hb_retnl( (long) hBitmap );
}
Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
hacer lo que quieras con él.
--
Un saludo,
José F. Giménez
> Pues eso, existe alguna manera en xailer de convertir un control pintado
> por
> mí en una imágen????
Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo, ¿no?
La forma más sencilla y correcta es usar el método WMPrintClient(). Defínelo
así:
METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
De esta forma no tienes que hacer dos rutinas distintas de pintado, sino que
tanto un mensaje como el otro comparten el mismo código. Después, para
imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con el
hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
WM_PRINTCLIENT, hDC ).
En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
algo así, como un método de la propia clase (ojo que lo he escrito al vuelo,
y no lo he probado):
XA_FUNC_STATIC( TMICLASE_GETBITMAP )
{
PHB_ITEM Self = hb_stackSelfItem();
HANDLE handle = GetHandleOf( Self );
int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
HDC hDC;
HBITMAP hBitmap, hOldBitmap;
hDC = CreateCompatibleDC( NULL );
hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
hOldBitmap = SelectObject( hDC, hBitmap );
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
SelectObject( hDC, hOldBitmap );
DeleteDC( hDC );
hb_retnl( (long) hBitmap );
}
Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
hacer lo que quieras con él.
--
Un saludo,
José F. Giménez
Convertir un control a im
Muchas gracias Jose, lo pruebo y ya te cuento, pero
ya que tenéis una tan "IMPRESIONANTE" clase para manejo de cualquier tipo de
imágen, no podría convertirlo en cualquier tipo de imágen a elegir, para que
ocupe menos por ejemplo ????
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422c2895$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > Pues eso, existe alguna manera en xailer de convertir un control pintado
> > por
> > mí en una imágen????
>
> Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo,
¿no?
>
> La forma más sencilla y correcta es usar el método WMPrintClient().
Defínelo
> así:
>
> METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
>
> De esta forma no tienes que hacer dos rutinas distintas de pintado, sino
que
> tanto un mensaje como el otro comparten el mismo código. Después, para
> imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con el
> hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
> WM_PRINTCLIENT, hDC ).
>
> En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
> hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
> algo así, como un método de la propia clase (ojo que lo he escrito al
vuelo,
> y no lo he probado):
>
> XA_FUNC_STATIC( TMICLASE_GETBITMAP )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HANDLE handle = GetHandleOf( Self );
> int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
> int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
> HDC hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> hDC = CreateCompatibleDC( NULL );
> hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
> hOldBitmap = SelectObject( hDC, hBitmap );
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
>
> hb_retnl( (long) hBitmap );
> }
>
> Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
> hacer lo que quieras con él.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
ya que tenéis una tan "IMPRESIONANTE" clase para manejo de cualquier tipo de
imágen, no podría convertirlo en cualquier tipo de imágen a elegir, para que
ocupe menos por ejemplo ????
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422c2895$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > Pues eso, existe alguna manera en xailer de convertir un control pintado
> > por
> > mí en una imágen????
>
> Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo,
¿no?
>
> La forma más sencilla y correcta es usar el método WMPrintClient().
Defínelo
> así:
>
> METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
>
> De esta forma no tienes que hacer dos rutinas distintas de pintado, sino
que
> tanto un mensaje como el otro comparten el mismo código. Después, para
> imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con el
> hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
> WM_PRINTCLIENT, hDC ).
>
> En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
> hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
> algo así, como un método de la propia clase (ojo que lo he escrito al
vuelo,
> y no lo he probado):
>
> XA_FUNC_STATIC( TMICLASE_GETBITMAP )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HANDLE handle = GetHandleOf( Self );
> int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
> int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
> HDC hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> hDC = CreateCompatibleDC( NULL );
> hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
> hOldBitmap = SelectObject( hDC, hBitmap );
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
>
> hb_retnl( (long) hBitmap );
> }
>
> Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
> hacer lo que quieras con él.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Convertir un control a im
Joaquín,
> Muchas gracias Jose, lo pruebo y ya te cuento, pero
>
> ya que tenéis una tan "IMPRESIONANTE" clase para manejo de cualquier tipo
> de
> imágen, no podría convertirlo en cualquier tipo de imágen a elegir, para
> que
> ocupe menos por ejemplo ????
Pues no sé si se podrá. Intentaré revisarlo en cuanto pueda.
--
Un saludo,
José F. Giménez
> Muchas gracias Jose, lo pruebo y ya te cuento, pero
>
> ya que tenéis una tan "IMPRESIONANTE" clase para manejo de cualquier tipo
> de
> imágen, no podría convertirlo en cualquier tipo de imágen a elegir, para
> que
> ocupe menos por ejemplo ????
Pues no sé si se podrá. Intentaré revisarlo en cuanto pueda.
--
Un saludo,
José F. Giménez
Convertir un control a im
Jose,
gracias pero no funciona, he revisado todo el código, la ayuda del api, etc
y la función en C "XA_FUNC_STATIC( TMICONTROL_GETBITMAP )"
devuelve un número que parece un handle, lo copio al clipboard y luego al
paint y aunque mide lo mismo que el control, pinta todo en blanco,
he probado a hacer lo mismo con el handle de un bmp en disco y lo copia y
pega perfectamente al clipboard y de ahí al paint.
Tiene que haber un pequeño detallito que está impidiendo que se haga bien la
copia, también comentarte, que cuando tenga el handle puedo grabarlo a
disco?? he revisado la clase Tbitmap y no tiene un SaveFile( hBmp) o algo
parecido, si me puedieras decir donde buscar te lo agradecería.
Necesito concretamente salvar un control como una imágen, poder mandarlo al
clipboard y poder guardadrlo a disco. Se que no es fácil pero tampoco sé de
qué métodos y funciones dispongo en Xailer.
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422c2895$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > Pues eso, existe alguna manera en xailer de convertir un control pintado
> > por
> > mí en una imágen????
>
> Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo,
¿no?
>
> La forma más sencilla y correcta es usar el método WMPrintClient().
Defínelo
> así:
>
> METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
>
> De esta forma no tienes que hacer dos rutinas distintas de pintado, sino
que
> tanto un mensaje como el otro comparten el mismo código. Después, para
> imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con el
> hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
> WM_PRINTCLIENT, hDC ).
>
> En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
> hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
> algo así, como un método de la propia clase (ojo que lo he escrito al
vuelo,
> y no lo he probado):
>
> XA_FUNC_STATIC( TMICLASE_GETBITMAP )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HANDLE handle = GetHandleOf( Self );
> int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
> int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
> HDC hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> hDC = CreateCompatibleDC( NULL );
> hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
> hOldBitmap = SelectObject( hDC, hBitmap );
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
>
> hb_retnl( (long) hBitmap );
> }
>
> Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
> hacer lo que quieras con él.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
gracias pero no funciona, he revisado todo el código, la ayuda del api, etc
y la función en C "XA_FUNC_STATIC( TMICONTROL_GETBITMAP )"
devuelve un número que parece un handle, lo copio al clipboard y luego al
paint y aunque mide lo mismo que el control, pinta todo en blanco,
he probado a hacer lo mismo con el handle de un bmp en disco y lo copia y
pega perfectamente al clipboard y de ahí al paint.
Tiene que haber un pequeño detallito que está impidiendo que se haga bien la
copia, también comentarte, que cuando tenga el handle puedo grabarlo a
disco?? he revisado la clase Tbitmap y no tiene un SaveFile( hBmp) o algo
parecido, si me puedieras decir donde buscar te lo agradecería.
Necesito concretamente salvar un control como una imágen, poder mandarlo al
clipboard y poder guardadrlo a disco. Se que no es fácil pero tampoco sé de
qué métodos y funciones dispongo en Xailer.
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422c2895$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > Pues eso, existe alguna manera en xailer de convertir un control pintado
> > por
> > mí en una imágen????
>
> Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo,
¿no?
>
> La forma más sencilla y correcta es usar el método WMPrintClient().
Defínelo
> así:
>
> METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
>
> De esta forma no tienes que hacer dos rutinas distintas de pintado, sino
que
> tanto un mensaje como el otro comparten el mismo código. Después, para
> imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con el
> hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
> WM_PRINTCLIENT, hDC ).
>
> En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
> hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
> algo así, como un método de la propia clase (ojo que lo he escrito al
vuelo,
> y no lo he probado):
>
> XA_FUNC_STATIC( TMICLASE_GETBITMAP )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HANDLE handle = GetHandleOf( Self );
> int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
> int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
> HDC hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> hDC = CreateCompatibleDC( NULL );
> hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
> hOldBitmap = SelectObject( hDC, hBitmap );
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
>
> hb_retnl( (long) hBitmap );
> }
>
> Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
> hacer lo que quieras con él.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Convertir un control a im
Jose,
más pruebas, si pongo lo siguiente
MoveToEx( hDC, 0, 0, NULL );
LineTo( hDC, nAncho, nAlto );
después de
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
Me crea un bitmap con una línea de punta a punta, lo que significa que me
está creando el bitmap pero no funciona el pintar el control en él.
Y la 2ª prueba que he hecho es sutituir :
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
por:
SendMessage( handle , WM_PAINT, (WPARAM) hDC ,0)
Y pinta el control en el bitmap pero en blanco y negro y muy mala
resolución.
Si me pudieras hechar una manita te lo agradecería, porque ya me he repasado
medio libro de Charles Petzold y no doy más sí.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:422da6d5$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Jose,
> gracias pero no funciona, he revisado todo el código, la ayuda del api,
etc
> y la función en C "XA_FUNC_STATIC( TMICONTROL_GETBITMAP )"
> devuelve un número que parece un handle, lo copio al clipboard y luego al
> paint y aunque mide lo mismo que el control, pinta todo en blanco,
> he probado a hacer lo mismo con el handle de un bmp en disco y lo copia y
> pega perfectamente al clipboard y de ahí al paint.
>
>
> Tiene que haber un pequeño detallito que está impidiendo que se haga bien
la
> copia, también comentarte, que cuando tenga el handle puedo grabarlo a
> disco?? he revisado la clase Tbitmap y no tiene un SaveFile( hBmp) o algo
> parecido, si me puedieras decir donde buscar te lo agradecería.
>
> Necesito concretamente salvar un control como una imágen, poder mandarlo
al
> clipboard y poder guardadrlo a disco. Se que no es fácil pero tampoco sé
de
> qué métodos y funciones dispongo en Xailer.
>
> Un Saludo,
> Joaquín
>
>
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
> news:422c2895$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> > Joaquín,
> >
> > > Pues eso, existe alguna manera en xailer de convertir un control
pintado
> > > por
> > > mí en una imágen????
> >
> > Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo,
> ¿no?
> >
> > La forma más sencilla y correcta es usar el método WMPrintClient().
> Defínelo
> > así:
> >
> > METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
> >
> > De esta forma no tienes que hacer dos rutinas distintas de pintado, sino
> que
> > tanto un mensaje como el otro comparten el mismo código. Después, para
> > imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con
el
> > hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
> > WM_PRINTCLIENT, hDC ).
> >
> > En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
> > hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
> > algo así, como un método de la propia clase (ojo que lo he escrito al
> vuelo,
> > y no lo he probado):
> >
> > XA_FUNC_STATIC( TMICLASE_GETBITMAP )
> > {
> > PHB_ITEM Self = hb_stackSelfItem();
> > HANDLE handle = GetHandleOf( Self );
> > int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
> > int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
> > HDC hDC;
> > HBITMAP hBitmap, hOldBitmap;
> >
> > hDC = CreateCompatibleDC( NULL );
> > hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
> > hOldBitmap = SelectObject( hDC, hBitmap );
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > SelectObject( hDC, hOldBitmap );
> > DeleteDC( hDC );
> >
> > hb_retnl( (long) hBitmap );
> > }
> >
> > Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
> > hacer lo que quieras con él.
> >
> >
> > --
> > Un saludo,
> >
> > José F. Giménez
> >
> >
>
>
más pruebas, si pongo lo siguiente
MoveToEx( hDC, 0, 0, NULL );
LineTo( hDC, nAncho, nAlto );
después de
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
Me crea un bitmap con una línea de punta a punta, lo que significa que me
está creando el bitmap pero no funciona el pintar el control en él.
Y la 2ª prueba que he hecho es sutituir :
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
por:
SendMessage( handle , WM_PAINT, (WPARAM) hDC ,0)
Y pinta el control en el bitmap pero en blanco y negro y muy mala
resolución.
Si me pudieras hechar una manita te lo agradecería, porque ya me he repasado
medio libro de Charles Petzold y no doy más sí.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:422da6d5$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Jose,
> gracias pero no funciona, he revisado todo el código, la ayuda del api,
etc
> y la función en C "XA_FUNC_STATIC( TMICONTROL_GETBITMAP )"
> devuelve un número que parece un handle, lo copio al clipboard y luego al
> paint y aunque mide lo mismo que el control, pinta todo en blanco,
> he probado a hacer lo mismo con el handle de un bmp en disco y lo copia y
> pega perfectamente al clipboard y de ahí al paint.
>
>
> Tiene que haber un pequeño detallito que está impidiendo que se haga bien
la
> copia, también comentarte, que cuando tenga el handle puedo grabarlo a
> disco?? he revisado la clase Tbitmap y no tiene un SaveFile( hBmp) o algo
> parecido, si me puedieras decir donde buscar te lo agradecería.
>
> Necesito concretamente salvar un control como una imágen, poder mandarlo
al
> clipboard y poder guardadrlo a disco. Se que no es fácil pero tampoco sé
de
> qué métodos y funciones dispongo en Xailer.
>
> Un Saludo,
> Joaquín
>
>
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
> news:422c2895$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> > Joaquín,
> >
> > > Pues eso, existe alguna manera en xailer de convertir un control
pintado
> > > por
> > > mí en una imágen????
> >
> > Supongo que te refieres a guardarlo en un bitmap para p.ej. imprimirlo,
> ¿no?
> >
> > La forma más sencilla y correcta es usar el método WMPrintClient().
> Defínelo
> > así:
> >
> > METHOD WMPrintClient() EXTERN TMiClase_WMPaint()
> >
> > De esta forma no tienes que hacer dos rutinas distintas de pintado, sino
> que
> > tanto un mensaje como el otro comparten el mismo código. Después, para
> > imprimirlo, sólo tienes que llamar a oControl:WMPrintClient( hDC ), con
el
> > hDC de la impresora. O enviar un mensaje al control: oControl:SendMsg(
> > WM_PRINTCLIENT, hDC ).
> >
> > En el caso de que quieras guardarlo en un bitmap para grabarlo a disco o
> > hacer cualquier otra cosa, tendrás que crear un bitmap en memoria. Sería
> > algo así, como un método de la propia clase (ojo que lo he escrito al
> vuelo,
> > y no lo he probado):
> >
> > XA_FUNC_STATIC( TMICLASE_GETBITMAP )
> > {
> > PHB_ITEM Self = hb_stackSelfItem();
> > HANDLE handle = GetHandleOf( Self );
> > int nAncho = XA_ObjGetNL( Self, "nClientWidth" );
> > int nAlto = XA_ObjGetNL( Self, "nClientHeight" );
> > HDC hDC;
> > HBITMAP hBitmap, hOldBitmap;
> >
> > hDC = CreateCompatibleDC( NULL );
> > hBitmap = CreateCompatibleBitmap( hDC, nAncho, nAlto );
> > hOldBitmap = SelectObject( hDC, hBitmap );
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > SelectObject( hDC, hOldBitmap );
> > DeleteDC( hDC );
> >
> > hb_retnl( (long) hBitmap );
> > }
> >
> > Esto te devuelve el hBitmap, que después tendrás que grabarlo a disco o
> > hacer lo que quieras con él.
> >
> >
> > --
> > Un saludo,
> >
> > José F. Giménez
> >
> >
>
>
Convertir un control a im
Joaquín,
prueba con esta función:
XA_FUNC( GETBITMAP )
{
PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
HANDLE handle = GetHandleOf( oCtl );
int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
HDC hCtlDC, hDC;
HBITMAP hBitmap, hOldBitmap;
hCtlDC = GetDC( handle );
hDC = CreateCompatibleDC( hCtlDC );
hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
hOldBitmap = SelectObject( hDC, hBitmap );
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
SelectObject( hDC, hOldBitmap );
DeleteDC( hDC );
ReleaseDC( handle, hCtlDC );
hb_retnl( (long) hBitmap );
}
La tienes que llamar pasándole el control que quieres que te capture. P.ej:
hBitmap := GetBitmap( ::oMiControl )
--
Un saludo,
José F. Giménez
prueba con esta función:
XA_FUNC( GETBITMAP )
{
PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
HANDLE handle = GetHandleOf( oCtl );
int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
HDC hCtlDC, hDC;
HBITMAP hBitmap, hOldBitmap;
hCtlDC = GetDC( handle );
hDC = CreateCompatibleDC( hCtlDC );
hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
hOldBitmap = SelectObject( hDC, hBitmap );
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
SelectObject( hDC, hOldBitmap );
DeleteDC( hDC );
ReleaseDC( handle, hCtlDC );
hb_retnl( (long) hBitmap );
}
La tienes que llamar pasándole el control que quieres que te capture. P.ej:
hBitmap := GetBitmap( ::oMiControl )
--
Un saludo,
José F. Giménez
Convertir un control a im
Jose,
Al ejecutarla me dice el siguiente error:
Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
Mi control lo he heredado de Twincontrol, parece que esa propiedad está
protegida, ¿como accedo a ella?
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> prueba con esta función:
>
> XA_FUNC( GETBITMAP )
> {
> PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> HANDLE handle = GetHandleOf( oCtl );
> int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> HDC hCtlDC, hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> hCtlDC = GetDC( handle );
> hDC = CreateCompatibleDC( hCtlDC );
> hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> hOldBitmap = SelectObject( hDC, hBitmap );
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
> ReleaseDC( handle, hCtlDC );
>
> hb_retnl( (long) hBitmap );
> }
>
> La tienes que llamar pasándole el control que quieres que te capture.
P.ej:
> hBitmap := GetBitmap( ::oMiControl )
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Al ejecutarla me dice el siguiente error:
Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
Mi control lo he heredado de Twincontrol, parece que esa propiedad está
protegida, ¿como accedo a ella?
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> prueba con esta función:
>
> XA_FUNC( GETBITMAP )
> {
> PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> HANDLE handle = GetHandleOf( oCtl );
> int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> HDC hCtlDC, hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> hCtlDC = GetDC( handle );
> hDC = CreateCompatibleDC( hCtlDC );
> hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> hOldBitmap = SelectObject( hDC, hBitmap );
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
> ReleaseDC( handle, hCtlDC );
>
> hb_retnl( (long) hBitmap );
> }
>
> La tienes que llamar pasándole el control que quieres que te capture.
P.ej:
> hBitmap := GetBitmap( ::oMiControl )
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Convertir un control a im
Jose,
Con Getclientret en C he cogido los valores que estaban <PROTECTED> y hago
esto:
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
MoveToEx( hDC, 0, 0, NULL );
LineTo( hDC, nAncho, nAlto );
Y el bitmap que me genera contiene la línea en diagonal, pero no la "foto"
del control, me parece que lo único que falla es la línea
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
Yo he mirado el api y no le veo nada raro.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:[email=422e0b0a@ozsrv2.ozlan.local...]422e0b0a@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Al ejecutarla me dice el siguiente error:
>
> Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
>
>
> Mi control lo he heredado de Twincontrol, parece que esa propiedad está
> protegida, ¿como accedo a ella?
>
> Un Saludo,
> Joaquín
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
> news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> > Joaquín,
> >
> > prueba con esta función:
> >
> > XA_FUNC( GETBITMAP )
> > {
> > PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> > HANDLE handle = GetHandleOf( oCtl );
> > int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> > int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> > HDC hCtlDC, hDC;
> > HBITMAP hBitmap, hOldBitmap;
> >
> > hCtlDC = GetDC( handle );
> > hDC = CreateCompatibleDC( hCtlDC );
> > hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> > hOldBitmap = SelectObject( hDC, hBitmap );
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > SelectObject( hDC, hOldBitmap );
> > DeleteDC( hDC );
> > ReleaseDC( handle, hCtlDC );
> >
> > hb_retnl( (long) hBitmap );
> > }
> >
> > La tienes que llamar pasándole el control que quieres que te capture.
> P.ej:
> > hBitmap := GetBitmap( ::oMiControl )
> >
> > --
> > Un saludo,
> >
> > José F. Giménez
> >
> >
>
>
Con Getclientret en C he cogido los valores que estaban <PROTECTED> y hago
esto:
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
MoveToEx( hDC, 0, 0, NULL );
LineTo( hDC, nAncho, nAlto );
Y el bitmap que me genera contiene la línea en diagonal, pero no la "foto"
del control, me parece que lo único que falla es la línea
SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
Yo he mirado el api y no le veo nada raro.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:[email=422e0b0a@ozsrv2.ozlan.local...]422e0b0a@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Al ejecutarla me dice el siguiente error:
>
> Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
>
>
> Mi control lo he heredado de Twincontrol, parece que esa propiedad está
> protegida, ¿como accedo a ella?
>
> Un Saludo,
> Joaquín
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
> news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> > Joaquín,
> >
> > prueba con esta función:
> >
> > XA_FUNC( GETBITMAP )
> > {
> > PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> > HANDLE handle = GetHandleOf( oCtl );
> > int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> > int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> > HDC hCtlDC, hDC;
> > HBITMAP hBitmap, hOldBitmap;
> >
> > hCtlDC = GetDC( handle );
> > hDC = CreateCompatibleDC( hCtlDC );
> > hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> > hOldBitmap = SelectObject( hDC, hBitmap );
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > SelectObject( hDC, hOldBitmap );
> > DeleteDC( hDC );
> > ReleaseDC( handle, hCtlDC );
> >
> > hb_retnl( (long) hBitmap );
> > }
> >
> > La tienes que llamar pasándole el control que quieres que te capture.
> P.ej:
> > hBitmap := GetBitmap( ::oMiControl )
> >
> > --
> > Un saludo,
> >
> > José F. Giménez
> >
> >
>
>
Convertir un control a im
Jose,
Así he conseguido que funcione:
XA_FUNC( GETBITMAP )
{
PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
HANDLE handle = GetHandleOf( oCtl );
int nAncho ; //= XA_ObjGetNL( oCtl, "nClientWidth" ); esto da error
Protected
int nAlto ; //= XA_ObjGetNL( oCtl, "nClientHeight" ); esto da error
Protected
HDC hCtlDC, hDC;
HBITMAP hBitmap, hOldBitmap;
//------- para calcular las dimensiones del control
RECT rct;
GetWindowRect( handle , &rct );
nAncho = rct.right - rct.left;
nAlto = rct.bottom - rct.top;
//---------------------------------------------------------- --
//hCtlDC = GetDC( handle );
hCtlDC = GetWindowDC( handle );
hDC = CreateCompatibleDC( hCtlDC );
hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
hOldBitmap = ( HBITMAP ) SelectObject( hDC, hBitmap );
BitBlt( hDC, 0, 0, nAncho , nAlto , hCtlDC , 0, 0, SRCCOPY );
//SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
MoveToEx( hDC, 0, 0, NULL );
LineTo( hDC, nAncho, nAlto );
SelectObject( hDC, hOldBitmap );
DeleteDC( hDC );
ReleaseDC( handle, hCtlDC );
hb_retnl( (long) hBitmap );
}
El único problema es que por la derecha y bottom del dibujo también ha
capturado la imagen de la ventana, es decir si el control a vista mide 50 de
ancho el coge la imagen de 60 pixels más o menos y lo mismo en el Bottom.
Me faltaría saber como capturar la imágen del control con sus dimensiones
exactas, sin que se exceda.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:422e0fa3$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Con Getclientret en C he cogido los valores que estaban <PROTECTED> y hago
> esto:
>
>
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
>
> MoveToEx( hDC, 0, 0, NULL );
> LineTo( hDC, nAncho, nAlto );
>
> Y el bitmap que me genera contiene la línea en diagonal, pero no la "foto"
> del control, me parece que lo único que falla es la línea
>
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
>
> Yo he mirado el api y no le veo nada raro.
>
> Un Saludo,
> Joaquín
>
>
> "Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
> news:[email=422e0b0a@ozsrv2.ozlan.local...]422e0b0a@ozsrv2.ozlan.local...[/email]
> > Jose,
> >
> > Al ejecutarla me dice el siguiente error:
> >
> > Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
> >
> >
> > Mi control lo he heredado de Twincontrol, parece que esa propiedad está
> > protegida, ¿como accedo a ella?
> >
> > Un Saludo,
> > Joaquín
> >
> > "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
mensaje
> > news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> > > Joaquín,
> > >
> > > prueba con esta función:
> > >
> > > XA_FUNC( GETBITMAP )
> > > {
> > > PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> > > HANDLE handle = GetHandleOf( oCtl );
> > > int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> > > int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> > > HDC hCtlDC, hDC;
> > > HBITMAP hBitmap, hOldBitmap;
> > >
> > > hCtlDC = GetDC( handle );
> > > hDC = CreateCompatibleDC( hCtlDC );
> > > hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> > > hOldBitmap = SelectObject( hDC, hBitmap );
> > > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > > SelectObject( hDC, hOldBitmap );
> > > DeleteDC( hDC );
> > > ReleaseDC( handle, hCtlDC );
> > >
> > > hb_retnl( (long) hBitmap );
> > > }
> > >
> > > La tienes que llamar pasándole el control que quieres que te capture.
> > P.ej:
> > > hBitmap := GetBitmap( ::oMiControl )
> > >
> > > --
> > > Un saludo,
> > >
> > > José F. Giménez
> > >
> > >
> >
> >
>
>
Así he conseguido que funcione:
XA_FUNC( GETBITMAP )
{
PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
HANDLE handle = GetHandleOf( oCtl );
int nAncho ; //= XA_ObjGetNL( oCtl, "nClientWidth" ); esto da error
Protected
int nAlto ; //= XA_ObjGetNL( oCtl, "nClientHeight" ); esto da error
Protected
HDC hCtlDC, hDC;
HBITMAP hBitmap, hOldBitmap;
//------- para calcular las dimensiones del control
RECT rct;
GetWindowRect( handle , &rct );
nAncho = rct.right - rct.left;
nAlto = rct.bottom - rct.top;
//---------------------------------------------------------- --
//hCtlDC = GetDC( handle );
hCtlDC = GetWindowDC( handle );
hDC = CreateCompatibleDC( hCtlDC );
hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
hOldBitmap = ( HBITMAP ) SelectObject( hDC, hBitmap );
BitBlt( hDC, 0, 0, nAncho , nAlto , hCtlDC , 0, 0, SRCCOPY );
//SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
MoveToEx( hDC, 0, 0, NULL );
LineTo( hDC, nAncho, nAlto );
SelectObject( hDC, hOldBitmap );
DeleteDC( hDC );
ReleaseDC( handle, hCtlDC );
hb_retnl( (long) hBitmap );
}
El único problema es que por la derecha y bottom del dibujo también ha
capturado la imagen de la ventana, es decir si el control a vista mide 50 de
ancho el coge la imagen de 60 pixels más o menos y lo mismo en el Bottom.
Me faltaría saber como capturar la imágen del control con sus dimensiones
exactas, sin que se exceda.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:422e0fa3$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Con Getclientret en C he cogido los valores que estaban <PROTECTED> y hago
> esto:
>
>
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
>
> MoveToEx( hDC, 0, 0, NULL );
> LineTo( hDC, nAncho, nAlto );
>
> Y el bitmap que me genera contiene la línea en diagonal, pero no la "foto"
> del control, me parece que lo único que falla es la línea
>
> SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
>
> Yo he mirado el api y no le veo nada raro.
>
> Un Saludo,
> Joaquín
>
>
> "Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
> news:[email=422e0b0a@ozsrv2.ozlan.local...]422e0b0a@ozsrv2.ozlan.local...[/email]
> > Jose,
> >
> > Al ejecutarla me dice el siguiente error:
> >
> > Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
> >
> >
> > Mi control lo he heredado de Twincontrol, parece que esa propiedad está
> > protegida, ¿como accedo a ella?
> >
> > Un Saludo,
> > Joaquín
> >
> > "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
mensaje
> > news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> > > Joaquín,
> > >
> > > prueba con esta función:
> > >
> > > XA_FUNC( GETBITMAP )
> > > {
> > > PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> > > HANDLE handle = GetHandleOf( oCtl );
> > > int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> > > int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> > > HDC hCtlDC, hDC;
> > > HBITMAP hBitmap, hOldBitmap;
> > >
> > > hCtlDC = GetDC( handle );
> > > hDC = CreateCompatibleDC( hCtlDC );
> > > hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> > > hOldBitmap = SelectObject( hDC, hBitmap );
> > > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > > SelectObject( hDC, hOldBitmap );
> > > DeleteDC( hDC );
> > > ReleaseDC( handle, hCtlDC );
> > >
> > > hb_retnl( (long) hBitmap );
> > > }
> > >
> > > La tienes que llamar pasándole el control que quieres que te capture.
> > P.ej:
> > > hBitmap := GetBitmap( ::oMiControl )
> > >
> > > --
> > > Un saludo,
> > >
> > > José F. Giménez
> > >
> > >
> >
> >
>
>
Convertir un control a im
Jose,
En la función modificada que te dejo, sí hacía bien lo de las coordenadas,
lo que pasa es que el control tenía asignado nAnchors akALL y entonces se
metía en el borde de la ventana, así que la función anterior rectificada
funciona perfectamente, quitalé que pinte la diagonal y va perfecta, si
quieres y ves que te gusta el resultado, podrías incluirla en xailer.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:[email=422e17d7@ozsrv2.ozlan.local...]422e17d7@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Así he conseguido que funcione:
>
>
> XA_FUNC( GETBITMAP )
> {
> PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> HANDLE handle = GetHandleOf( oCtl );
> int nAncho ; //= XA_ObjGetNL( oCtl, "nClientWidth" ); esto da error
> Protected
>
> int nAlto ; //= XA_ObjGetNL( oCtl, "nClientHeight" ); esto da error
> Protected
>
> HDC hCtlDC, hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> //------- para calcular las dimensiones del control
> RECT rct;
>
> GetWindowRect( handle , &rct );
> nAncho = rct.right - rct.left;
> nAlto = rct.bottom - rct.top;
> //---------------------------------------------------------- --
>
>
> //hCtlDC = GetDC( handle );
>
> hCtlDC = GetWindowDC( handle );
> hDC = CreateCompatibleDC( hCtlDC );
> hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> hOldBitmap = ( HBITMAP ) SelectObject( hDC, hBitmap );
>
> BitBlt( hDC, 0, 0, nAncho , nAlto , hCtlDC , 0, 0, SRCCOPY );
>
> //SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
>
> MoveToEx( hDC, 0, 0, NULL );
> LineTo( hDC, nAncho, nAlto );
>
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
> ReleaseDC( handle, hCtlDC );
>
> hb_retnl( (long) hBitmap );
> }
>
>
> El único problema es que por la derecha y bottom del dibujo también ha
> capturado la imagen de la ventana, es decir si el control a vista mide 50
de
> ancho el coge la imagen de 60 pixels más o menos y lo mismo en el Bottom.
>
> Me faltaría saber como capturar la imágen del control con sus dimensiones
> exactas, sin que se exceda.
>
> Un Saludo,
> Joaquín
>
>
>
>
>
>
> "Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
> news:422e0fa3$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> > Jose,
> >
> > Con Getclientret en C he cogido los valores que estaban <PROTECTED> y
hago
> > esto:
> >
> >
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> >
> > MoveToEx( hDC, 0, 0, NULL );
> > LineTo( hDC, nAncho, nAlto );
> >
> > Y el bitmap que me genera contiene la línea en diagonal, pero no la
"foto"
> > del control, me parece que lo único que falla es la línea
> >
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> >
> > Yo he mirado el api y no le veo nada raro.
> >
> > Un Saludo,
> > Joaquín
> >
> >
> > "Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
> > news:[email=422e0b0a@ozsrv2.ozlan.local...]422e0b0a@ozsrv2.ozlan.local...[/email]
> > > Jose,
> > >
> > > Al ejecutarla me dice el siguiente error:
> > >
> > > Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
> > >
> > >
> > > Mi control lo he heredado de Twincontrol, parece que esa propiedad
está
> > > protegida, ¿como accedo a ella?
> > >
> > > Un Saludo,
> > > Joaquín
> > >
> > > "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
> mensaje
> > > news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> > > > Joaquín,
> > > >
> > > > prueba con esta función:
> > > >
> > > > XA_FUNC( GETBITMAP )
> > > > {
> > > > PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> > > > HANDLE handle = GetHandleOf( oCtl );
> > > > int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> > > > int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> > > > HDC hCtlDC, hDC;
> > > > HBITMAP hBitmap, hOldBitmap;
> > > >
> > > > hCtlDC = GetDC( handle );
> > > > hDC = CreateCompatibleDC( hCtlDC );
> > > > hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> > > > hOldBitmap = SelectObject( hDC, hBitmap );
> > > > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > > > SelectObject( hDC, hOldBitmap );
> > > > DeleteDC( hDC );
> > > > ReleaseDC( handle, hCtlDC );
> > > >
> > > > hb_retnl( (long) hBitmap );
> > > > }
> > > >
> > > > La tienes que llamar pasándole el control que quieres que te
capture.
> > > P.ej:
> > > > hBitmap := GetBitmap( ::oMiControl )
> > > >
> > > > --
> > > > Un saludo,
> > > >
> > > > José F. Giménez
> > > >
> > > >
> > >
> > >
> >
> >
>
>
En la función modificada que te dejo, sí hacía bien lo de las coordenadas,
lo que pasa es que el control tenía asignado nAnchors akALL y entonces se
metía en el borde de la ventana, así que la función anterior rectificada
funciona perfectamente, quitalé que pinte la diagonal y va perfecta, si
quieres y ves que te gusta el resultado, podrías incluirla en xailer.
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:[email=422e17d7@ozsrv2.ozlan.local...]422e17d7@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Así he conseguido que funcione:
>
>
> XA_FUNC( GETBITMAP )
> {
> PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> HANDLE handle = GetHandleOf( oCtl );
> int nAncho ; //= XA_ObjGetNL( oCtl, "nClientWidth" ); esto da error
> Protected
>
> int nAlto ; //= XA_ObjGetNL( oCtl, "nClientHeight" ); esto da error
> Protected
>
> HDC hCtlDC, hDC;
> HBITMAP hBitmap, hOldBitmap;
>
> //------- para calcular las dimensiones del control
> RECT rct;
>
> GetWindowRect( handle , &rct );
> nAncho = rct.right - rct.left;
> nAlto = rct.bottom - rct.top;
> //---------------------------------------------------------- --
>
>
> //hCtlDC = GetDC( handle );
>
> hCtlDC = GetWindowDC( handle );
> hDC = CreateCompatibleDC( hCtlDC );
> hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> hOldBitmap = ( HBITMAP ) SelectObject( hDC, hBitmap );
>
> BitBlt( hDC, 0, 0, nAncho , nAlto , hCtlDC , 0, 0, SRCCOPY );
>
> //SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
>
> MoveToEx( hDC, 0, 0, NULL );
> LineTo( hDC, nAncho, nAlto );
>
> SelectObject( hDC, hOldBitmap );
> DeleteDC( hDC );
> ReleaseDC( handle, hCtlDC );
>
> hb_retnl( (long) hBitmap );
> }
>
>
> El único problema es que por la derecha y bottom del dibujo también ha
> capturado la imagen de la ventana, es decir si el control a vista mide 50
de
> ancho el coge la imagen de 60 pixels más o menos y lo mismo en el Bottom.
>
> Me faltaría saber como capturar la imágen del control con sus dimensiones
> exactas, sin que se exceda.
>
> Un Saludo,
> Joaquín
>
>
>
>
>
>
> "Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
> news:422e0fa3$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> > Jose,
> >
> > Con Getclientret en C he cogido los valores que estaban <PROTECTED> y
hago
> > esto:
> >
> >
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> >
> > MoveToEx( hDC, 0, 0, NULL );
> > LineTo( hDC, nAncho, nAlto );
> >
> > Y el bitmap que me genera contiene la línea en diagonal, pero no la
"foto"
> > del control, me parece que lo único que falla es la línea
> >
> > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> >
> > Yo he mirado el api y no le veo nada raro.
> >
> > Un Saludo,
> > Joaquín
> >
> >
> > "Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
> > news:[email=422e0b0a@ozsrv2.ozlan.local...]422e0b0a@ozsrv2.ozlan.local...[/email]
> > > Jose,
> > >
> > > Al ejecutarla me dice el siguiente error:
> > >
> > > Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
> > >
> > >
> > > Mi control lo he heredado de Twincontrol, parece que esa propiedad
está
> > > protegida, ¿como accedo a ella?
> > >
> > > Un Saludo,
> > > Joaquín
> > >
> > > "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
> mensaje
> > > news:[email=422df263@ozsrv2.ozlan.local...]422df263@ozsrv2.ozlan.local...[/email]
> > > > Joaquín,
> > > >
> > > > prueba con esta función:
> > > >
> > > > XA_FUNC( GETBITMAP )
> > > > {
> > > > PHB_ITEM oCtl = hb_param( 1, HB_IT_OBJECT );
> > > > HANDLE handle = GetHandleOf( oCtl );
> > > > int nAncho = XA_ObjGetNL( oCtl, "nClientWidth" );
> > > > int nAlto = XA_ObjGetNL( oCtl, "nClientHeight" );
> > > > HDC hCtlDC, hDC;
> > > > HBITMAP hBitmap, hOldBitmap;
> > > >
> > > > hCtlDC = GetDC( handle );
> > > > hDC = CreateCompatibleDC( hCtlDC );
> > > > hBitmap = CreateCompatibleBitmap( hCtlDC, nAncho, nAlto );
> > > > hOldBitmap = SelectObject( hDC, hBitmap );
> > > > SendMessage( handle, WM_PRINTCLIENT, (WPARAM) hDC, 0 );
> > > > SelectObject( hDC, hOldBitmap );
> > > > DeleteDC( hDC );
> > > > ReleaseDC( handle, hCtlDC );
> > > >
> > > > hb_retnl( (long) hBitmap );
> > > > }
> > > >
> > > > La tienes que llamar pasándole el control que quieres que te
capture.
> > > P.ej:
> > > > hBitmap := GetBitmap( ::oMiControl )
> > > >
> > > > --
> > > > Un saludo,
> > > >
> > > > José F. Giménez
> > > >
> > > >
> > >
> > >
> >
> >
>
>
Convertir un control a im
Joaquín,
> Al ejecutarla me dice el siguiente error:
>
> Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
>
>
> Mi control lo he heredado de Twincontrol, parece que esa propiedad está
> protegida, ¿como accedo a ella?
Tienes razón, perdona. Yo había hecho pruebas con un control derivado de
TScrollingWinControl, que sí tiene esas propiedades publicadas.
De todos modos, aquí tienes la clase TControl con esas propiedades públicas;
y como las demás heredan de ésta, vale para cualquier control.
--
Un saludo,
José F. Giménez
Attached files control.zip (10.4 KB)Â
> Al ejecutarla me dice el siguiente error:
>
> Error BASE/1004 Scope Violation <PROTECTED>: NCLIENTWIDTH
>
>
> Mi control lo he heredado de Twincontrol, parece que esa propiedad está
> protegida, ¿como accedo a ella?
Tienes razón, perdona. Yo había hecho pruebas con un control derivado de
TScrollingWinControl, que sí tiene esas propiedades publicadas.
De todos modos, aquí tienes la clase TControl con esas propiedades públicas;
y como las demás heredan de ésta, vale para cualquier control.
--
Un saludo,
José F. Giménez
Attached files control.zip (10.4 KB)Â
Convertir un control a im
Joaquín,
> En la función modificada que te dejo, sí hacía bien lo de las coordenadas,
> lo que pasa es que el control tenía asignado nAnchors akALL y entonces se
> metía en el borde de la ventana, así que la función anterior rectificada
> funciona perfectamente, quitalé que pinte la diagonal y va perfecta, si
> quieres y ves que te gusta el resultado, podrías incluirla en xailer.
Muchas gracias. Pero la he probado y le veo un problema: estás obteniendo un
hdc del control y copiando su imagen al bitmap. Pero si este control está
tapado por otro, lo que obtienes es exactamente lo que estás viendo en
pantalla, y no la imagen que pinta el control. En cambio, con la función que
yo te pasé, sí captura correctamente la imagen del control.
Prueba de nuevo la función que te envié, junto con la clase TControl que te
he enviado hace un momento. Verás que funciona bien. Es más, si quieres
puedes cambiar la llamada a WM_PRINTCLIENT por WM_PAINT, aunque si lo haces,
algunos controles no saldrán bien, a pesar de que el control que tú estás
haciendo sí funcionaría.
--
Un saludo,
José F. Giménez
> En la función modificada que te dejo, sí hacía bien lo de las coordenadas,
> lo que pasa es que el control tenía asignado nAnchors akALL y entonces se
> metía en el borde de la ventana, así que la función anterior rectificada
> funciona perfectamente, quitalé que pinte la diagonal y va perfecta, si
> quieres y ves que te gusta el resultado, podrías incluirla en xailer.
Muchas gracias. Pero la he probado y le veo un problema: estás obteniendo un
hdc del control y copiando su imagen al bitmap. Pero si este control está
tapado por otro, lo que obtienes es exactamente lo que estás viendo en
pantalla, y no la imagen que pinta el control. En cambio, con la función que
yo te pasé, sí captura correctamente la imagen del control.
Prueba de nuevo la función que te envié, junto con la clase TControl que te
he enviado hace un momento. Verás que funciona bien. Es más, si quieres
puedes cambiar la llamada a WM_PRINTCLIENT por WM_PAINT, aunque si lo haces,
algunos controles no saldrán bien, a pesar de que el control que tú estás
haciendo sí funcionaría.
--
Un saludo,
José F. Giménez
Convertir un control a im
Jose,
Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es como
si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
¿Puedes probar este pequeño ejemplo?
Local oClp, hBmp
hBmp := GetBitmap( oTuControl )
WITH OBJECT oClp := TClipboard():New( )
:Open()
:Empty()
:SetData( CF_BITMAP , hBmp)
:Close()
END
DeleteObject(hBmp) // Libera los recursos ¡MUY IMPORTANTE!
La ejecutas, luego vas al paint y le das pegar, debes de ver la imágen, a mi
me sale un rectángulo blanco con las dimensiones de la imagen, pero de
imágen nada.
Con la función que te envié si lo hace, usando BitBlt
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=422ebbdf@ozsrv2.ozlan.local...]422ebbdf@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > En la función modificada que te dejo, sí hacía bien lo de las
coordenadas,
> > lo que pasa es que el control tenía asignado nAnchors akALL y entonces
se
> > metía en el borde de la ventana, así que la función anterior rectificada
> > funciona perfectamente, quitalé que pinte la diagonal y va perfecta, si
> > quieres y ves que te gusta el resultado, podrías incluirla en xailer.
>
> Muchas gracias. Pero la he probado y le veo un problema: estás obteniendo
un
> hdc del control y copiando su imagen al bitmap. Pero si este control está
> tapado por otro, lo que obtienes es exactamente lo que estás viendo en
> pantalla, y no la imagen que pinta el control. En cambio, con la función
que
> yo te pasé, sí captura correctamente la imagen del control.
>
> Prueba de nuevo la función que te envié, junto con la clase TControl que
te
> he enviado hace un momento. Verás que funciona bien. Es más, si quieres
> puedes cambiar la llamada a WM_PRINTCLIENT por WM_PAINT, aunque si lo
haces,
> algunos controles no saldrán bien, a pesar de que el control que tú estás
> haciendo sí funcionaría.
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es como
si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
¿Puedes probar este pequeño ejemplo?
Local oClp, hBmp
hBmp := GetBitmap( oTuControl )
WITH OBJECT oClp := TClipboard():New( )
:Open()
:Empty()
:SetData( CF_BITMAP , hBmp)
:Close()
END
DeleteObject(hBmp) // Libera los recursos ¡MUY IMPORTANTE!
La ejecutas, luego vas al paint y le das pegar, debes de ver la imágen, a mi
me sale un rectángulo blanco con las dimensiones de la imagen, pero de
imágen nada.
Con la función que te envié si lo hace, usando BitBlt
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=422ebbdf@ozsrv2.ozlan.local...]422ebbdf@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > En la función modificada que te dejo, sí hacía bien lo de las
coordenadas,
> > lo que pasa es que el control tenía asignado nAnchors akALL y entonces
se
> > metía en el borde de la ventana, así que la función anterior rectificada
> > funciona perfectamente, quitalé que pinte la diagonal y va perfecta, si
> > quieres y ves que te gusta el resultado, podrías incluirla en xailer.
>
> Muchas gracias. Pero la he probado y le veo un problema: estás obteniendo
un
> hdc del control y copiando su imagen al bitmap. Pero si este control está
> tapado por otro, lo que obtienes es exactamente lo que estás viendo en
> pantalla, y no la imagen que pinta el control. En cambio, con la función
que
> yo te pasé, sí captura correctamente la imagen del control.
>
> Prueba de nuevo la función que te envié, junto con la clase TControl que
te
> he enviado hace un momento. Verás que funciona bien. Es más, si quieres
> puedes cambiar la llamada a WM_PRINTCLIENT por WM_PAINT, aunque si lo
haces,
> algunos controles no saldrán bien, a pesar de que el control que tú estás
> haciendo sí funcionaría.
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Convertir un control a im
Jose,
De la única manera que me funciona, es usando tu función cambiando la línea
SENDMESSAGE por esta:
BitBlt( hDC, 0, 0, nAncho, nAlto, hCtlDC, 0, 0, SRCCOPY );
y funciona perfectamente, dime si hay alguna pega o hay alguna manera de que
funcione el SendMessage
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:[email=422ed56f@ozsrv2.ozlan.local...]422ed56f@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es
como
> si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
> ¿Puedes probar este pequeño ejemplo?
>
> Local oClp, hBmp
>
> hBmp := GetBitmap( oTuControl )
>
> WITH OBJECT oClp := TClipboard():New( )
> :Open()
> :Empty()
> :SetData( CF_BITMAP , hBmp)
> :Close()
> END
> DeleteObject(hBmp) // Libera los recursos ¡MUY IMPORTANTE!
>
>
> La ejecutas, luego vas al paint y le das pegar, debes de ver la imágen, a
mi
> me sale un rectángulo blanco con las dimensiones de la imagen, pero de
> imágen nada.
>
> Con la función que te envié si lo hace, usando BitBlt
>
>
> Un Saludo,
> Joaquín
>
>
>
>
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
> news:[email=422ebbdf@ozsrv2.ozlan.local...]422ebbdf@ozsrv2.ozlan.local...[/email]
> > Joaquín,
> >
> > > En la función modificada que te dejo, sí hacía bien lo de las
> coordenadas,
> > > lo que pasa es que el control tenía asignado nAnchors akALL y entonces
> se
> > > metía en el borde de la ventana, así que la función anterior
rectificada
> > > funciona perfectamente, quitalé que pinte la diagonal y va perfecta,
si
> > > quieres y ves que te gusta el resultado, podrías incluirla en xailer.
> >
> > Muchas gracias. Pero la he probado y le veo un problema: estás
obteniendo
> un
> > hdc del control y copiando su imagen al bitmap. Pero si este control
está
> > tapado por otro, lo que obtienes es exactamente lo que estás viendo en
> > pantalla, y no la imagen que pinta el control. En cambio, con la función
> que
> > yo te pasé, sí captura correctamente la imagen del control.
> >
> > Prueba de nuevo la función que te envié, junto con la clase TControl que
> te
> > he enviado hace un momento. Verás que funciona bien. Es más, si quieres
> > puedes cambiar la llamada a WM_PRINTCLIENT por WM_PAINT, aunque si lo
> haces,
> > algunos controles no saldrán bien, a pesar de que el control que tú
estás
> > haciendo sí funcionaría.
> >
> > --
> > Un saludo,
> >
> > José F. Giménez
> >
> >
>
>
De la única manera que me funciona, es usando tu función cambiando la línea
SENDMESSAGE por esta:
BitBlt( hDC, 0, 0, nAncho, nAlto, hCtlDC, 0, 0, SRCCOPY );
y funciona perfectamente, dime si hay alguna pega o hay alguna manera de que
funcione el SendMessage
Un Saludo,
Joaquín
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:[email=422ed56f@ozsrv2.ozlan.local...]422ed56f@ozsrv2.ozlan.local...[/email]
> Jose,
>
> Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es
como
> si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
> ¿Puedes probar este pequeño ejemplo?
>
> Local oClp, hBmp
>
> hBmp := GetBitmap( oTuControl )
>
> WITH OBJECT oClp := TClipboard():New( )
> :Open()
> :Empty()
> :SetData( CF_BITMAP , hBmp)
> :Close()
> END
> DeleteObject(hBmp) // Libera los recursos ¡MUY IMPORTANTE!
>
>
> La ejecutas, luego vas al paint y le das pegar, debes de ver la imágen, a
mi
> me sale un rectángulo blanco con las dimensiones de la imagen, pero de
> imágen nada.
>
> Con la función que te envié si lo hace, usando BitBlt
>
>
> Un Saludo,
> Joaquín
>
>
>
>
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
> news:[email=422ebbdf@ozsrv2.ozlan.local...]422ebbdf@ozsrv2.ozlan.local...[/email]
> > Joaquín,
> >
> > > En la función modificada que te dejo, sí hacía bien lo de las
> coordenadas,
> > > lo que pasa es que el control tenía asignado nAnchors akALL y entonces
> se
> > > metía en el borde de la ventana, así que la función anterior
rectificada
> > > funciona perfectamente, quitalé que pinte la diagonal y va perfecta,
si
> > > quieres y ves que te gusta el resultado, podrías incluirla en xailer.
> >
> > Muchas gracias. Pero la he probado y le veo un problema: estás
obteniendo
> un
> > hdc del control y copiando su imagen al bitmap. Pero si este control
está
> > tapado por otro, lo que obtienes es exactamente lo que estás viendo en
> > pantalla, y no la imagen que pinta el control. En cambio, con la función
> que
> > yo te pasé, sí captura correctamente la imagen del control.
> >
> > Prueba de nuevo la función que te envié, junto con la clase TControl que
> te
> > he enviado hace un momento. Verás que funciona bien. Es más, si quieres
> > puedes cambiar la llamada a WM_PRINTCLIENT por WM_PAINT, aunque si lo
> haces,
> > algunos controles no saldrán bien, a pesar de que el control que tú
estás
> > haciendo sí funcionaría.
> >
> > --
> > Un saludo,
> >
> > José F. Giménez
> >
> >
>
>
Convertir un control a im
Joaquín,
> Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es
> como
> si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
> ¿Puedes probar este pequeño ejemplo?
Lo he probado y me funciona perfectamente. Acabo de caer en un pequeño
detalle... el control que estás diseñando, ¿es un sólo control con todo su
pintado? o por contra, ¿estás usando otros controles dentro de él?
Si es el primero caso te tiene que funcionar, pero si se trata del segundo
es lógico que no te funcione. En cambio, tu rutina está cogiendo
directamente la imagen de la pantalla, y si hay controles encima pues
también salen, ya que te está cogiendo exactamente lo que estás viendo.
En cualquier caso, yo te aconsejo usar un sólo control, y realizar todo el
pintado dentro de él. Deja lo de montar unos controles dentro de otros
solamente para los contenedores, que ya cumplen su función correctamente.
Vamos, a no ser que esté equivocado y estés haciendo algo distinto de lo que
yo creo.
--
Un saludo,
José F. Giménez
> Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es
> como
> si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
> ¿Puedes probar este pequeño ejemplo?
Lo he probado y me funciona perfectamente. Acabo de caer en un pequeño
detalle... el control que estás diseñando, ¿es un sólo control con todo su
pintado? o por contra, ¿estás usando otros controles dentro de él?
Si es el primero caso te tiene que funcionar, pero si se trata del segundo
es lógico que no te funcione. En cambio, tu rutina está cogiendo
directamente la imagen de la pantalla, y si hay controles encima pues
también salen, ya que te está cogiendo exactamente lo que estás viendo.
En cualquier caso, yo te aconsejo usar un sólo control, y realizar todo el
pintado dentro de él. Deja lo de montar unos controles dentro de otros
solamente para los contenedores, que ya cumplen su función correctamente.
Vamos, a no ser que esté equivocado y estés haciendo algo distinto de lo que
yo creo.
--
Un saludo,
José F. Giménez
Convertir un control a im
Jose,
El Control no tiene otros controles, derivo de TWinControl, le pongo el
nClrPane = clWhite y en el Paint() dibujo a pelo líneas y rectángulos.
Y ya está, no es nada extraño ni controles sobre controles, es más si en
GetBitmap en C después del SendMessage pongo que me pinte una diagonal, sí
sale la linea pintada, pero nada de lo que haya pintado en el
(TMICONTROL_WMPAINT) en C que me explicaste en Madrid para usar el doble
buffer, sale en el bitmap.
Si tienes un ejemplo de que eso te funciona, te agradecería que lo publiques
y me lo envies a mi e-mail si quieres, porque a mí no me hace nada, o en el
WMPAINT hace falta poner algo que no se ha puesto y ese es el kit de la
cuestión.
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422ef2ce$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es
> > como
> > si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
> > ¿Puedes probar este pequeño ejemplo?
>
> Lo he probado y me funciona perfectamente. Acabo de caer en un pequeño
> detalle... el control que estás diseñando, ¿es un sólo control con todo su
> pintado? o por contra, ¿estás usando otros controles dentro de él?
>
> Si es el primero caso te tiene que funcionar, pero si se trata del segundo
> es lógico que no te funcione. En cambio, tu rutina está cogiendo
> directamente la imagen de la pantalla, y si hay controles encima pues
> también salen, ya que te está cogiendo exactamente lo que estás viendo.
>
> En cualquier caso, yo te aconsejo usar un sólo control, y realizar todo el
> pintado dentro de él. Deja lo de montar unos controles dentro de otros
> solamente para los contenedores, que ya cumplen su función correctamente.
> Vamos, a no ser que esté equivocado y estés haciendo algo distinto de lo
que
> yo creo.
>
> --
> Un saludo,
>
> José F. Giménez
>
>
El Control no tiene otros controles, derivo de TWinControl, le pongo el
nClrPane = clWhite y en el Paint() dibujo a pelo líneas y rectángulos.
Y ya está, no es nada extraño ni controles sobre controles, es más si en
GetBitmap en C después del SendMessage pongo que me pinte una diagonal, sí
sale la linea pintada, pero nada de lo que haya pintado en el
(TMICONTROL_WMPAINT) en C que me explicaste en Madrid para usar el doble
buffer, sale en el bitmap.
Si tienes un ejemplo de que eso te funciona, te agradecería que lo publiques
y me lo envies a mi e-mail si quieres, porque a mí no me hace nada, o en el
WMPAINT hace falta poner algo que no se ha puesto y ese es el kit de la
cuestión.
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422ef2ce$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > Lo siento, pero el WM_PRINTCLIENT no me hace el bitmap del control, es
> > como
> > si ese SendMessage no hiciera absolutamente nada, si a tí te funciona,
> > ¿Puedes probar este pequeño ejemplo?
>
> Lo he probado y me funciona perfectamente. Acabo de caer en un pequeño
> detalle... el control que estás diseñando, ¿es un sólo control con todo su
> pintado? o por contra, ¿estás usando otros controles dentro de él?
>
> Si es el primero caso te tiene que funcionar, pero si se trata del segundo
> es lógico que no te funcione. En cambio, tu rutina está cogiendo
> directamente la imagen de la pantalla, y si hay controles encima pues
> también salen, ya que te está cogiendo exactamente lo que estás viendo.
>
> En cualquier caso, yo te aconsejo usar un sólo control, y realizar todo el
> pintado dentro de él. Deja lo de montar unos controles dentro de otros
> solamente para los contenedores, que ya cumplen su función correctamente.
> Vamos, a no ser que esté equivocado y estés haciendo algo distinto de lo
que
> yo creo.
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Convertir un control a im
Joaquín,
> El Control no tiene otros controles, derivo de TWinControl, le pongo el
> nClrPane = clWhite y en el Paint() dibujo a pelo líneas y rectángulos.
>
> Y ya está, no es nada extraño ni controles sobre controles, es más si en
> GetBitmap en C después del SendMessage pongo que me pinte una diagonal, sí
> sale la linea pintada, pero nada de lo que haya pintado en el
> (TMICONTROL_WMPAINT) en C que me explicaste en Madrid para usar el doble
> buffer, sale en el bitmap.
Quizás no esté correcta esa función. Comprueba que sea más o menos así:
//---------------------------------------------------------- --------------------
XA_FUNC_STATIC( TEXPLORERBAR_WMPAINT )
{
PHB_ITEM Self = hb_stackSelfItem();
HWND hWnd = GetHandleOf( Self );
CONTROLPAINT cp;
if ( XA_ControlBeginPaint( Self, hWnd, &cp, (HDC) hb_parnl( 1 ) ) )
{
RECT rect;
GetClientRect( hWnd, &rect );
XA_DrawControlBackground( Self, cp.hDC, &rect );
// Aqui viene todo el codigo de pintado
}
XA_ControlEndPaint( Self, hWnd, &cp );
hb_retnl( 0 );
}
//---------------------------------------------------------- --------------------
Sobre todo, fíjate en la llamada a XA_ControlBeginPaint(). El 4to. parámetro
tiene que ser el hdc que se recibe en WParam. Si no está así, entonces se
está pintando sobre un hdc nuevo, y lógicamente no funciona GetBitmap().
> Si tienes un ejemplo de que eso te funciona, te agradecería que lo
> publiques
> y me lo envies a mi e-mail si quieres, porque a mí no me hace nada, o en
> el
> WMPAINT hace falta poner algo que no se ha puesto y ese es el kit de la
> cuestión.
Las pruebas las he hecho con un nuevo control que estamos haciendo, pero
todavía no está listo. Esta tarde te enviaré un ejemplo con controles de los
que ya están disponibles.
De todos modos, si quieres envíame lo que estás haciendo y te lo reviso por
si encuentro algo incorrecto.
--
Un saludo,
José F. Giménez
> El Control no tiene otros controles, derivo de TWinControl, le pongo el
> nClrPane = clWhite y en el Paint() dibujo a pelo líneas y rectángulos.
>
> Y ya está, no es nada extraño ni controles sobre controles, es más si en
> GetBitmap en C después del SendMessage pongo que me pinte una diagonal, sí
> sale la linea pintada, pero nada de lo que haya pintado en el
> (TMICONTROL_WMPAINT) en C que me explicaste en Madrid para usar el doble
> buffer, sale en el bitmap.
Quizás no esté correcta esa función. Comprueba que sea más o menos así:
//---------------------------------------------------------- --------------------
XA_FUNC_STATIC( TEXPLORERBAR_WMPAINT )
{
PHB_ITEM Self = hb_stackSelfItem();
HWND hWnd = GetHandleOf( Self );
CONTROLPAINT cp;
if ( XA_ControlBeginPaint( Self, hWnd, &cp, (HDC) hb_parnl( 1 ) ) )
{
RECT rect;
GetClientRect( hWnd, &rect );
XA_DrawControlBackground( Self, cp.hDC, &rect );
// Aqui viene todo el codigo de pintado
}
XA_ControlEndPaint( Self, hWnd, &cp );
hb_retnl( 0 );
}
//---------------------------------------------------------- --------------------
Sobre todo, fíjate en la llamada a XA_ControlBeginPaint(). El 4to. parámetro
tiene que ser el hdc que se recibe en WParam. Si no está así, entonces se
está pintando sobre un hdc nuevo, y lógicamente no funciona GetBitmap().
> Si tienes un ejemplo de que eso te funciona, te agradecería que lo
> publiques
> y me lo envies a mi e-mail si quieres, porque a mí no me hace nada, o en
> el
> WMPAINT hace falta poner algo que no se ha puesto y ese es el kit de la
> cuestión.
Las pruebas las he hecho con un nuevo control que estamos haciendo, pero
todavía no está listo. Esta tarde te enviaré un ejemplo con controles de los
que ya están disponibles.
De todos modos, si quieres envíame lo que estás haciendo y te lo reviso por
si encuentro algo incorrecto.
--
Un saludo,
José F. Giménez
Convertir un control a im
Jose,
Sigue sin funcionar y la unica diferencia es que donde tú has puesto:
// Aqui viene todo el codigo de pintado
yo pongo:
XA_ObjSendNL( Self, "Paint", (long) cp.hDC );
Creo en la clase un método Paint(hDC) desde prg y ahí es donde pinto en ese
hDC, ¿puede tener el problema esa línea? Lo demás está idéntico.
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422efd76$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > El Control no tiene otros controles, derivo de TWinControl, le pongo el
> > nClrPane = clWhite y en el Paint() dibujo a pelo líneas y rectángulos.
> >
> > Y ya está, no es nada extraño ni controles sobre controles, es más si en
> > GetBitmap en C después del SendMessage pongo que me pinte una diagonal,
sí
> > sale la linea pintada, pero nada de lo que haya pintado en el
> > (TMICONTROL_WMPAINT) en C que me explicaste en Madrid para usar el doble
> > buffer, sale en el bitmap.
>
> Quizás no esté correcta esa función. Comprueba que sea más o menos así:
>
>
//---------------------------------------------------------- ----------------
----
>
> XA_FUNC_STATIC( TEXPLORERBAR_WMPAINT )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HWND hWnd = GetHandleOf( Self );
> CONTROLPAINT cp;
>
> if ( XA_ControlBeginPaint( Self, hWnd, &cp, (HDC) hb_parnl( 1 ) ) )
> {
> RECT rect;
>
> GetClientRect( hWnd, &rect );
> XA_DrawControlBackground( Self, cp.hDC, &rect );
>
> // Aqui viene todo el codigo de pintado
>
> }
> XA_ControlEndPaint( Self, hWnd, &cp );
>
> hb_retnl( 0 );
> }
>
>
//---------------------------------------------------------- ----------------
----
>
> Sobre todo, fíjate en la llamada a XA_ControlBeginPaint(). El 4to.
parámetro
> tiene que ser el hdc que se recibe en WParam. Si no está así, entonces se
> está pintando sobre un hdc nuevo, y lógicamente no funciona GetBitmap().
>
>
> > Si tienes un ejemplo de que eso te funciona, te agradecería que lo
> > publiques
> > y me lo envies a mi e-mail si quieres, porque a mí no me hace nada, o en
> > el
> > WMPAINT hace falta poner algo que no se ha puesto y ese es el kit de la
> > cuestión.
>
> Las pruebas las he hecho con un nuevo control que estamos haciendo, pero
> todavía no está listo. Esta tarde te enviaré un ejemplo con controles de
los
> que ya están disponibles.
>
> De todos modos, si quieres envíame lo que estás haciendo y te lo reviso
por
> si encuentro algo incorrecto.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Sigue sin funcionar y la unica diferencia es que donde tú has puesto:
// Aqui viene todo el codigo de pintado
yo pongo:
XA_ObjSendNL( Self, "Paint", (long) cp.hDC );
Creo en la clase un método Paint(hDC) desde prg y ahí es donde pinto en ese
hDC, ¿puede tener el problema esa línea? Lo demás está idéntico.
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:422efd76$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> > El Control no tiene otros controles, derivo de TWinControl, le pongo el
> > nClrPane = clWhite y en el Paint() dibujo a pelo líneas y rectángulos.
> >
> > Y ya está, no es nada extraño ni controles sobre controles, es más si en
> > GetBitmap en C después del SendMessage pongo que me pinte una diagonal,
sí
> > sale la linea pintada, pero nada de lo que haya pintado en el
> > (TMICONTROL_WMPAINT) en C que me explicaste en Madrid para usar el doble
> > buffer, sale en el bitmap.
>
> Quizás no esté correcta esa función. Comprueba que sea más o menos así:
>
>
//---------------------------------------------------------- ----------------
----
>
> XA_FUNC_STATIC( TEXPLORERBAR_WMPAINT )
> {
> PHB_ITEM Self = hb_stackSelfItem();
> HWND hWnd = GetHandleOf( Self );
> CONTROLPAINT cp;
>
> if ( XA_ControlBeginPaint( Self, hWnd, &cp, (HDC) hb_parnl( 1 ) ) )
> {
> RECT rect;
>
> GetClientRect( hWnd, &rect );
> XA_DrawControlBackground( Self, cp.hDC, &rect );
>
> // Aqui viene todo el codigo de pintado
>
> }
> XA_ControlEndPaint( Self, hWnd, &cp );
>
> hb_retnl( 0 );
> }
>
>
//---------------------------------------------------------- ----------------
----
>
> Sobre todo, fíjate en la llamada a XA_ControlBeginPaint(). El 4to.
parámetro
> tiene que ser el hdc que se recibe en WParam. Si no está así, entonces se
> está pintando sobre un hdc nuevo, y lógicamente no funciona GetBitmap().
>
>
> > Si tienes un ejemplo de que eso te funciona, te agradecería que lo
> > publiques
> > y me lo envies a mi e-mail si quieres, porque a mí no me hace nada, o en
> > el
> > WMPAINT hace falta poner algo que no se ha puesto y ese es el kit de la
> > cuestión.
>
> Las pruebas las he hecho con un nuevo control que estamos haciendo, pero
> todavía no está listo. Esta tarde te enviaré un ejemplo con controles de
los
> que ya están disponibles.
>
> De todos modos, si quieres envíame lo que estás haciendo y te lo reviso
por
> si encuentro algo incorrecto.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Convertir un control a im
Joaquín,
aquí tienes un ejemplo autocontenido. Verás que el control se está pintando
desde el método Paint() en prg, que es llamado desde WMPaint() en C, tal y
como vimos en Madrid.
También he puesto un botón que tapa parcialmente al control y otro botón
cuyo padre es precísamente el control, para que veas que al capturar el
bitmap lo hace bien, no cogiendo los botones en la imagen.
Al pulsar el botón "GetBitmap()" verás que la imagen te aparece en el TBevel
de la derecha, y también está disponible en el portapapeles para poder
pegarlo en otros programas.
Revísalo por si tú tienes algo diferente que pueda provocar que no te
funcione. Y si no das con el problema, envíame el código para revisarlo.
--
Un saludo,
José F. Giménez
Attached files TestGetBitmap.zip (2.6 KB)Â
aquí tienes un ejemplo autocontenido. Verás que el control se está pintando
desde el método Paint() en prg, que es llamado desde WMPaint() en C, tal y
como vimos en Madrid.
También he puesto un botón que tapa parcialmente al control y otro botón
cuyo padre es precísamente el control, para que veas que al capturar el
bitmap lo hace bien, no cogiendo los botones en la imagen.
Al pulsar el botón "GetBitmap()" verás que la imagen te aparece en el TBevel
de la derecha, y también está disponible en el portapapeles para poder
pegarlo en otros programas.
Revísalo por si tú tienes algo diferente que pueda provocar que no te
funcione. Y si no das con el problema, envíame el código para revisarlo.
--
Un saludo,
José F. Giménez
Attached files TestGetBitmap.zip (2.6 KB)Â
Convertir un control a im
Jose, Gracias! y Perfecto!
Yo no había puesto
METHOD WMPrintClient() EXTERN TMiControl_WMPaint()
No entendí bien tu primer mensaje, tampoco conozco muy bien como funciona
Xailer, pero ahora deduzco que un SendMessage en C con un WM_loquesea, debe
ser un método en el control para que se ejecute lo que yo quiera, ¿es eso?
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=422f45ff@ozsrv2.ozlan.local...]422f45ff@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> aquí tienes un ejemplo autocontenido. Verás que el control se está
pintando
> desde el método Paint() en prg, que es llamado desde WMPaint() en C, tal y
> como vimos en Madrid.
>
> También he puesto un botón que tapa parcialmente al control y otro botón
> cuyo padre es precísamente el control, para que veas que al capturar el
> bitmap lo hace bien, no cogiendo los botones en la imagen.
>
> Al pulsar el botón "GetBitmap()" verás que la imagen te aparece en el
TBevel
> de la derecha, y también está disponible en el portapapeles para poder
> pegarlo en otros programas.
>
> Revísalo por si tú tienes algo diferente que pueda provocar que no te
> funcione. Y si no das con el problema, envíame el código para revisarlo.
>
> --
> Un saludo,
>
> José F. Giménez
>
>
>
Yo no había puesto
METHOD WMPrintClient() EXTERN TMiControl_WMPaint()
No entendí bien tu primer mensaje, tampoco conozco muy bien como funciona
Xailer, pero ahora deduzco que un SendMessage en C con un WM_loquesea, debe
ser un método en el control para que se ejecute lo que yo quiera, ¿es eso?
Un Saludo,
Joaquín
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=422f45ff@ozsrv2.ozlan.local...]422f45ff@ozsrv2.ozlan.local...[/email]
> Joaquín,
>
> aquí tienes un ejemplo autocontenido. Verás que el control se está
pintando
> desde el método Paint() en prg, que es llamado desde WMPaint() en C, tal y
> como vimos en Madrid.
>
> También he puesto un botón que tapa parcialmente al control y otro botón
> cuyo padre es precísamente el control, para que veas que al capturar el
> bitmap lo hace bien, no cogiendo los botones en la imagen.
>
> Al pulsar el botón "GetBitmap()" verás que la imagen te aparece en el
TBevel
> de la derecha, y también está disponible en el portapapeles para poder
> pegarlo en otros programas.
>
> Revísalo por si tú tienes algo diferente que pueda provocar que no te
> funcione. Y si no das con el problema, envíame el código para revisarlo.
>
> --
> Un saludo,
>
> José F. Giménez
>
>
>
Convertir un control a im
Joaquín,
> Jose, Gracias! y Perfecto!
Estupendo!
> Yo no había puesto
> METHOD WMPrintClient() EXTERN TMiControl_WMPaint()
>
> No entendí bien tu primer mensaje, tampoco conozco muy bien como funciona
> Xailer, pero ahora deduzco que un SendMessage en C con un WM_loquesea,
> debe
> ser un método en el control para que se ejecute lo que yo quiera, ¿es eso?
Todos los mensajes de windows (WM_?????) se reenvian a la clase
correspondiente, ejecutando el método del mismo nombre pero sin el guión de
subrayado. P.ej. WM_PAINT se reenvía a WMPaint(), WM_LOQUESEA a
WMLoquesea().
Si ese método retorna Nil, además se reenvía el mensaje al procedimiento de
ventana estándar de windows, para que lo procese. En cambio, si se retorna
otro valor, no se reenvía a windows, y el significado de ese valor será el
que indique la documentación del API. P.ej. según el API, WM_PAINT tiene que
retornar 0 si se ha pintado el control.
Y si la clase no tiene ese método, simplemente se reenvía a windows para que
lo procese.
En el caso que nos ocupa, al no tener declarado el método WMPrintClient(),
el núcleo de Xailer lo reenvía a windows. Pero al ser un control propio, no
nativo de windows, simplemente no hace nada.
--
Un saludo,
José F. Giménez
> Jose, Gracias! y Perfecto!
Estupendo!
> Yo no había puesto
> METHOD WMPrintClient() EXTERN TMiControl_WMPaint()
>
> No entendí bien tu primer mensaje, tampoco conozco muy bien como funciona
> Xailer, pero ahora deduzco que un SendMessage en C con un WM_loquesea,
> debe
> ser un método en el control para que se ejecute lo que yo quiera, ¿es eso?
Todos los mensajes de windows (WM_?????) se reenvian a la clase
correspondiente, ejecutando el método del mismo nombre pero sin el guión de
subrayado. P.ej. WM_PAINT se reenvía a WMPaint(), WM_LOQUESEA a
WMLoquesea().
Si ese método retorna Nil, además se reenvía el mensaje al procedimiento de
ventana estándar de windows, para que lo procese. En cambio, si se retorna
otro valor, no se reenvía a windows, y el significado de ese valor será el
que indique la documentación del API. P.ej. según el API, WM_PAINT tiene que
retornar 0 si se ha pintado el control.
Y si la clase no tiene ese método, simplemente se reenvía a windows para que
lo procese.
En el caso que nos ocupa, al no tener declarado el método WMPrintClient(),
el núcleo de Xailer lo reenvía a windows. Pero al ser un control propio, no
nativo de windows, simplemente no hace nada.
--
Un saludo,
José F. Giménez