¿como conocer las propiedades de los objetos en C?

¿como conocer las propiedades de los objetos en C?

Postby quique » Sun Jun 08, 2008 9:05 pm

¿Como puedo leer las propiedades de los objetos en una función de C?

Por ejemplo, la función de C recibe hWnd ¿como puedo saber si la ventana tiene menú (oMenu <> nil) o si oTop, oLeft, oBottom, oRight tienen algo?

o algo más dificil ¿como puedo saber nWidth y nHeight de oClient?
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Mon Jun 09, 2008 10:09 pm

Quique,

Puedes enviar mensajes a un objeto desde C usando esta funcion:

PHB_ITEM hb_objSendMsg( PHB_ITEM pObject, const char *sMsg, ULONG ulArg, ... )

Ojo, hWnd no es un objeto de Harbour sino un handle de Windows. Tendrias que pasar oWnd a la funcion en C para acceder al objeto con esa funcion
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41898
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Tue Jun 10, 2008 2:04 am

El problema es que quiero sustituir una función ya existente y esta función recibe hWnd en los llamados que hace fivewin.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Tue Jun 10, 2008 7:06 am

Quique,

Entonces modifica la función para proporcionarle los demas datos que necesitas:

test( hWnd, oWnd:oMenu, oWnd:oClient:nWidth, oWnd:oClient:nHeight )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41898
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Tue Jun 10, 2008 4:48 pm

No puedo modificar la función como dices porque es una función que es llamada desde los fuentes de fivewin, pero se me ocurre crear una variable estática para manejar el objeo ¿puedes ayudarme con esto por favor? creo que solo necesito ayuda en seis líneas (con eso casi te estoy pidiendo que hagas mi trabajo :wink: )

Code: Select all  Expand view

objetoActivo( oSay1 )   // Este es el llamado para indicar el objeto

#pragma BEGINDUMP

static int oActivo ;  // ¿como declaro esta variable que contiene el objeto?

#include <Windows.h>
#include <ClipApi.h>

HB_FUNC( MIFUNCION )
{
   
   :
   nWidth = xx( oActivo, "nWidth" );   // ¿como haría el llamado para obtener oActivo:nWidth?
   oWnd = xx( oActivo, "oWnd" );   ¿como haría el llamado para obtener oActivo:oWnd?
   oWnd = xx( oWnd, "move", 0, 0, 100, 100, TRUE ); ¿como enviaría los parametros para mover la ventana?
   oActivo:cargo = "hola" ;  // ¿como podría asignar un valor a la variable cargo?
}

HB_FUNC_STATIC( OBJETOACTIVO )
{
   oActivo = _par¿?( 1 );   // ¿como puedo recibir el objeo?
}
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Tue Jun 10, 2008 5:32 pm

Quique,

Es preferible que expliques lo que quieres hacer: una descripción general, y te indicamos la forma de hacerlo.

Programar eso que quieres a bajo nivel requiere de unas técnicas que no son simples. Por ejemplo: no puedes almacenar un objeto de Harbour a bajo nivel tal cual. Has de bloquearlo para que el recolector de basuras no lo destruya, y más tarde desbloquearlo.

Si podemos hacer lo que quieres a nivel PRG, mejor y más facil para ti.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41898
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Tue Jun 10, 2008 5:40 pm

modifiqué la función CTRLDRAWFOCUS de fivewin, el primer paso que necesito es conocer si la ventana HWND tiene menú o no para poder pintar el recuadro, todavía no estoy seguro de como le voy a hacer, pero mas adelante voy a crear un recuadro con la idea de seleccionar varios controles, aunque todavía no me he puesto a pensar en esa parte porque todavía no llego a ella, tal vez tenga que indicar a los controles algún mensaje para indicar que están dentro del recuadro, tal vez esto lo haga en un prg común y corriente, pero como por el momento me tuve que meter a C, quiero prevenir esta situación
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Tue Jun 10, 2008 5:47 pm

Para seleccionar varios controles tienes una forma más simple que consiste en calcular el tamaño del recuadro que los contiene a todos ellos, en vez de mostrar un recuadro para cada uno de ellos.

La idea es calcular la posición más a la izquierda y arriba, y más abajo y a la derecha, cuya area, los engloba a todos ellos.

Si lo que quieres es mostrar solo ciertos controles seleccionados, lo idóneo sería usar bPainted de cada control para que desde ese codeblock se pinte un recuadro alrededor de cada control.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41898
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Tue Jun 10, 2008 5:56 pm

gracias por la orientación, pero me falta lo mas importante en este momento ¿como puedo saber si la ventana tiene menú? para poder calcular la posición del recuadro
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Tue Jun 10, 2008 7:30 pm

Puedes usar la función GetMenu( hWnd ) del API de Windows que te devuelve cero en caso de no existir menu:

The GetMenu function retrieves the handle of the menu assigned to the given window.

HMENU GetMenu(
HWND hWnd // handle of window
);

Parameters
hWnd
Identifies the window whose menu handle is retrieved.

Return Values
If the function succeeds, the return value is the handle of the menu. If the given window has no menu, the return value is NULL. If the window is a child window, the return value is undefined.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41898
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Thu Jun 12, 2008 9:43 pm

printf( "%d \n", GetMenu( hWnd ) );

con o sin menú me devuelve 101
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: cmsoft, Google [Bot] and 130 guests