怎么在c程序里实现移动光标
2009-6-1 14:18新警察请问、怎么在c程序里实现移动光标?〔是在用VC++开发的控制台程序里〕
是移动光标、不是移动鼠标的
就是在控制台里的、一闪一闪的那个光标
我想要做的是、输出几行字符串之后、把光标移动到第一行
我查了printf 函数的几个转义字符、没有能把光标向上移动的
在网上找到了GetCursorPos这样的函数、可是最后发现是关于鼠标的、而不是关于控制台的光标的
以前在TC里用的函数不能用了、现在俺无计可施了、高手救命啊、跪求!
ps ,是简单的控制台c 程序、不用MFC的
2009-6-1 15:08net_robberEscape Sequence
2009-6-1 15:18jeanlove原帖由 新警察 于 2009-6-1 14:18 发表
是移动光标、不是移动鼠标的
就是在控制台里的、一闪一闪的那个光标
我想要做的是、输出几行字符串之后、把光标移动到第一行
我查了printf 函数的几个转义字符、没有能把光标向上移动的
在网上找到 ...
这个用Windows API的调用足够了。
CreateCaret.
DestroyCaret.
具体的用法查查msdn.
2009-6-1 15:20bruceteenSetConsoleCursorPosition
http://blog.vckbase.com/bruceteen/articles/25581.html#30382
http://blog.vckbase.com/bruceteen/articles/25581.html#32096
#include
#include
BOOL WINAPI csl_handler_routine( DWORD CtrlType )
{
switch( CtrlType )
{
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
// release resource
SetConsoleCtrlHandler( &csl_handler_routine, FALSE );
break;
}
return FALSE;
}
HANDLE hOutput_ = ::GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hInput_ = ::GetStdHandle(STD_INPUT_HANDLE);
COORD dwSize = { 60, 16 };
SHORT baselinenum = 0;
BOOL SetCursorPosition( SHORT x, SHORT y )
{
COORD cd = { x, y+baselinenum };
return ::SetConsoleCursorPosition( hOutput_, cd );
}
BOOL EarseTail( void )
{
CONSOLE_SCREEN_BUFFER_INFO info;
BOOL f = ::GetConsoleScreenBufferInfo( hOutput_, &info );
printf( "%*s", dwSize.X-info.dwCursorPosition.X, "" );
return f;
}
BOOL SetTextAttrib( WORD wAttributes )
{
return ::SetConsoleTextAttribute( hOutput_, wAttributes );
}
void ShowControlKeyState( DWORD dwControlKeyState )
{
SetTextAttrib( FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED );
printf( "" ); EarseTail();
printf( "CAPS LOCK : %s", (dwControlKeyState&CAPSLOCK_ON )?"ON":"OFF" ); EarseTail();
printf( "Enhanced : %s", (dwControlKeyState&ENHANCED_KEY )?"ON":"OFF" ); EarseTail();
printf( "ALT Left : %s", (dwControlKeyState&LEFT_ALT_PRESSED )?"ON":"OFF" ); EarseTail();
printf( "CTL Left : %s", (dwControlKeyState&LEFT_CTRL_PRESSED )?"ON":"OFF" ); EarseTail();
printf( "NUM LOCK : %s", (dwControlKeyState&NUMLOCK_ON )?"ON":"OFF" ); EarseTail();
printf( "ALT Right : %s", (dwControlKeyState&RIGHT_ALT_PRESSED )?"ON":"OFF" ); EarseTail();
printf( "
CTL Right : %s", (dwControlKeyState&RIGHT_CTRL_PRESSED)?"ON":"OFF" ); EarseTail();
printf( "SCROLL LOCK: %s", (dwControlKeyState&SCROLLLOCK_ON )?"ON":"OFF" ); EarseTail();
printf( "Shift : %s", (dwControlKeyState&SHIFT_PRESSED )?"ON":"OFF" ); EarseTail();
}
void ShowMouseInfo( MOUSE_EVENT_RECORD& mer )
{
SetTextAttrib( FOREGROUND_BLUE|FOREGROUND_GREEN/*|FOREGROUND_RED*/ | FOREGROUND_INTENSITY );
printf( "MousePosition: %03hd, %03hd", mer.dwMousePosition.X, mer.dwMousePosition.Y ); EarseTail();
printf( "ButtonState: Left=%c Right=%c", (mer.dwButtonState&FROM_LEFT_1ST_BUTTON_PRESSED)?'T':'F', (mer.dwButtonState&RIGHTMOST_BUTTON_PRESSED)?'T':'F' ); EarseTail();
printf( "EventFlags: " );
switch( mer.dwEventFlags )
{
case 0 : printf( "Pressed or Released" ); EarseTail(); break;
case DOUBLE_CLICK : printf( "double click " ); EarseTail(); break;
case MOUSE_MOVED : printf( "mouse moved " ); EarseTail(); break;
case MOUSE_WHEELED: printf( "mouse wheeled " ); EarseTail(); break;
}
ShowControlKeyState( mer.dwControlKeyState );
}
void ShowKeyInfo( KEY_EVENT_RECORD& ker )
{
SetTextAttrib( FOREGROUND_BLUE/*|FOREGROUND_GREEN*/|FOREGROUND_RED | FOREGROUND_INTENSITY );
printf( "KeyDown: %c , Repeat Count: %d", ker.bKeyDown?'T':'F', ker.wRepeatCount ); EarseTail();
printf( "VirtualKeyCode: %02X, wVirtualScanCode: %02X", ker.wVirtualKeyCode, ker.wVirtualScanCode ); EarseTail();
printf( "AsciiChar: %c", ker.uChar.AsciiChar ); EarseTail();
ShowControlKeyState( ker.dwControlKeyState );
}
int main( )
{
// quit ctrl
SetConsoleCtrlHandler( &csl_handler_routine, TRUE );
// set window title
::SetConsoleTitle( TEXT("Test") );
// get begin line number
CONSOLE_SCREEN_BUFFER_INFO sinfo;
::GetConsoleScreenBufferInfo( hOutput_, &sinfo );
baselinenum = sinfo.dwCursorPosition.Y;
// hide cursor
CONSOLE_CURSOR_INFO cinfo;
::GetConsoleCursorInfo( hOutput_, &cinfo );
cinfo.bVisible = FALSE;
::SetConsoleCursorInfo( hOutput_, &cinfo );
// set window size
SMALL_RECT winsize = { 0, 0, dwSize.X-1, dwSize.Y-1 };
::SetConsoleWindowInfo( hOutput_, TRUE, &winsize );
::SetConsoleScreenBufferSize( hOutput_, dwSize );
// enable mouse & window
DWORD mode;
::GetConsoleMode( hInput_, &mode );
mode |= ( ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT );
::SetConsoleMode( hInput_, mode );
// get mouse & key
INPUT_RECORD ir;
DWORD index = 1;
for( DWORD n; ReadConsoleInput(hInput_,&ir,1,&n); ++index )
{
SetCursorPosition( 0, 0);
printf( "%d", index ); EarseTail();
switch( ir.EventType )
{
case MOUSE_EVENT:
ShowMouseInfo( ir.Event.MouseEvent );
break;
case KEY_EVENT:
ShowKeyInfo( ir.Event.KeyEvent );
break;
}
}
// release resource
// restore console setting
return 0;
}