PDA

Ver la Versión Completa : [Duda] Evento "Resized" del Form (Sheet)


Kuk
21 de julio de 2015, 13:50
Hola compis, acabo de darme cuenta que el PowerCOBOL v3 no tiene evento "Resized" en sus Forms. ¿Cómo lo gestionáis? He pensado de meter un Timer, pero a lo mejor existen otras soluciones?

Otra posibilidad sería hacer subclassing del Form via WinAPI pero por ejemplo la versión 9 no acepta CALL BY VALUE entre funciones COBOL, la versión diría yo que es más cercana a la construcción de ventana clásico de C++ así que lo mismo un día lo pruebo.

Volviendo a la pregunta en si, cómo lo apañáis vosotros?

Adrianeloy
27 de julio de 2015, 14:16
Yo tuve que hacer este "remedio" casero:
En propiedades de la ventana, le quité los "Style" Minimize, Maximize y Control.
Agregue arriba y a la izquierda de la ventana 3 imagenes de creación propia de "minimizar", "maximizar" y "cerrar".

Al hacer click en "minimizar" ejecuto:
CALL SHOWSHEET OF SHEET1 USING POW-SWSHOWMINIMIZED.

Al hacer click en "cerrar" ejecuto:
CALL CLOSESHEET OF SHEET1.

Eso es sencillo, solo se complica en el proceso que ejecutas en "maximizar".
Para esto uso un CHECK oculto llamado MAXIMIZA, asi se si estoy en modo maximizado o normal.

IF POW-CHECK OF MAXIMIZA = POW-OFF
CALL SHOWSHEET OF SHEET1 USING POW-SWSHOWMAXIMIZED
MOVE POW-ON TO POW-CHECK OF MAXIMIZA.

IF POW-CHECK OF MAXIMIZA = POW-ON
CALL SHOWSHEET OF SHEET1 USING POW-SWSHOWNORMAL
MOVE POW-OFF TO POW-CHECK OF MAXIMIZA.

Tener en cuenta que al cambiar la ventana, la posicion de las 3 imagenes quedaran descolocadas.
Asi que hay que leer la posicion de la ventana para obtener su ancho actual, restarle
los "pixeles" del ancho de la imagen "cerrar" y moverle ese valor a la posicion horizontal de la imagen.
Luego haremos lo mismo con la imagen de "maximizar", restandole los pixeles del ancho de "cerrar" + lo de "maximizar".
Y finalemente lo mismo con la imagen de "minimizar", restandolo los anchos de las 3 imagenes.

Complicado y muchas vueltas? No tanto. Peor es implementar la alternativa a la opcion "Resize".
Para eso, tenes que llamar a un procedure que lee la posicion y tamaño de cada boton, pic, label, edit, tabla... que tenes en la ventana, uno por uno, y aplicarle un porcentaje para agrandar o reducir su tamaño actual. (Y tambien a su tipo de letra!)
Es un laburo de hormiga pero es la unica forma que encontre en power cobol V3.
Si queres un ejemplo lo preparo un poco y lo subo...
Espero que te sirva.

Kuk
27 de julio de 2015, 14:49
Adrianeloy, usa el resalto de código que hay en el editor, en este caso COBOL.

Lo que dices no es precisamente lo que quiero hacer. En realidad, si haces lo mismo que los botones nativos, no entiendo por qué los quitas y lo haces todo a mano?

Yo a lo que me refiero es al evento en sí. Cuando quieres hacer Form de dimensiones variables, en PowerCOBOL 9 sea marcas la casilla "Scallable", sea recalculas las posiciones como bien dices en tu post (que mejor recalcular, lo de Scallable no me mola mucho...). El problema es que "Resized" es un evento, es decir reside en el bucle WndProc, y cuando el SO envía el message WM_SIZE es cuando se ejecuta el código que metas (el de calculo de posiciones y etc). Pero en PowerCOBOL 3 el WndProc de la ventana (que evidentemente no está disponible para nosotros) no controla este mensaje.

Se puede hacer SubClassing del WndProc haciendo una DLL en C++, o meter un Timer que controle el cambio de dimensiones. Pero pensaba que a lo mejor la gente que más lo ha usado tiene otra solución más simple. Como por ejemplo, yo no sabía que la propiedad "hwnd" de los controles nativos de PowerCOBOL 9 están simplemente ocultos pero accesibles en todo momento.

Adrianeloy
27 de julio de 2015, 16:48
Agregué las imagenes como un medio de detectar que se pulsó "maximizar" y poder reescalar todo, porque no encontré otra manera de detectar ese evento en PowerCobol V3.

Kuk
27 de julio de 2015, 17:09
Adrianeloy, el evento del que hablo, es cuando un Form no está minimizado ni maximizado sino redimensionado por el usuario con el ratón. Ese mismo evento pasa al maximizar y minimizar, es verdad, pero si el Form es redimensionable, el usuario puede cambiar el tamaño sin maximizar. ;)