2010-04-28 17 views
11

¿Cómo puedo establecer la posición del cursor en una aplicación Win32 Console? Preferiblemente, me gustaría evitar hacer un control y usar las funciones de la consola de Windows. (Pasé toda la mañana corriendo por ese callejón oscuro, crea más problemas de los que resuelve.) Parece recordar haberlo hecho de manera relativamente simple cuando estaba en la universidad usando stdio, pero no encuentro ejemplos de cómo hacerlo ahora. . Cualquier opinión o sugerencia sería muy apreciada. Gracias.Configuración de la posición del cursor en una aplicación de consola Win32

detalles adicionales

Esto es lo que ahora estoy tratando de hacer:

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 cadena de texto str nunca se envía a la pantalla. ¿Hay algo más que debería estar haciendo? Gracias.

Respuesta

9

Ver SetConsoleCursorPosition API

Editar:

Uso WriteConsoleOutputCharacter() que toma la manija a su búfer activo en la consola y también le permite establecer su posición.

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' es una función de consola de Windows, que indiqué que me gustaría evitar usar. –

+0

Así que, terminé yendo con la sugerencia de Hans de usar 'GetStdHandle (STD_OUTPUT_HANDLE)' para obtener el control de la consola existente, pero resultó que necesitaba usar 'WriteConsoleOutputCharacter()' también. No sé por qué esa llamada funciona, pero está funcionando ahora. ¡Gracias! –

12

Usando las funciones de la consola, que tendría que utilizar SetConsoleCursorPosition. Sin ellos (o al menos sin usarlos directamente), podría usar algo como gotoxy en la biblioteca ncurses.

Editar: un envoltorio ya que es bastante trivial:

// 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

El 'gotoxy' es lo que tenía en mente, pero encontré que aunque la API' SetConsoleCursorPosition' establece correctamente la posición del cursor, cuando intento enviar texto a la consola usando 'printf', el texto se envía al ubicación donde estaba el cursor antes de llamar a la API. –

+0

@Jim: Sería interesante saber qué compilador hace eso. He usado código como este con el compilador de Microsoft durante años, y nunca he visto el comportamiento que describes. –

+0

Consulte los detalles adicionales que he agregado a la pregunta. Gracias. –

1

Usted fue probablemente está utilizando ANSI excape code sequences, que no funcionan con aplicaciones de consola de Windows de 32 bits.

+0

Hmmm, esa es una posibilidad. Gracias. –

4

Sí, se olvidó de llamar al SetConsoleActiveScreenBuffer. ¿Cuál fue exactamente el punto de crear el tuyo? Use GetStdHandle(STD_OUTPUT_HANDLE) para obtener un control de la consola existente.

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; 
} 
Cuestiones relacionadas