n° 219
Novembre 2017
Dicembre 12, 2017, 08:36:24 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1] 2   Vai giù
  Stampa  
Autore Discussione: Come posso centrare la finestra console sullo schermo ?  (Letto 2402 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« inserita:: Marzo 03, 2017, 01:44:46 »

Salve a tutti !
Ho costruito questa utile funzione che stampa su schermo un cerchio colorato a scelta , però se muovo la finestra al di fuori dei bordi del desktop il cerchio si cancella .
Vi domando se esiste uno o più modi per centrare la finestra console sullo schermo ?
Ringrazio anticipatamente !
Codice:
#define _WIN32_WINNT 0x0500
#include<windows.h>
#include<stdio.h>
int cerchio(int X,int Y,int dimensionecerchio,COLORREF coloreperimetro,COLORREF coloreinterno)
{
        int incremento=0;
        int altezzacerchio=dimensionecerchio;
        int larghezzacerchio=dimensionecerchio;
        HWND myconsole = GetConsoleWindow();
        HDC hdc = GetDC(myconsole);
        HPEN hpen;
        HBRUSH hbrush = CreateSolidBrush(coloreinterno);
        hpen = CreatePen(PS_SOLID, 2, coloreperimetro);
        //hbrush = CreateHatchBrush(HS_HORIZONTAL, RGB(0, 0, 150));
        SelectObject(hdc, hpen);
        SelectObject(hdc, hbrush);
        if(X>Y){altezzacerchio+=X;larghezzacerchio+=2-0.05+(incremento+=Y);}
        if(X==Y){altezzacerchio=altezzacerchio+X;larghezzacerchio=larghezzacerchio+X;}
        if(Y>X){altezzacerchio+=X;larghezzacerchio+=2-0.05+(incremento+=Y);}
        Ellipse(hdc,X,Y,altezzacerchio,larghezzacerchio);
        DeleteObject(hbrush);
        DeleteObject(hpen);

}
int main()
{
system ("MODE 126,50");
cerchio(30,10,100,RGB(0,70,255),COLORREF RGB(0,255,0));
getchar();
}
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #1 inserita:: Marzo 03, 2017, 03:25:45 »

Per spostare la finestra puoi usare la API

MoveWindow
(vedi documentazione su MSDN per l'uso)

che utilizzerà l'handle myconsole.

La funzione che hai scritto non deve essere di tipo int dato che non restituisce alcun valore, semmai di tipo void.

Nella chiamata nel main non va COLORREF
Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #2 inserita:: Marzo 03, 2017, 05:47:48 »

Oregon ha ragione !
Inserisco il codice corretto !

Codice:
#define _WIN32_WINNT 0x0500
#include<windows.h>
#include<stdio.h>
void cerchio(int X,int Y,int dimensionecerchio,COLORREF coloreperimetro,COLORREF coloreinterno)
{
        int incremento=0;
        int altezzacerchio=dimensionecerchio;
        int larghezzacerchio=dimensionecerchio;
        HWND myconsole = GetConsoleWindow();
        HDC hdc = GetDC(myconsole);
        HPEN hpen;
        HBRUSH hbrush = CreateSolidBrush(coloreinterno);
        hpen = CreatePen(PS_SOLID, 2, coloreperimetro);
        //hbrush = CreateHatchBrush(HS_HORIZONTAL, RGB(0, 0, 150));
        SelectObject(hdc, hpen);
        SelectObject(hdc, hbrush);
        if(X>Y){altezzacerchio+=X;larghezzacerchio+=2-0.05+(incremento+=Y);}
        if(X==Y){altezzacerchio=altezzacerchio+X;larghezzacerchio=larghezzacerchio+X;}
        if(Y>X){altezzacerchio+=X;larghezzacerchio+=2-0.05+(incremento+=Y);}
        Ellipse(hdc,X,Y,altezzacerchio,larghezzacerchio);
        DeleteObject(hbrush);
        DeleteObject(hpen);

}
int main()
{
system ("MODE 126,50");
cerchio(30,10,100,RGB(0,70,255),RGB(0,255,0));
getchar();
}


Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #3 inserita:: Marzo 03, 2017, 11:54:24 »

Ho trovato una funzione che modifica sia la posizione della finestra sia la dimensione della stessa , ma per le dimensioni grandi non funziona correttamente .
Ho dovuto adottare un sistema misto . Anche perché non volevo che apparisse le barre di scorrimento .
Codice:
#define _WIN32_WINNT 0x0500
#include<windows.h>
#include<stdio.h>
extern WINBASEAPI HWND WINAPI GetConsoleWindow ();
void cerchio(int X,int Y,int dimensionecerchio,COLORREF coloreperimetro,COLORREF coloreinterno);
void posizione_e_dimensione_finestra(int X,int Y,int larghezza,int altezza, UINT flag);

int main()
{
system ("MODE 115,50");
posizione_e_dimensione_finestra(30,30,950,900,0);
cerchio(30,10,100,RGB(0,70,255), RGB(0,255,0));
getchar();
}

void cerchio(int X,int Y,int dimensionecerchio,COLORREF coloreperimetro,COLORREF coloreinterno)
{
        int incremento=0;
        int altezzacerchio=dimensionecerchio;
        int larghezzacerchio=dimensionecerchio;
        HWND myconsole = GetConsoleWindow();
        HDC hdc = GetDC(myconsole);
        HPEN hpen;
        HBRUSH hbrush = CreateSolidBrush(coloreinterno);
        hpen = CreatePen(PS_SOLID, 2, coloreperimetro);
        //hbrush = CreateHatchBrush(HS_HORIZONTAL, RGB(0, 0, 150));
        SelectObject(hdc, hpen);
        SelectObject(hdc, hbrush);
        if(X>Y){altezzacerchio+=X;larghezzacerchio+=2-0.05+(incremento+=Y);}
        if(X==Y){altezzacerchio=altezzacerchio+X;larghezzacerchio=larghezzacerchio+X;}
        if(Y>X){altezzacerchio+=X;larghezzacerchio+=2-0.05+(incremento+=Y);}
        Ellipse(hdc,X,Y,altezzacerchio,larghezzacerchio);
        DeleteObject(hbrush);
        DeleteObject(hpen);

}

void posizione_e_dimensione_finestra(int X,int Y,int larghezza,int altezza, UINT flag) {

HWND hwnd = GetConsoleWindow();
SetWindowPos(
    hwnd,
    HWND_TOPMOST, //posiziona la finestra sopra le altre
    X, //posizione orizzontale della finestra nello schermo
    Y, //posizione verticale della finestra nello schermo
    larghezza, //larghezza finestra
    altezza, //altezza finestra
    flag   //bo?
);
}
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #4 inserita:: Marzo 04, 2017, 10:44:40 »

Come al solito NON leggi quello che ti si scrive ...

Ti avevo suggerito la MoveWindow ma non l'hai neanche considerato ...
Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #5 inserita:: Marzo 04, 2017, 02:39:21 »

L'ho trovata , però la larghezza della finestra non ingrandisce più di 900 .
Codice:
#include <iostream>

//the following line is necessary for the
//  GetConsoleWindow() function to work!
//it basically says that you are running this
//  program on Windows 2000 or higher
#define _WIN32_WINNT 0x0500

//it is important that the above line be typed
//  BEFORE <windows.h> is included
#include <windows.h>

using namespace std;

int main (void)
{
  HWND console = GetConsoleWindow();
  RECT r;

  //GetWindowRect(console, &r); //stores the console's current dimensions

  r.left = 20;//colonna dove posizionare la finestra
  r.top = 20;//riga dove posizionare la finestra
  r.right = 900;//larghezza finestra
  r.bottom = 700;//altezza finestra

  //MoveWindow(window_handle, x, y, width, height, redraw_window);
  MoveWindow(console, r.left, r.top, r.right , r.bottom , TRUE);
}




Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #6 inserita:: Marzo 04, 2017, 03:01:33 »

Qui tu hai parlato solo di CENTRARE la finestra, non di RIDIMENSIONARE la finestra.

La console non puoi ridimensionarla a piacere con quelle API. Bisogna usarne altre (vedi MSDN) e la cosa diventa un po' più complessa.

Se parliamo SOLO di spostare la finestra, la MoveWindow va benissimo.
Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #7 inserita:: Marzo 04, 2017, 03:53:34 »

In ogni caso con una semplice forzatura con "system ("MODE 120,55");" ottengo l'effetto desiderato , cioè di avere una finestra alle coordinate dello schermo con la dimensione desiderata , e inoltre l'assenza della barra di scorrimento !
Codice:
int main (void)
{
  HWND console = GetConsoleWindow();
  RECT r;

  //GetWindowRect(console, &r); //stores the console's current dimensions

  r.left = 20;//colonna dove posizionare la finestra
  r.top = 20;//riga dove posizionare la finestra
  //r.right = 900;//larghezza finestra
  //r.bottom = 700;//altezza finestra

  //MoveWindow(window_handle, x, y, width, height, redraw_window);
  MoveWindow(console, r.left, r.top,0,0, TRUE);
  system ("MODE 120,55");

}
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #8 inserita:: Marzo 04, 2017, 04:34:39 »

Perché al posto di usare le API utilizzi un comando del DOS. Ma quel comando non è così potente come le API.
Registrato
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #9 inserita:: Marzo 04, 2017, 05:20:35 »

Non ne conosco altri !
Poi è meno complicato delle funzioni API !
Poi non conosco la APi che lo può sostituire Pienamente !
Registrato
AldoBaldo
Newbie
*

Karma: +0/-4
Scollegato Scollegato

Messaggi: 28


Mostra profilo E-mail
« Risposta #10 inserita:: Marzo 05, 2017, 07:53:31 »

Non è difficile centrare una finestra con MoveWindow(), dai! Basta leggere un paio di pagine di documentazione per arrivare a...

Codice:
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0500 // la versione minima di Windows necessaria
                            // per poter usare GetConsoleWindow()

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

void CentraFinestraConsole( void ) {
    INT wSchermo = GetSystemMetrics( SM_CXSCREEN ); // larghezza dello schermo
    INT hSchermo = GetSystemMetrics( SM_CYSCREEN ); // altezza dello schermo
    HWND hwnd = GetConsoleWindow(); // la finestra della console

    if( hwnd != NULL ) {
        // i dati che seguono sono in relazione allo schermo
        INT xf; // la coordinata orizzontale della finestra
        INT yf; // la coordinata verticale della finestra
        INT wf; // la larghezza della finestra
        INT hf; // l'altezza della finestra
        RECT r; // il RECT della finestra

        GetWindowRect( hwnd, &r ); // ricava il RECT della finestra
        wf = r.right-r.left;  // calcola la larghezza della finestra
        hf = r.bottom-r.top;  // calcola l'altezza della finestra
        xf = (wSchermo-wf)/2; // calcola la posizione sinistra della finestra
        yf = (hSchermo-hf)/2; // calcola la posizione superiore della finestra
        xf = xf>=0 ? xf : 0;  // il margine sinistro non esca dallo schermo
        yf = yf>=0 ? yf : 0;  // il margine superiore non esca dallo schermo

        MoveWindow( hwnd, xf, yf, wf, hf, TRUE ); // sposta la finestra
    }
}

int main() {
    CentraFinestraConsole();
   
    printf( "Premi \"invio\" per uscire " );
    getchar();
   
    return 0;
}

Bisogna anche fare in modo che il progetto comprenda la libreria di sistema kernel32 (magari kernel64 se si usa un sistema a 64 bit? non lo so, non ho mai avuto un sistema a 64 bit).
Registrato

Ma cosa vuoi che ne sappia? Io col codice ci gioco, mica ci lavoro!
beppo63
Jr. Member
**

Karma: +0/-102
Scollegato Scollegato

Messaggi: 97


Mostra profilo
« Risposta #11 inserita:: Marzo 05, 2017, 08:11:45 »

Grazie molto utile !
Visto che tu sei molto più informato di me , non sai mica come si può disabilitare i pulsanti della finestra console che tramite il mouse riducono  a icona e modificano la dimensione della stessa ?
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #12 inserita:: Marzo 05, 2017, 09:00:39 »

Avevo tentato di lasciare a beppo il calcolo per centrare la finestra usando la MoveWindow ... ma gli è arrivato il codice pronto ... ha perso un'occasione per imparare da solo ...

P.S. beppo ... l'altra domanda è OT ... andrebbe in un altro thread ...
Registrato
AldoBaldo
Newbie
*

Karma: +0/-4
Scollegato Scollegato

Messaggi: 28


Mostra profilo E-mail
« Risposta #13 inserita:: Marzo 05, 2017, 09:12:32 »

Beppo, so che quei pulsanti sono o non sono presenti a seconda del valore che passi come quarto parametro a CreateWindowEx(), però non son sicuro di sapere come eliminarli/disabilitarli una volta che son stati creati. Ricordo due funzioni, SetClassLong() e SetWindowLong(), che potrebbero fare qualcosa del genere cambiando quel valore così come viene immagazzinato nelle strutture della finestra, ma non ho mai provato ad usarle per quello scopo, quindi... chissà.

Oregon, capisco il tuo punto di vista, però sono anche convinto che una persona che davvero voglia imparare prende il codice che gli viene suggerito e lo sottopone ad "autopsia" per vederne in dettaglio "le budella". A me leggere il codice d'esempio sui libri e/o "rubare" il codice altrui per poterlo smembrare, modificare, riassemblare... ha insegnato davvero tante cosette. Col che non intendo dire che son diventato un programmatore, né, perché essere un programmatore va ben oltre il mio (misero) livello di persona che gioca col codice e ci passa un po' di tempo per divertimento. Però tutt'ora apprezzo quando qualcuno mi fa vedere come si fa (o, almeno, uno dei tanti modi in cui si può fare) una cosa che non mi riesce. Ogni pezzetto che si aggiunge in quel modo al mio bagaglio apre poi la via ad altri pezzetti che vengono in autonomia, a volte addirittura in modo quasi spontaneo.

L'unica cosa che invaliderebbe alla radice il mio discorso sarebbe presupporre che Beppo non voglia imparare, ma io non ho modo di saperlo. Dai, pensiamo positivo!
Registrato

Ma cosa vuoi che ne sappia? Io col codice ci gioco, mica ci lavoro!
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #14 inserita:: Marzo 05, 2017, 09:25:05 »

Così neghi a Beppo la possibilità di studiare, documentarsi, realizzare da solo il proprio codice anche sbagliando, perché sarà indotto ad utilizzare il tuo.

E non è affatto detto che chi vede del codice lo capisca effettivamente. Ad esempio, moltissimi leggono codice con puntatori e li utilizza SENZA aver mai capito cosa siano e quali sono le loro effettive caratteristiche. Così che poi, quando tentano di utilizzarli diversamente, falliscono miseramente. Quando mancano le BASI teoriche, si è sempre "zoppicanti".
Registrato
Pagine: [1] 2   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines