2010-04-28 15 views
11

Come si imposta la posizione del cursore in un'applicazione della console Win32? Preferibilmente, vorrei evitare di creare un handle e di utilizzare le funzioni della console di Windows. (Ho passato tutta la mattinata a correre in quel vicolo buio, crea più problemi di quanti ne risolva.) Mi sembra di ricordare di farlo relativamente semplicemente quando ero al college usando stdio, ma non trovo esempi di come farlo ora . Qualsiasi pensiero o suggerimento sarebbe molto apprezzato. Grazie.Impostazione della posizione del cursore in un'applicazione console Win32

Dettagli aggiuntivi

Ecco ciò che sono ora cercando di fare:

COORD pos = {x, y}; 
HANDLE hConsole_c = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 
char * str = "Some Text\r\n"; 
DWDORD len = strlen(str); 

SetConsoleCursorPosition(hConsole_c, pos); 
WriteConsole(hConsole_c, str, len, &dwBytesWritten, NULL); 
CloseHandle(hConsole_c) 

La stringa di testo str non viene mai inviato allo schermo. C'è qualcos'altro che dovrei fare? Grazie.

risposta

9

Vedi SetConsoleCursorPosition API

Edit:

Usa WriteConsoleOutputCharacter() che prende la maniglia per il buffer attivo nella console e permette anche di impostare la propria posizione.

int x = 5; int y = 6; 
COORD pos = {x, y}; 
HANDLE hConsole_c = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 
SetConsoleActiveScreenBuffer(hConsole_c); 
char *str = "Some Text\r\n"; 
DWORD len = strlen(str); 
DWORD dwBytesWritten = 0; 
WriteConsoleOutputCharacter(hConsole_c, str, len, pos, &dwBytesWritten); 
CloseHandle(hConsole_c); 
+0

'SetConsoleCursorPosition' è una funzione di console di Windows, che ho dichiarato che vorrei evitare di utilizzare. –

+0

Quindi, ho finito con il suggerimento di Hans di usare 'GetStdHandle (STD_OUTPUT_HANDLE)' per ottenere l'handle della console esistente, ma è risultato che avevo bisogno di usare anche 'WriteConsoleOutputCharacter()'. Non so perché quella chiamata fa il trucco, ma funziona ora. Grazie! –

12

Utilizzando le funzioni della console, è necessario utilizzare SetConsoleCursorPosition. Senza di essi (o almeno non li si utilizza direttamente), è possibile utilizzare qualcosa come gotoxy nella libreria ncurses.

Edit: un wrapper per è abbastanza banale:

// Untested, but simple enough it should at least be close to reality... 
void gotoxy(int x, int y) { 
    COORD pos = {x, y}; 
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleCursorPosition(output, pos); 
} 
+0

Il 'gotoxy' è quello che avevo in mente, ma ho scoperto che anche se l'API' SetConsoleCursorPosition' imposta correttamente la posizione del cursore, quando tento di inviare il testo alla console usando 'printf', il testo viene inviato al posizione in cui si trovava il cursore prima di chiamare l'API. –

+0

@Jim: Sarebbe interessante sapere cosa fa il compilatore. Ho usato codice come questo con il compilatore di Microsoft per anni e non ho mai visto il comportamento che descrivi. –

+0

Si prega di consultare i dettagli aggiuntivi che ho aggiunto alla domanda. Grazie. –

1

Stavate probabilmente utilizzando ANSI excape code sequences, che non funzionano con le applicazioni di console Windows a 32 bit.

+0

Hmmm, questa è una possibilità. Grazie. –

4

Sì, hai dimenticato di chiamare SetConsoleActiveScreenBuffer. Che cosa era esattamente il punto di creare il tuo? Utilizzare GetStdHandle(STD_OUTPUT_HANDLE) per ottenere un handle per la console esistente.

1
#include <windows.h> 
#include <iostream.h> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int x,y; 
    cin>>x>>y; 
    SetCursorPos(x,y); //set your co-ordinate 
    Sleep(500); 
    mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0); // moving cursor leftdown 
    mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0); // moving cursor leftup //for accessing your required co-ordinate 
    system("pause"); 
    return EXIT_SUCCESS; 
} 
Problemi correlati