Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   C/C++ (http://www.forosdelweb.com/f96/)
-   -   Winapi (http://www.forosdelweb.com/f96/winapi-454175/)

arm 04/01/2007 16:23

Winapi
 
Hola antes que cualquier otra cosoa saludos a todos, no he andado por aqui en mucho tiempo, pero ya me llegaron las vacaciones.

Bueno, ahce algunos meses esta intentando hacer una pequeña interface POO para windows pero haro quiero continuar.

Tengo varias interrogantes, la principal es como realcionas una instancia de las clases que estoy creando con el procedimiento de ventana. Osea, se creo un manejador para un evento, como ahcer que la instancia apripoado lo reciva.

Creo algunos controles, sucede que planeaba pasar informacion atraves de la lpParam al crear la ventanta(mediente la llamada a CreateWindowEx()), pero solo puede recuperarla desde dentro del procedimiento de ventana, o porlo menos es la unica forma que conosco. Alguien tiene una mejor idea. Me gustari sbaer que hay una funcion de la api que toma como parametro un HWND y retorna LPCREATEPARAM o algo semejante

Ademas, el procedimiento de ventana tiene un valo de retorno, deve haver alguna forma de obtenerlo, creo que eso me ayudaria.


De antemano gracias.

MaxExtreme 05/01/2007 15:30

Re: Winapi
 
Si quieres hacerlo POO, siempre puedes encerrar el código GUI dentro de tus propias clases (algo como la MFC, pero más sencillo y directo a tus necesidades).

Yo hice algo así hace ya tiempo:

Código:

class window
{
    window(alto, ancho, ...);
    ~window();

private:
    void wndproc();

    friend void wndproc_wrapper();
    ...
}

void wndproc_wrapper(void *param)
{
      ((window *) param)->wndproc();
}

Algo así. Usa el wrapper para llamar a la función wndproc real de cada clase/ventana, y main() que se encargue de despachar los mensajes, etc.

Decir que no funcionaba nada mal, y era fácilmente portable...

arm 05/01/2007 16:36

Re: Winapi
 
es una buena opcion, si.

Pero tengo mucho tiempo para encontrar una mejor, especificamente quiero que el procedimeinto de ventana llame a a funcionese de la clases (como en la mfc), en cuantos a las nececidades pues el objetivos es que sea general.

Aun que pensandolo bien es una idea sencilla y util, vere como la puedo utilizar

MaxExtreme 05/01/2007 17:14

Re: Winapi
 
Date cuenta de que usando esa manera no tendrás más problemas pasando punteros extraños a través de funciones de Windows, dado que, al tener tus propias clases, los datos que quieras ya los almacenas allí.

Además de aislar el código GUI-Windows no portable del código de la aplicación propiamente dicha.

arm 06/01/2007 16:56

Re: Winapi
 
Pero como me deshago de los parametros para CREATESTRUCTURE, WINCLASSEX y HINSTANCE, son un dolor de cabesa. No entiendo como es que propones manejar estos tipos de datos. Puede ser un poco nas explicito.
Si pudiera sinplemente crear una ventana(sin registrarla, como con 'edit','button'...) pero aun asi asignar el procedimiento de venta seria magnifico, tienes idea de la posibilidad de esto?.

MaxExtreme 06/01/2007 17:33

Re: Winapi
 
No entiendo el problema específico que tienes...

Tú pones el código para crear tu ventana (CreateWindowEx() y demás), en el constructor a ser posible, pasándole los argumentos que requieras...

blackwind 06/01/2007 18:32

Re: Winapi
 
que tal,

si lo que estas haciendo NO es una tarea ni por mera practica......
por que no usas la MFC? si no te gusta, hay otras buenas alternativas:
WTL
wxWidgets
gtk

saludos,

Nivel7 06/01/2007 19:26

Re: Winapi
 
Si realmente quieres aventurarte con el API de Windows. No veo forma de des ahcerte del procedimiento de ventana que a de asignarse al puntero de la estructura de la Clase de ventana.

la forma en que puedes usarlo es como un procedimiento amigo de la clase o como un metodo estatico.
en ambos casos no podrias acceder al puntero this.

hay formas de poder obtenerlo.

una es obtenerlo directamente en el Procedimiento de ventana o usar un metodo de la clase que realice las mismas funciones del procedimiento de ventana, similar a como ha mostrado en su ejemplo MaxExtreme.

la mejor forma de obtener el puntero this es usando la funcion GetWindowLong, funcion que retorna un dato de la ventana (HWND) que pasas como parametro determinado por el indice o constante GWL_....
generalmente GWL_USERDATA.

claro antes tienes que asignar este puntero(this) a tu ventana, ya sea con SetWindowLong, si lo obtendras con GetWindowLong o en el campo lParam de una estructura MDICREATESTRUCT pasandola en el ultimo parametro de la funcionCreateWindowEx.

Las funciones GetWindowLong y SetWindowLong te seran muy utiles, y las respectivas constantes GWL_....

Saludos.

arm 08/01/2007 16:53

Re: Winapi
 
hola blackwind, es que la unica utilidad segura que ahora tengo en mente es la practica, dado que llo trabajo en vb y c#, pero espero que sea usable.

Hola nivel7, creo que esa es mi respuesta, es he tenido pocos ides de como solucioanar ese problema, lu estuv intetando mediante lpparam CreateWindowEx, pero solo podia obtener desde el procedimiento.
Pero bueno voy a sudiar esas funciones y luego coment como me fue.

arm 11/01/2007 16:06

Re: Winapi
 
Asi fue, GetWindowLong y SetWindowLong fueron sumamente utiles.
Es tan simple como comvertir el valor en un puntero y listo.

Gracias.

arm 04/02/2007 15:43

Re: Winapi
 
Hola, de nuevo con esta cantaleta, veran, tengo una clase que es la encargada de crear los controles como botenes y caja de texto, pero en el caso de edit, cuando se visualisa es una tira plana de fondo blanco, pero el botton se ve como estoy acostumbrado en 3D, me gustaria que me dijeran como puedo cambiar esto.

Gracias.

Nivel7 05/02/2007 17:53

Re: Winapi
 
No comprendo muy bien, pero si te refieres a que no se muestra en 3D, la verdad no estoy seguro si esta sea la solucion, pero podrias solucionarlo con WS_EX_CLIENTEDGE como estilo extendido.

intentalo.

arm 19/02/2007 14:46

Re: Winapi
 
Hola nivel 7 disculpa la falta de atencio.

Bueno prove lo que me dijistis me no tiene efecto.

El problema es que creo una instancia de ventana windows, espec ificamente creo una ventana edit, pero su apariencia es la de un rectangulo con fondo blanco, y yo quiero que paresca una el texbox que estoa acostumbrado a ver.


La zona horaria es GMT -6. Ahora son las 23:02.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.