2010-04-28 12 views
11

어떻게하면 Win32 콘솔 응용 프로그램에서 커서 위치를 설정할 수 있습니까? 가급적이면, 나는 핸들을 만들고 Windows 콘솔 기능을 사용하지 않는 것이 좋습니다. (나는 어두운 골목을 뛰어 다니며 아침 내내 뛰며, 해결할 수있는 것보다 더 많은 문제를 일으킨다.) 나는 대학에 다니면서 stdio를 사용했을 때이 일을 상대적으로 간단하게 회상 한 것 같지만, 지금은 어떻게 할 지에 대한 예를 찾을 수 없다. . 어떤 생각이나 제안이라도 대단히 감사하겠습니다. 감사.Win32 콘솔 응용 프로그램에서 커서 위치 설정

추가 세부 사항 여기

내가 지금 할 노력하고 무엇 :

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) 

텍스트 문자열 str가 화면에 전송되지 않습니다. 내가해야만하는 다른 것이 있습니까? 감사.

답변

9

SetConsoleCursorPosition API

편집 참조 :

사용 WriteConsoleOutputCharacter() 콘솔에서 활성 버퍼에 핸들을 소요하고 또한 당신의 위치를 ​​설정할 수 있습니다.

+0

'SetConsoleCursorPosition'은 사용하지 않으려는 Windows 콘솔 기능입니다. –

+0

그래서 나는 한스의 제안으로'GetStdHandle (STD_OUTPUT_HANDLE)'을 사용하여 기존 콘솔에 대한 핸들을 얻었지만'WriteConsoleOutputCharacter()'를 사용해야한다는 것을 알게되었습니다. 왜 그 전화가 트릭을하는지 모르겠지만 지금은 작동 중입니다. 감사! –

12

콘솔 기능을 사용하면 SetConsoleCursorPosition을 사용합니다. 그들없이 (또는 적어도 직접 사용하지 않고) ncurses 라이브러리에 gotoxy과 같은 것을 사용할 수 있습니다.

편집 : 그것은 래퍼은 매우 ​​간단하다 : 당신은 아마 Windows 32 비트 콘솔 응용 프로그램에서 작동하지 않는, ANSI excape code sequences을 사용하고

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

'gotoxy'는 내가 염두에 두었던 것이지만,'SetConsoleCursorPosition' API가 커서 위치를 올바르게 설정해도'printf'를 사용하여 콘솔에 텍스트를 보내려고 할 때 텍스트가 커서가 API를 호출하기 전의 위치입니다. –

+0

@Jim : 컴파일러가 무엇을하는지 알아 보는 것은 흥미로울 것입니다. 필자는 Microsoft의 컴파일러에서 수년간 이와 같은 코드를 사용했으며 사용자가 설명하는 동작을 본 적이 없었습니다. –

+0

질문에 추가 된 추가 정보를 참조하십시오. 감사. –

1

.

+0

흠, 그건 가능합니다. 감사. –

4

예, SetConsoleActiveScreenBuffer에 깜빡했습니다. 나만의 것을 만드는 것이 정확히 무엇 이었습니까? GetStdHandle(STD_OUTPUT_HANDLE)을 사용하여 기존 콘솔에 대한 핸들을 확보하십시오.

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; 
} 
관련 문제