DIRECCIONAR WINDOWS EN MODO CONSOLE

HMG en Español

Moderator: Rathinagiri

User avatar
LOUIS
Posts: 256
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by LOUIS »

Estimados Amigos :

Cómo puedo direccionar una pantalla en modo consola, pero que NO se posicione por default en 0,0
sino en la posición que yo la programe, por ejemplo :
Linea 10, columna 0 ... Linea 10, Columna 40 ... Así como se ve en los gráficos adjuntos...
Attachments
POR DEFAULT
POR DEFAULT
POSICION 0 0.jpg (115.42 KiB) Viewed 5274 times
LINEA 10, COLUMNA 0
LINEA 10, COLUMNA 0
POSICION 10 0.jpg (178.03 KiB) Viewed 5274 times
LINEA 10, COLUMNA 40
LINEA 10, COLUMNA 40
POSICION 10 40.jpg (233.74 KiB) Viewed 5274 times
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by Pablo César »

Hola Louis,

En verdad seria posicionar el window console. Es algo interesante, dificil pero creo que no es imposible.

1. Estuve viendo que si tu aplicacion abre y clicas en el Title bar de la seccion con el boton derecho del mouse, puedes accesar las propiedades y si vás en el Tab "Layout", podrás notar que se puede configurar tu aplicativo que abra siempre en tal linea, tal columna.
Sheldon WIN2755 Fig 5.jpg
Sheldon WIN2755 Fig 5.jpg (46.39 KiB) Viewed 5265 times
2. Pero tambien investigué si esto se podria hacerse de forma programática. Por lo que leí, el sistema operativo guarda en:

HKEY_CURRENT_USER\Console

Si hace una prueba como mencioné en el item 1 y confirmas, seguro que será grabado path y nombre del aplicativo en esta carpeta de tu REGISTRY en forma de subfolders. En el siguiente formato: C:_hmg.3.4.0_SAMPLES_Basics_CONSOLE_hello.exe (C:\hmg.3.4.0\SAMPLES\Basics\CONSOLE\hello.exe, notar que substituye por underlines).
Siendo asi, podrias utilizar las funciones de lectura y grabacion del REGISTRY en HMG y grabar las posiciones. Parece que esta informacion está guardada en la llave WindowPosition que puede estar en Decimal o Hexadecimal. Solo que no sé como formar este valor. Algun cálculo envolviendo la posicion de linea y columna. Creo que se suma el ancho de la Linea+Altura_ventana+columna+Ancho_ventana y el resultado se debe convertir en Hexadecimal o Decimal.

3. Creo que tambien podria resolver atravéz de la funcion C SetWindowPosition, pero tendrás primero que localizar el handle de tu aplicacion.

Disculpame, todo esto es teórico. No tengo nada desenvuelto a respecto, pero espero haberte esclarecido las opciones que podrias intentar.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
LOUIS
Posts: 256
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by LOUIS »

NO quiero tocar las Propiedades ni los Predeterminados ... me imagino que si se pudiera hacer como en Fox con Define Windows W1 FROM 5,0 TO 25,46 sería fantástico ... es que esta ventanita en console, tengo que abrirla en varios lugares del programa, por eso no puedo dejarla definida en las propiedades :(
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by Pablo César »

LOUIS wrote:NO quiero tocar las Propiedades ni los Predeterminados ...
Que es Predeterminados para vos ?
LOUIS wrote:me imagino que si se pudiera hacer como en Fox con Define Windows W1 FROM 5,0 TO 25,46 sería fantástico ...
Estás seguro que eso existe para console ???

Louis, te di 3 opciones...
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by Pablo César »

No fué tan dificil.

Importante: viewtopic.php?p=37222#p37222
Attachments
So_Roda5 (Source files).rar
Sources Files (Atencion hbc file)
(791 Bytes) Downloaded 272 times
So_Roda5 (Executable file).rar
Executable file
(513.21 KiB) Downloaded 287 times
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
LOUIS
Posts: 256
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by LOUIS »

Estimado Pablo:

De los 2 rar que pusiste, el executable funciona ok, pero el que trae el prg NO :(
este es el error ... undefined reference to `HB_FUN_SETWINDOWPOS'

Podés arreglarlo por fa ?
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by Pablo César »

LOUIS wrote:el executable funciona ok, pero el que trae el prg NO :(
Es el mismo !

Louis, cual es la version HMG que estás usando ??

Solo está faltando en tu HMG la funcion SETWINDOWPOS.
Y está disponible apartir del HMG 3.1.5, cuando Dr. Claudio lo disponibilizó en C:\hmg.3.1.5\SOURCE\SOURCE\c_windows.c

En este tópico Andrés lo disponibilizó tambien.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
LOUIS
Posts: 256
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by LOUIS »

Amigo Pablo:

Efectivamente, uso la versión 3.0.46 y por eso no creó el exe correctamente ... al compilar con la 3.1.5 se hizo el executable y funciona correctamente esto de direccionar la console-ventana a cualquier lugar de la pantalla; ahora bien, al compilar mis programas con la 3.1.5 que por cierto dicen que es estable, no me funcionan bien :( crea el exe y entra a la primera pantalla de presentación en modo gui, de ahí debe pasar a unos procesos internos en modo console y luego volver a presentar una pantalla gui pero no llega a esta y termina abruptamente a pesar de quedarse corriendo en memoria :shock:

Intenté copiando C:\hmg.3.1.5\SOURCE\c_windows.c <---> dentro de C:\hmg.3.0.46\SOURCE\c_windows.c pero no funcionó :roll:

Recordemos Pablo, que mi programa esta modo mix console-gui y por eso a pesar de haber probado con la última versión 4.2 hace lo mismo que la 3.1.5

Probé bajando la versión 3.2 (aunque tiene 2 parches que bajarse para corregir ciertos bugs) y con esta me funciona bien mi programa console-gui aunque noto ciertas cosillas que la 3.0.46 superó a la 3.0.39 como el pase de foco de una pantalla a otra, y también cuando pido un reporte por pantalla lanza primero una leyenda en modo console en la parte baja de la pantalla, pero luego presenta el informe.

No sé que hacer, si quedarme con la 3.0.46 aunque no pueda direccionar la console-pantalla, o pasarme a la 3.2 y bajar los parches ... Me podrías decir después de la 3.2 que versiones salieron estables (sin parches) antes de llagar a la 4.2 ?

Gracias de antemano.
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by Pablo César »

LOUIS wrote:al compilar mis programas con la 3.1.5 que por cierto dicen que es estable, no me funcionan bien :( crea el exe y entra a la primera pantalla de presentación en modo gui, de ahí debe pasar a unos procesos internos en modo console y luego volver a presentar una pantalla gui pero no llega a esta y termina abruptamente a pesar de quedarse corriendo en memoria :shock:
Si ahora entiendo que lo que buscabas es em MIX (console y gui). Y creo que tu no te has dado cuenta que yo no sabia de este "pequeño" detalle. Porque si te fijas mi ejemplo, no verás ninguna instruccion en GUI, al contrário, estoy forzando la salida del interface con:

REQUEST HB_GT_WIN_DEFAULT

Ni tampoco disponibilizé el #include <hmg.ch> que es responsable por adicionar toda la biblioteca gráfica de HMG.
Asi que tenemos que ver caso a caso.

Cuando hablamos de nuevas versiones, algunos piensan que los cambios solo suceden en HMG, pero en verdad no es asi !

El Harbour tambien cambió en sus versiones la forma de alternar la salidas del interface, tambien cambiamos para UNICODE no utilizando los codepages. Entonces es algo un tanto complejo.

Yo no sé si conseguiria manter um sistema en MIX. No es imposible creo yo, pero que es trabajoso si puedo afirmar.
Creo que esa alternancia de una seccion console para otra gráfica tiene que ser tratada atravéz de llamados en C con sus respectivos HANDLES.
Intenté copiando C:\hmg.3.1.5\SOURCE\c_windows.c <---> dentro de C:\hmg.3.0.46\SOURCE\c_windows.c pero no funcionó :roll:
No, eso jamás iria funcionar ! Esta pra´ctica nunca se debe ejecutar de esa forma.
Lo que quize decir en mi mensaje anterior, es que puedes extraer el código en C que habian publicado e inserirlo en tu código, no en la biblioteca HMG de la version antigua.
Probé bajando la versión 3.2 (aunque tiene 2 parches que bajarse para corregir ciertos bugs) y con esta me funciona bien mi programa console-gui aunque noto ciertas cosillas que la 3.0.46 superó a la 3.0.39 como el pase de foco de una pantalla a otra, y también cuando pido un reporte por pantalla lanza primero una leyenda en modo console en la parte baja de la pantalla, pero luego presenta el informe.
Como expliqué antes, es trabajoso esta alternancia. Son dos ambientes completamente distintos. Yo pensaria en trabajar en un solo ambiente: o en console o en gráfico.
No sé que hacer, si quedarme con la 3.0.46 aunque no pueda direccionar la console-pantalla
Te paso el código que faltaba para que lo insieras en tu código y puedas compilarlo en 3.0.46.

Code: Select all

/* Compiled with hmg.3.0.46 version */

#define HWND_TOPMOST                              -1
#define SWP_NOSIZE                                0x0001
#define SWP_DRAWFRAME                             0x0020

REQUEST HB_GT_WIN_DEFAULT 

Function Main ()
Local hWnd:=GetConsoleWindowHandle()

SetMode(25,80)
SetWindowPos( hWnd, HWND_TOPMOST, 600, 500, 1, 1, hb_bitOr( SWP_NOSIZE, SWP_DRAWFRAME ) )

@ 00,00 to 24,79 double
@ 01,01 SAY "012345678901234567890123456789012345678901234567890123456789012345678901234567"
@ 03,01 SAY "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Inkey(0)
Return Nil

#pragma BEGINDUMP
#define WINVER 0x0600 // for Vista
#define _WIN32_WINNT 0x0600 // for Vista

#include "windows.h"
#include "hbapi.h"

HB_FUNC( GETCONSOLEWINDOWHANDLE )
{
    HWND hwnd;
    AllocConsole();
    hwnd = FindWindowA("ConsoleWindowClass",NULL);
    hb_retnl( (LONG) hwnd );
}

HB_FUNC ( SETWINDOWPOS )
{
    HWND hwnd           = (HWND) hb_parnl(1);    // handle to window or control
    HWND hWndInsertAfter= (HWND) hb_parnl(2);    // placement-order handle
    int X               =        hb_parni(3);    // horizontal position
    int Y               =        hb_parni(4);    // vertical position
    int cx              =        hb_parni(5);    // width
    int cy              =        hb_parni(6);    // height
    UINT uFlags         = (UINT) hb_parni(7);    // window-positioning options

    hb_retl( (BOOL) SetWindowPos( hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags ) );
}

#pragma ENDDUMP
Talvez asi, como en este ejemplo, poderias continuar en 3.0.46
o pasarme a la 3.2 y bajar los parches ... Me podrías decir después de la 3.2 que versiones salieron estables (sin parches) antes de llagar a la 4.2 ?
Yo partiria para la más nueva version. Yo tengo una opinion muy formada con respecto a versiones.

Leé esto por favor, si querés dejá tu opinion a respecto. Creo que es lo que más hace falta por aqui... que todo dén su opinion y relaten sus dificultades.

Pero me parece apropiado estar actualizado SIEMPRE !
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

DIRECCIONAR WINDOWS EN MODO CONSOLE

Post by Pablo César »

Louis fijate este ejemplo que hé mejorado:

viewtopic.php?p=40041#p40041
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
Post Reply