2010-04-28 26 views
11

Imleç konumunu Win32 Console uygulamasında nasıl ayarlayabilirim? Tercihen, bir tutamaç yapmaktan ve Windows Konsol Fonksiyonlarını kullanmaktan kaçınmak istiyorum. (Bütün sabah bu karanlık sokaktan aşağı koşarak geçirdim; çözdüğünden daha fazla sorun yaratıyor.) Bunu stdio kullanarak kolejdeyken göreceli olarak yaptığımı hatırlıyorum ama şimdi nasıl yapılacağına dair bir örnek bulamıyorum. . Herhangi bir düşünce ya da öneri çok takdir edilecektir. Teşekkürler.Imleç Konumunu bir Win32 Konsol Uygulamasında Ayarlama

Ek Detaylar Burada

Şu anda yapmak çalışıyorum ne:

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) 

metin dizesi str ekrana hiçbir zaman gönderilmez. Yapmam gereken başka bir şey var mı? Teşekkürler.

cevap

9

SetConsoleCursorPosition API

Edit bakınız:

Kullanım WriteConsoleOutputCharacter() konsolunda aktif tamponuna kolu alır ve ayrıca konumunu ayarlamak sağlar.

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 ', kullanmaktan kaçınmak istediğimi belirttiğim bir Windows Konsol Fonksiyonudur. –

+0

Böylece, varolan konsola tanıtımı elde etmek için Hans Getion (GetStdHandle (STD_OUTPUT_HANDLE) 'i kullanma önerisi ile sona erdi, ama 'WriteConsoleOutputCharacter()' kullanmak için gerekli olduğu ortaya çıktı. Bu aramanın neden hile yaptığını bilmiyorum ama şimdi çalışıyor. Teşekkürler! –

12

konsol fonksiyonlarını kullanarak, SetConsoleCursorPosition kullanmayı tercih ediyorum. Bunlar olmadan (ya da en azından onları doğrudan kullanmadan), gibi bir şeyi ncurses kitaplığında kullanabilirsiniz.

Düzenleme: bunun için bir sarıcı hayli abes: Muhtemelen Windows 32 bit konsol uygulamaları ile çalışmaz hangi ANSI excape code sequences kullanıyorlardı

// 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" aklımda olan şeydi, ancak 'printf 'kullanarak konsola metin göndermeye çalıştığımda' SetConsoleCursorPosition 'API'sinin imleç konumunu doğru olarak ayarlamasına rağmen, metin çıktılarını İmlecin konumu, API’yi aramadan önce olmuştu. –

+0

@Jim: Derleyicinin bunu yaptığını bilmek ilginç olurdu. Microsoft'un derleyicisi ile yıllardır böyle bir kod kullandım ve tanımladığınız davranışı hiç görmedim. –

+0

Lütfen soruya eklediğim ek açıklamalara bakın. Teşekkürler. –

1

.

+0

Hmmm, bu bir olasılık. Teşekkürler. –

4

Evet, SetConsoleActiveScreenBuffer numaralı telefonu aramayı unutmuşsunuzdur. Tam olarak kendi yaratma noktanız neydi? Mevcut konsola tanıtmak için GetStdHandle(STD_OUTPUT_HANDLE) kullanın.

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; 
} 
İlgili konular