2010-04-28 31 views
11

Làm cách nào để đặt vị trí con trỏ trong ứng dụng Bàn điều khiển Win32? Tốt hơn là tôi muốn tránh xử lý và sử dụng các chức năng của Windows Console. (Tôi đã dành tất cả buổi sáng chạy xuống con hẻm tối đó, nó tạo ra nhiều vấn đề hơn là giải quyết.) Tôi dường như nhớ lại việc này tương đối đơn giản khi tôi học đại học bằng stdio, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào về cách thực hiện nó ngay bây giờ . Bất kỳ suy nghĩ hay lời đề nghị sẽ được đánh giá cao. Cảm ơn.Đặt vị trí con trỏ trong ứng dụng bảng điều khiển Win32

Chi tiết bổ sung

Dưới đây là những gì tôi đang cố gắng để giờ đây làm:

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) 

Chuỗi văn bản str không bao giờ được gửi đến màn hình. Có điều gì khác mà tôi nên làm không? Cảm ơn.

Trả lời

9

Xem SetConsoleCursorPosition API

Edit:

Sử dụng WriteConsoleOutputCharacter() mà có tay cầm để đệm hoạt động của bạn trong giao diện điều khiển và cũng cho phép bạn thiết lập vị trí của 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' là một chức năng của bảng điều khiển Windows, mà tôi đã nói rằng tôi muốn tránh sử dụng. –

+0

Vì vậy, tôi đã kết thúc với Hans gợi ý sử dụng 'GetStdHandle (STD_OUTPUT_HANDLE)' để có được xử lý cho bàn điều khiển hiện có, nhưng hóa ra tôi cũng cần sử dụng 'WriteConsoleOutputCharacter()'. Tôi không biết tại sao cuộc gọi đó lại có tác dụng, nhưng giờ nó vẫn hoạt động. Cảm ơn! –

12

Sử dụng chức năng bảng điều khiển, bạn muốn sử dụng SetConsoleCursorPosition. Nếu không có chúng (hoặc ít nhất là không sử dụng chúng trực tiếp), bạn có thể sử dụng một cái gì đó như gotoxy trong thư viện ncurses.

Chỉnh sửa: a wrapper cho nó là khá tầm thường:

// 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' là những gì tôi nghĩ, nhưng tôi thấy rằng mặc dù API' SetConsoleCursorPosition' đã đặt đúng vị trí con trỏ, khi tôi cố gắng gửi văn bản tới bàn điều khiển bằng cách sử dụng 'printf', văn bản sẽ xuất ra vị trí con trỏ ở trước khi gọi API. –

+0

@Jim: Thật thú vị khi biết trình biên dịch thực hiện điều đó. Tôi đã sử dụng mã như thế này với trình biên dịch của Microsoft trong nhiều năm, và không bao giờ nhìn thấy hành vi mà bạn mô tả. –

+0

Vui lòng xem chi tiết bổ sung mà tôi đã thêm vào câu hỏi. Cảm ơn. –

1

Bạn có thể đã sử dụng ANSI excape code sequences, mà không làm việc với Windows giao diện điều khiển các ứng dụng 32-bit.

+0

Hmmm, đó là một khả năng. Cảm ơn. –

4

Vâng, bạn đã quên gọi SetConsoleActiveScreenBuffer. Chính xác thì điểm tạo của riêng bạn là gì? Sử dụng GetStdHandle(STD_OUTPUT_HANDLE) để xử lý bảng điều khiển hiện có.

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; 
} 
Các vấn đề liên quan