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
> > > >
> > > >
> > >
> > >
> >
> >
>
>