Pasar array a una función C

Pasar array a una función C

Postby César E. Lozada » Mon Dec 15, 2008 6: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
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela

Postby Antonio Linares » 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
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby César E. Lozada » 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.
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela

Postby mmercado » 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
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby César E. Lozada » Sun Dec 21, 2008 3: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)
*======================================================================
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela

Postby César E. Lozada » Sun Dec 21, 2008 4: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.
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela

Postby César E. Lozada » Sun Dec 21, 2008 6: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
User avatar
César E. Lozada
 
Posts: 128
Joined: Wed Oct 26, 2005 12:18 pm
Location: Los Teques, Miranda, Venezuela

Postby Antonio Linares » Sun Dec 21, 2008 8: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re:

Postby FiveWiDi » Tue Feb 10, 2009 1: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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Re: Pasar array a una función C

Postby Antonio Linares » Tue Feb 10, 2009 2: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:
Code: Select all  Expand view
#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
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Pasar array a una función C

Postby FiveWiDi » 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:
Code: Select all  Expand view
#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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 78 guests