FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Pasar array a una funci贸n C
Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
Pasar array a una funci贸n C
Posted: Mon Dec 15, 2008 06:06 PM

Una pregunta que me parece haberla visto respondida en estos foros pero que no logro ubicar:

驴C贸mo paso un array a una funci贸n escrita en C?

Por ejemplo: Viendo los ejemplos que usan RECT rct veo que se pasan los 4 par谩metros separados y1,x1,y2,x2 y se asignan con rct.top=y1, etc.

驴Hay alguna forma de enviar {y1,x1,y2,x2} y asignarlos a rct dentro de la funci贸n en C?

Gracias
C茅sar Lozada

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Pasar array a una funci贸n C
Posted: Mon Dec 15, 2008 10:42 PM

C茅sar,

Puedes recoger cualquier elemento del array, como valor numerico, usando:

hb_retnl( <nParametro>, <nElementoArray> ) --> nValor

por ejemplo:

rct.top = hb_retnl( 1, 2 );

significa que el array es el parametro 1, y que queremos su segundo elemento.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
Pasar array a una funci贸n C
Posted: Tue Dec 16, 2008 12:57 AM

Gracias, Antonio

Ya puedo dibujar controles haciendo llamadas a DrawFrameControl(hDC,aRect,uType,uState) con

pragma BEGINDUMP

include <hbapi.h>

include <windows.h>

HB_FUNC( DRAWFRAMECONTROL ) // hDC, aRect, uType, uState
{

HDC hdc = ( HDC ) hb_parnl(1); // handle to device context
UINT uType = hb_parni(3) ; // frame-control type
UINT uState = hb_parni(4); // frame-control state
RECT rct;

rct.top = hb_parnl(2,1);
rct.left = hb_parnl(2,2);
rct.bottom = hb_parnl(2,3);
rct.right = hb_parnl(2,4);

hb_retnl ( DrawFrameControl(hdc,&rct,uType,uState) );
}

pragma ENDDUMP

Tengo una duda:
Cuando una funci贸n de una api (user32.dll) como esta se llama usando C, 驴debo preocuparme por FreeLibrary()?

Gracias.

Posts: 782
Joined: Wed Dec 19, 2007 07:50 AM
Pasar array a una funci贸n C
Posted: Wed Dec 17, 2008 12:11 AM
C茅sar E. Lozada wrote:Ya puedo dibujar controles haciendo llamadas a DrawFrameControl(hDC,aRect,uType,uState)
Hola C茅sar:

Gracias por compartir, abusando podr铆as mostrarnos un peque帽o ejemplo con el uso de esta funci贸n?

Un abrazo.

Manuel Mercado
manuelmercado at prodigy dot net dot mx
Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
Pasar array a una funci贸n C
Posted: Sun Dec 21, 2008 03:54 AM

Con todo gusto Manuel y disculpa la tardanza. Estuve varios d铆as sin utilizar la red.

Con DrawFrameControl() puedes dibujar todos estos "objetos" de windows:

define DFC_CAPTION 1

define DFC_MENU 2

define DFC_SCROLL 3

define DFC_BUTTON 4

*#if(WINVER >= 0x0500)

define DFC_POPUPMENU 5

#endif / WINVER >= 0x0500 */
//DFC_CAPTION

define DFCS_CAPTIONCLOSE 0x0000

define DFCS_CAPTIONMIN 0x0001

define DFCS_CAPTIONMAX 0x0002

define DFCS_CAPTIONRESTORE 0x0003

define DFCS_CAPTIONHELP 0x0004

//DFC_MENU

define DFCS_MENUARROW 0x0000

define DFCS_MENUCHECK 0x0001

define DFCS_MENUBULLET 0x0002

define DFCS_MENUARROWRIGHT 0x0004

//DFC_SCROLL

define DFCS_SCROLLUP 0x0000

define DFCS_SCROLLDOWN 0x0001

define DFCS_SCROLLLEFT 0x0002

define DFCS_SCROLLRIGHT 0x0003

define DFCS_SCROLLCOMBOBOX 0x0005

define DFCS_SCROLLSIZEGRIP 0x0008

define DFCS_SCROLLSIZEGRIPRIGHT 0x0010

//

define DFCS_BUTTONCHECK 0x0000

define DFCS_BUTTONRADIOIMAGE 0x0001

define DFCS_BUTTONRADIOMASK 0x0002

define DFCS_BUTTONRADIO 0x0004

define DFCS_BUTTON3STATE 0x0008

define DFCS_BUTTONPUSH 0x0010

//

define DFCS_INACTIVE 0x0100

define DFCS_PUSHED 0x0200

define DFCS_CHECKED 0x0400

  • if(WINVER >= 0x0500)

define DFCS_TRANSPARENT 0x0800

define DFCS_HOT 0x1000

  • endif / WINVER >= 0x0500 /

define DFCS_ADJUSTRECT 0x2000

define DFCS_FLAT 0x4000

define DFCS_MONO 0x8000

======================================================================
Static Function DrawButtonPush(hDC,aRect,lPushed,lEnabled)
Local nState
DEFAULT lPushed:=.F., lEnabled:=.T.
nState:=nOr(DFCS_BUTTONPUSH,if(lPushed,DFCS_PUSHED,0),if(!lEnabled,DFCS_INACTIVE,0))
return DrawFrameControl(hDC,aRect,DFC_BUTTON,nState)
======================================================================
Static Function DrawCheckBox(hDC,aRect,lChecked,lEnabled)
Local nState
DEFAULT lChecked:=.F., lEnabled:=.T.
DEFAULT lChecked:=.F., lEnabled:=.T.
nState:=nOr(DFCS_BUTTONCHECK,if(lChecked,DFCS_CHECKED,0),if(!lEnabled,DFCS_INACTIVE,0))
return DrawFrameControl(hDC,aRect,DFC_BUTTON,nState)
*======================================================================
Static Function DrawRadioButton(hDC,aRect,lChecked,lEnabled)
Local nState
DEFAULT lChecked:=.F., lEnabled:=.T.

nState:=nOr(DFCS_BUTTONRADIO,if(lChecked,DFCS_CHECKED,0),if(!lEnabled,DFCS_INACTIVE,0))
return DrawFrameControl(hDC,aRect,DFC_BUTTON,nState)
======================================================================
Static Function DrawGuide(hDC,aRect)
return DrawFrameControl(hDC,aRect,DFC_MENU,DFCS_MENUARROW)
======================================================================

Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
Pasar array a una funci贸n C
Posted: Sun Dec 21, 2008 04:34 AM

La funci贸n DrawFrameControl() dibuja elementos de Windows, pero no aplica los temas de Windows.

Para dibujar un elemento de Windows con su tema hay que usar la otra funci贸n:

HRESULT DrawThemeBackground(
HTHEME hTheme,
HDC hdc,
int iPartId,
int iStateId,
const RECT pRect,
const RECT
pClipRect
);

La implementaci贸n general en Windows par dibujar un radiobutton deber铆a ser entonces algo parecido a como sigue:

{
m_htheme = OpenThemeData(hwnd, L"Button");
if (m_htheme)
{
DrawThemeBackground(m_htheme, hdc,
BP_RADIOBUTTON, RBS_CHECKEDNORMAL,
&rc, NULL);
CloseThemeData(m_htheme);
m_htheme = NULL;
}
else
{
DrawFrameControl(hdc, &rc, DFC_BUTTON,
DFCS_BUTTONRADIO | DFCS_CHECKED);

};

Para m谩s informaci贸n te refiero a

http://msdn.microsoft.com/en-us/library/bb773289.aspx

Esta funci贸n no la he podido implementar porque no he logrado ubicar el archivo Vsstyle.h.

Posts: 128
Joined: Wed Oct 26, 2005 12:18 PM
Pasar array a una funci贸n C
Posted: Sun Dec 21, 2008 06:12 AM
C茅sar E. Lozada wrote:
Esta funci贸n no la he podido implementar porque no he logrado ubicar el archivo Vsstyle.h.


Aqu铆 lo encontr茅, por si te interesa "jugar" con la funci贸n:
http://www.ookii.org/misc/vsstyle.h
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Pasar array a una funci贸n C
Posted: Sun Dec 21, 2008 08:23 AM

C茅sar,

> Cuando una funci贸n de una api (user32.dll) como esta se llama usando C, 驴debo preocuparme por FreeLibrary()?

En el caso de user32.dll, es una DLL que Windows mantiene abierta siempre :-)

Al usar una DLL desde C, Windows la abre y la cierra automaticamente. Solo tendrias que abrirla tu, si quisiera que aunque Windows intente cerrarla, permanezca abierta.

Windows mantiene un contador interno para las DLLs, asi que cuenta cuantas veces se ha abierto (aunque en realidad solo se ha abierto una vez) y va decrementando el contador cuando la cerramos (aunque en realidad no la cierra). Solo la cierra cuando el contador llega a cero.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1446
Joined: Mon Oct 10, 2005 02:38 PM
Re:
Posted: Tue Feb 10, 2009 01:59 PM
C茅sar E. Lozada wrote:
#pragma BEGINDUMP
#include <hbapi.h>
#include <windows.h>
HB_FUNC( DRAWFRAMECONTROL ) // hDC, aRect, uType, uState
{

HDC hdc = ( HDC ) hb_parnl(1); // handle to device context
UINT uType = hb_parni(3) ; // frame-control type
UINT uState = hb_parni(4); // frame-control state
RECT rct;

rct.top = hb_parnl(2,1);
rct.left = hb_parnl(2,2);
rct.bottom = hb_parnl(2,3);
rct.right = hb_parnl(2,4);

hb_retnl ( DrawFrameControl(hdc,&rct,uType,uState) );
}

#pragma ENDDUMP


Cesar,

Tengo que usar una funci贸n que recibe un puntero a una estructura, y quiero (as铆 me lo han aconsejado) llamarla desde una funci贸n en C (como has hecho tu). Pero me pierdo un poco,... bastante.

Estoy mirando tu c贸digo (as铆 aprendo).
Me puedes decir que es "RECT rct"? Es una estructura? Donde la defines? C贸mo la defines?

Saludos y gracias
Carlos G.

La estructura que debo definir es:

struct arg_list {
int LineLimit
BOOL ReadOnly
char InputType
char file[129]
HANDLE hBuffer
long BufferLen
HWND hParentWnd
HWND hTextWnd
DWORD style
BOOL modified
}

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Pasar array a una funci贸n C
Posted: Tue Feb 10, 2009 02:50 PM
Carlos,

Lo mas sencillo es que las estructuras las declares en C y que desde el PRG pases los valores para rellenarlas, por ejemplo:
#pragma BEGINDUMP

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

HB_FUNC( TEST )
{
   RECT rct;

   rct.left = hb_parnl( 1 );
   rct.top = hb_parnl( 2 );
   rct.right = hb_parnl( 3 );
   rct.bottom = hb_parnl( 4 );

   // &rct para acceder a la direccion de la estructura
   // lo que vayas a hacer con ella
}

#pragma ENDDUMP

Y desde PRG la llamas asi: Test( 10, 10, 100, 200 )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1446
Joined: Mon Oct 10, 2005 02:38 PM
Re: Pasar array a una funci贸n C
Posted: Tue Feb 10, 2009 10:13 PM
Antonio Linares wrote:Carlos,

Lo mas sencillo es que las estructuras las declares en C y que desde el PRG pases los valores para rellenarlas, por ejemplo:
#pragma BEGINDUMP

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

HB_FUNC( TEST )
{
   RECT rct;

   rct.left = hb_parnl( 1 );
   rct.top = hb_parnl( 2 );
   rct.right = hb_parnl( 3 );
   rct.bottom = hb_parnl( 4 );

   // &rct para acceder a la direccion de la estructura
   // lo que vayas a hacer con ella
}

#pragma ENDDUMP

Y desde PRG la llamas asi: Test( 10, 10, 100, 200 )


Gracias Antonio,

ya estoy empezando a codificar, a ver hasta donde llego.

Un saludo
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Continue the discussion