web-dev-qa-db-fra.com

Définition de la position du curseur dans une application console Win32

Comment définir la position du curseur dans une application console Win32? De préférence, j'aimerais éviter de créer un descripteur et d'utiliser les fonctions de la console Windows. (J'ai passé toute la matinée à courir dans cette allée sombre; cela crée plus de problèmes qu'il n'en résout.) Je me souviens de l'avoir fait assez simplement quand j'étais à l'université avec stdio, mais je ne trouve aucun exemple de la façon de le faire maintenant. . Toutes les pensées ou suggestions seraient grandement appréciées. Merci.

Détails supplémentaires

Voici ce que j'essaie maintenant de faire:

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 chaîne de texte str n'est jamais envoyée à l'écran. Y a-t-il autre chose que je devrais faire? Merci.

14
Jim Fell

Voir SetConsoleCursorPosition API

Modifier:

Utilisez WriteConsoleOutputCharacter () qui récupère le handle de votre tampon actif dans la console et vous permet également de définir sa position.

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);
10
cpx

En utilisant les fonctions de la console, vous utiliseriez SetConsoleCursorPosition. Sans eux (ou du moins, ne les utilisez pas directement), vous pourriez utiliser quelque chose comme gotoxy dans la bibliothèque ncurses .

Edit: un wrapper car c'est assez 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);
}
12
Jerry Coffin

Oui, vous avez oublié d'appeler SetConsoleActiveScreenBuffer. Quel était le but de créer le vôtre? Utilisez GetStdHandle(STD_OUTPUT_HANDLE) pour obtenir un descripteur de la console existante.

4
Hans Passant

Vous utilisiez probablement/ Les séquences de code de copie ANSI , qui ne fonctionnent pas avec les applications console 32 bits de Windows.

1
Mark Ransom
#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;
}
1
udit043