首页
社区
课程
招聘
如何打造一个自己的控制台窗口
发表于: 2005-6-7 05:05 14029

如何打造一个自己的控制台窗口

2005-6-7 05:05
14029
我想做一个控制台窗口,把最低下一行留出来做输入命令,其余的用作输出显示
我用文本描画一下
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&                                                                           &
&                                                                           &
&                                                                           &
2004-11-21  19:04    <DIR>          .                                       &
2004-11-21  19:04    <DIR>          ..                                      &
2004-11-21  18:33    <DIR>          「开始」菜单                            &
2004-11-21  19:04    <DIR>          My Documents                            &
2004-11-21  19:04    <DIR>          Favorites                               &
2004-11-21  18:33    <DIR>          桌面                                    &
2005-04-04  16:26             5,283 Unit1.obj                               &
2005-04-04  16:26           393,216 Unit1.tds                               &
2005-05-26  20:06                 0 sys.py                                  &
2005-04-04  16:26            50,176 Unit1.exe                               &
&                                                                           &
&---------------------------------------------------------------------------&
&>>>c       CD  CHDIR  CMD  CLS                                             &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

假如"&"表示边框,最低下一行就是用来输入命令的,如果我输入c 就让他在后面自动提示出所有
C开头的命令,继续输入“H”,则只提示 CHDIR, 若此时敲空格键,则自动输入CHDIR命令
用过TRW或者SI的朋友应该能明白我的意思,任何答复都是受欢迎的。

我现在的难点是:
1  不知道如何及时高效的响应按键
2  不知道如何专门留出一行来用作输入,上面的其他行专门用作输出,二者互不干扰
就好像是在一个GUI的Window的最底下摆放一个Edit控件一样

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
2
1。有专用的函数。自己查TC的帮助文档吧,我记得是boiskey()。
2。定位写屏,类似windows下面的画板。
2005-6-7 09:23
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
3
如果输出是纯文本的就容易的多。在上面开个窗口就可以了。
把光标定位到下面你要读取输入的地方等待输入就可以了。
2005-6-7 11:23
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
作者周星星blog:
http://blog.vckbase.com/bruceteen
源代码:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

class Console
{
public:
    Console()
    {
        hStdOutput = INVALID_HANDLE_VALUE;
        hStdError  = INVALID_HANDLE_VALUE;
    }
    bool Open( void )
    {
        hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE );
        hStdError  = GetStdHandle( STD_ERROR_HANDLE  );
        return INVALID_HANDLE_VALUE!=hStdOutput && INVALID_HANDLE_VALUE!=hStdError;
    }
    inline bool SetTitle( char* title ) // 设置标题
    {
        return TRUE==SetConsoleTitle(title);
    }
    bool RemoveCursor( void )      // 去处光标
    {
        CONSOLE_CURSOR_INFO cci;
        if( !GetConsoleCursorInfo( hStdOutput, &cci ) ) return false;
        cci.bVisible = false;
        if( !SetConsoleCursorInfo( hStdOutput, &cci ) ) return false;
        if( !GetConsoleCursorInfo( hStdError,  &cci ) ) return false;
        cci.bVisible = false;
        if( !SetConsoleCursorInfo( hStdError,  &cci ) ) return false;
        return true;
    }
    bool SetWindowRect( short x, short y ) // 设置窗体尺寸
    {
        SMALL_RECT wrt = { 0, 0, x, y };
        if( !SetConsoleWindowInfo( hStdOutput, TRUE, &wrt ) ) return false;
        if( !SetConsoleWindowInfo( hStdError,  TRUE, &wrt ) ) return false;
        return true;
    }
    bool SetBufSize( short x, short y ) // 设置缓冲尺寸
    {
        COORD coord = { x, y };
        if( !SetConsoleScreenBufferSize( hStdOutput, coord ) ) return false;
        if( !SetConsoleScreenBufferSize( hStdError,  coord ) ) return false;
        return true;
    }

    bool GotoXY( short x, short y ) // 移动光标
    {
        COORD coord = { x, y };
        if( !SetConsoleCursorPosition( hStdOutput, coord ) ) return false;
        if( !SetConsoleCursorPosition( hStdError,  coord ) ) return false;
        return true;
    }
    bool SetColor( WORD color ) // 设置前景色/背景色
    {
        if( !SetConsoleTextAttribute( hStdOutput, color ) ) return false;
        if( !SetConsoleTextAttribute( hStdError,  color ) ) return false;
        return true;
    }
    bool OutputString( const char* pstr, size_t len=0 ) // 输出字符串
    {
        DWORD n = 0;
        return TRUE==WriteConsole( hStdOutput, pstr, len?len:strlen(pstr), &n, NULL );
    }

    bool OutputStringNoMove( short x, short y, const char* pstr, size_t len=0 ) // 输出字符串
    {
        COORD coord = { x, y };
        DWORD n = 0;
        return TRUE==WriteConsoleOutputCharacter( hStdOutput, pstr, len?len:strlen(pstr), coord, &n );
    }
private:
    HANDLE hStdOutput;
    HANDLE hStdError;
};

const char bg[] =
    "┏━━━━━━━━━━━┓            "
    "┃■■■■■■■■■■■┃ ←↓→   ↑"
    "┃■■■■■■■■■■■┃ Begin      "
    "┃■■■■■■■■■■■┃ Voice = Yes"
    "┃■■■■■■■■■■■┃ Sleep      "
    "┃■■■■■■■■■■■┃ Quit       "
    "┃■■■■■■■■■■■┃            "
    "┃■■■■■■■■■■■┃            "
    "┃■■■■■■■■■■■┃ NEXT   "
    "┃■■■■■■■■■■■┃┏━━━━┓"
    "┃■■■■■■■■■■■┃┃    ┃"
    "┃■■■■■■■■■■■┃┃    ┃"
    "┃■■■■■■■■■■■┃┗━━━━┛"
    "┃■■■■■■■■■■■┃ LEVEL "
    "┃■■■■■■■■■■■┃┏━━━━┓"
    "┃■■■■■■■■■■■┃┃       0┃"
    "┃■■■■■■■■■■■┃┗━━━━┛"
    "┃■■■■■■■■■■■┃ SCORE "
    "┃■■■■■■■■■■■┃┏━━━━┓"
    "┃■■■■■■■■■■■┃┃   00000┃"
    "┗━━━━━━━━━━━┛┗━━━━┛";

const char bk[7][4][4][4] =
{
    {
        { { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } },
        { { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,0,0 },{ 0,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 0,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,1,0 },{ 1,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } },
        { { 0,0,1,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,1,0 },{ 0,0,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 0,1,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } },
        { { 1,1,1,0 },{ 0,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } }
    }
    ,
    {
        { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } },
        { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },
        { { 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } }
    }
};

const WORD COLOR_A = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY; // 运动中的颜色
const WORD COLOR_B = FOREGROUND_GREEN;                                     // 固定不动的颜色
const WORD COLOR_C = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE;      // 空白处的颜色

bool voice = true;
int score = 0, level = 0;
char data[19][11] = { 0 };
int next = -1;
int x=4, y=-2, c=-1, z=0; // x坐标,坐标,当前方块,方向

Console csl; // 定义控制台对象

void VoiceBeep( void )
{
    if( voice )
        Beep( 1760, 10 );
}

void DrawScoreLevel( void ) // 绘制得分
{
    char tmp[6];
    sprintf( tmp, "%05d", score );
    csl.OutputStringNoMove( 31, 19, tmp, 5 );
    sprintf( tmp, "%1d", level );
    csl.OutputStringNoMove( 35, 15, tmp, 1 );
}

void DrawVoice( void )
{
    csl.OutputStringNoMove( 35, 3, voice?"Yes":"No " );
}

void DrawNext( void )  // 绘制 "next框" 中的图形
{
    for( int i=0; i<2; ++i )
    {
        for( int j=0; j<4; ++j )
        {
            csl.OutputStringNoMove( 28+j*2, 10+i, bk[next][0][i][j]==0?" ":"■", 2 );
        }
    }
}

void DrawOver( void )  // 游戏结束
{
    csl.OutputStringNoMove( 28, 10, "GAME" );
    csl.OutputStringNoMove( 28, 11, "OVER" );
}

void Draw( WORD color )
{
    for( int i=0; i<4; ++i )
    {
        if( y+i<0 || y+i>= 19 ) continue;
        for( int j=0; j<4; ++j )
        {
            if( bk[c][z][i][j] == 1 )
            {
                csl.SetColor( color );
                csl.GotoXY( 2+x*2+j*2, 1+y+i );
                csl.OutputString( "■", 2 );
            }
        }
    }
}

bool IsFit( int x, int y, int c, int z ) // 给定的x,y,c,z是否可行
{
    for( int i=0; i<4; ++i )
    {
        for( int j=0; j<4; ++j )
        {
            if( bk[c][z][i][j]==1 )
            {
                if( y+i < 0 ) continue;
                if( y+i>=19 || x+j<0 || x+j>=11 || data[y+i][x+j]==1 ) return false;
            }
        }
    }
    return true;
}

void RemoveRow( void ) // 消行
{
    const char FULLLINE[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
    int linecount = 0;
    for( int i=0; i<19; ++i )
    {
        if( 0 == memcmp( data[i], FULLLINE, 11 ) )
        {
            ++linecount;
            for( int m=0; m<11; ++m )
            {
                for( int n=i; n>1; --n )
                {
                    data[n][m] = data[n-1][m];

                    csl.SetColor( data[n][m]==1?COLOR_B:COLOR_C );
                    csl.GotoXY( 2+m*2, 1+n );
                    csl.OutputString( "■", 2 );
                }
                data[0][m] = 0;
                csl.OutputStringNoMove( 2+m*2, 1, "■", 2 );
            }
        }
    }
    char data[19][11] = { 0 };

    if( linecount == 0 ) return;
    int _score = 0;
    switch( linecount )
    {
    case 1: _score =  100; break;
    case 2: _score =  300; break;
    case 3: _score =  700; break;
    case 4: _score = 1500;break;
    }
    score += _score;
    if( score > 99999 ) score = 99999;
    level = score/10000;
    DrawScoreLevel();
}

void MoveTrans( void )  // 逆时针翻转
{
    if( IsFit( x, y, c, (z+1)%4 ) )
    {
        VoiceBeep();
        Draw( COLOR_C );
        z=(z+1)%4;
        Draw( COLOR_A );
    }
}

void MoveLeft( void )    // 向左移
{
    if( IsFit( x-1, y, c, z ) )
    {
        VoiceBeep();
        Draw( COLOR_C );
        --x;
        Draw( COLOR_A );
    }
}

void MoveRight( void )  // 向右移
{
    if( IsFit( x+1, y, c, z ) )
    {
        VoiceBeep();
        Draw( COLOR_C );
        ++x;
        Draw( COLOR_A );
    }
}

void MoveDown( void )   // 向下移
{
    if( IsFit( x, y+1, c, z ) )
    {
        VoiceBeep();
        Draw( COLOR_C );
        ++y;
        Draw( COLOR_A );
    }
    else if( y != -2 ) // 触底
    {
        Draw( COLOR_B );

        for( int i=0; i<4; ++i )
        {
            if( y+i<0 ) continue;
            for( int j=0; j<4; ++j )
            {
                if( bk[c][z][i][j] == 1 )
                {
                    data[y+i][x+j] = 1;
                }
            }
        }

        RemoveRow();

        x=4, y=-2, c=next, z=0;
        next = rand()%7;
        DrawNext();
    }
    else // 游戏结束
    {
        DrawOver();
    }
}

void MessageDeal( void )
{
    int cycle = 9 - level;
    for( ; ; )
    {
        for( int i=0; i<cycle; ++i )
        {
            if( _kbhit() )
            {
                switch( _getch() )
                {
                case 'Q':
                case 'q': // 退出
                    return;
                    break;
                case 'S': // 暂停
                case 's':
                    for( ; ; )
                    {
                        switch( _getch() )
                        {
                        case 'Q':
                        case 'q': // 退出
                            return;
                        case 'V': // 声音
                        case 'v':
                            voice = !voice;
                            DrawVoice();
                            break;
                        case 'S':
                        case 's':
                            goto LABLE_CONTINUE;
                            break;
                        }
                    }
                    LABLE_CONTINUE:
                    break;
                case 'V': // 声音
                case 'v':
                    voice = !voice;
                    DrawVoice();
                    break;
                case 0xe0: // ←↓→  ↑
                    switch( _getch() )
                    {
                    case 0x4B: // ←
                        MoveLeft();
                        break;
                    case 0x50: // ↓
                        MoveDown();
                        break;
                    case 0x4d: // →
                        MoveRight();
                        break; // ↑ 变形
                    case 0x48:
                        MoveTrans();
                    default:
                        break;
                    }
                    break;
                default:
                    break;
                }
            }

            Sleep( 55 );
        }
        MoveDown();
    }
}

int main()
{
    csl.Open();
    // 设置标题
    csl.SetTitle( "俄罗斯方块 alpha" );
    // 去处光标
    csl.RemoveCursor();
    // 设置窗体尺寸
    csl.SetWindowRect( 38-1, 21-1 );
    // 设置缓冲尺寸
    csl.SetBufSize( 38, 21 );
    // 输出背景字符
    csl.OutputStringNoMove( 0,0,bg );
    // 设置随机种子
    srand( time(0) );

    next = rand()%7;
    DrawNext();
    {
    for( char c = (char)_getch(); c!='B'&&c!='b'; c=(char)_getch() ) // 开始 Begin
    {
        if( c=='V' || c=='v' ) // 铃声 Vocie
        {
            if( voice )
            {
                voice = false;
                csl.OutputStringNoMove( 35, 3, "No " );
            }
            else
            {
                voice = true;
                csl.OutputStringNoMove( 35, 3, "Yes" );
            }
        }
    }
    }
    x=4, y=-2, c=next, z=0;
    next = rand()%7;
    DrawNext();

    MessageDeal();
    return 0;
}
2005-6-7 11:59
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
5
我试过了,效果不错。
可以直接在CONSOLE环境下编译使用

大概就下面这些(楼主自己选一些,应该可以实现的):
Following are the functions used to access a console.

AllocConsole
CreateConsoleScreenBuffer
FillConsoleOutputAttribute
FillConsoleOutputCharacter
FlushConsoleInputBuffer
FreeConsole
GenerateConsoleCtrlEvent
GetConsoleCP
GetConsoleCursorInfo
GetConsoleMode
GetConsoleOutputCP
GetConsoleScreenBufferInfo
GetConsoleTitle
GetLargestConsoleWindowSize
GetNumberOfConsoleInputEvents
GetNumberOfConsoleMouseButtons
GetStdHandle
HandlerRoutine
PeekConsoleInput
ReadConsole
ReadConsoleInput
ReadConsoleOutput
ReadConsoleOutputAttribute
ReadConsoleOutputCharacter
ScrollConsoleScreenBuffer
SetConsoleActiveScreenBuffer
SetConsoleCP
SetConsoleCtrlHandler
SetConsoleCursorInfo
SetConsoleCursorPosition
SetConsoleMode
SetConsoleOutputCP
SetConsoleScreenBufferSize
SetConsoleTextAttribute
SetConsoleTitle
SetConsoleWindowInfo
SetStdHandle
WriteConsole
WriteConsoleInput
WriteConsoleOutput
WriteConsoleOutputAttribute
WriteConsoleOutputCharacter
2005-6-7 12:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
非常感谢北极星2003 ^_^
2005-6-7 16:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不过我测试的时候4个方向键都不管用
case 0xe0: // ←↓→  ↑  //为什么是0xE0?
                    switch( _getch() )
                    {
                    case 0x4B: // ←  为什么是0x4B?
                        MoveLeft();
                        break;
                    case 0x50: // ↓
                        MoveDown();
                        break;
                    case 0x4d: // →
                        MoveRight();
                        break; // ↑ 变形
                    case 0x48:
                        MoveTrans();
                    default:
2005-6-7 16:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
呵呵,明白很多了,不过还有一个比较困难的问题,如何在控制台窗口中再创建一个子窗口,而不是两个控制台窗口,用过TC的朋友都知道在TC中打开Help菜单就会弹出一个子窗口来显示帮助内容,
我这个要求比较特殊,就是子窗口在前端先后,控制台窗口在后台不停的滚动刷新内容而且不能影响到前端子窗口
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&                                                                           &
&                                                                           &
&                                                                           &
2004-11-21  19:04    <DIR>          .                                       &
2004-11-21  19:04    <DIR>          ..                                      &
2004-11-21  18:33    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                    &
2004-11-21  19:04    &                                 &                    &
2004-11-21  19:04    &     This is a ChildWindow       &                    &
2004-11-21  18:33    &                                 &                    &
2005-04-04  16:26    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                    &
2005-04-04  16:26           393,216 Unit1.tds                               &
2005-05-26  20:06                 0 sys.py                                  &
2005-04-04  16:26            50,176 Unit1.exe                               &
&                                                                           &
&---------------------------------------------------------------------------&
&>>>c       CD  CHDIR  CMD  CLS                                             &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2005-6-7 17:38
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
9
最初由 huoshan 发布
不过我测试的时候4个方向键都不管用
case 0xe0: // ←↓→ ↑ //为什么是0xE0?
switch( _getch() )
{
case 0x4B: // ← 为什么是0x4B?
........


我的方向键可以呀,你用的是哪个版本的VC?

关于控制台程序,因为不常用,还真不太知道,可以参考一下MSDN:

http://msdn.microsoft.com/library/en-us/dllproc/base/character_mode_applications.asp

不过我觉得不用这些API,就用以前的DOS功能调用的方法也应该能办到.不然以前的DOS程序是怎么写的呢,呵呵
2005-6-7 17:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我是在BCB下面调试运行的,我的要把case 0xE0去掉了才能响应方向键
呵呵,其实这些用GUI很容易实现,不过我这人比较变态,就喜欢钻死角,大家见谅
2005-6-7 17:48
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
11
我这个要求比较特殊,就是子窗口在前端先后,控制台窗口在后台不停的滚动刷新内容而且不能影响到前端子窗口

这个挺困难的吧。
我没用过BCB,也不你出现的情况是为什么了
在VC 6.0下可以正常使用的
2005-6-8 09:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
子窗口的问题还没解决,大家继续帮忙
2005-6-9 18:27
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
13
其实你所说的子窗口就是通过不断刷新来实现的。

在后台该干什么干什么,只需要在最后重新把子窗体画上去就可以了
2005-6-10 09:38
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
14
最初由 monkeycz 发布
其实你所说的子窗口就是通过不断刷新来实现的。

在后台该干什么干什么,只需要在最后重新把子窗体画上去就可以了


这样的话屏幕不会产生抖动吗?
“最后时刻”是那一个时刻啊
2005-6-10 23:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
最初由 monkeycz 发布
其实你所说的子窗口就是通过不断刷新来实现的。

在后台该干什么干什么,只需要在最后重新把子窗体画上去就可以了


说了等于没说,你这版主回答问题不负责任
2005-6-11 00:35
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
16
最初由 huoshan 发布


说了等于没说,你这版主回答问题不负责任


这位朋友,你有点急了。
可是不要这样从个人角度说别人。
每个人都有他的专长与不足
斑竹也一样,他也不是什么都知道
他说的话也是帮你出个注意,提供一种思路
最终取舍还是要靠你自己
如果是回答方式不好,只能说明他的经验不足
这个版块成立刚不久,我们每个人都需要热心来支持
这位朋友,你觉得我说的对吗?

我有重新看了前面朋友回复的帖子
看到3楼的ForEver是这样说的:
如果输出是纯文本的就容易的多。在上面开个窗口就可以了。
把光标定位到下面你要读取输入的地方等待输入就可以了。

感觉这位朋友应该知道怎么做,或许你可以向他请教一下。

最后一句话:论坛是交流的场所而不是存储答案的地方。
2005-6-11 06:42
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
17
最初由 北极星2003 发布


这样的话屏幕不会产生抖动吗?
“最后时刻”是那一个时刻啊

忘了缓冲区了么
2005-6-11 14:22
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
18
最初由 huoshan 发布


说了等于没说,你这版主回答问题不负责任

呵呵,我认为我说得已经很明白了,可能是我没有明白你的意思。

你可以把你想知道的问题核心再描述一遍,我看看是否我的理解有误。

下面的一组文章可能对你有所帮助
http://www.yesky.com/20020913/1630252.shtml
http://www.yesky.com/20020920/1631427.shtml
http://www.yesky.com/20020924/1632005.shtml
http://www.yesky.com/20020927/1632631.shtml
http://www.yesky.com/20020927/1632640.shtml
http://www.yesky.com/20021008/1633627.shtml
2005-6-11 14:34
0
雪    币: 233
活跃值: (43)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
网上有很多例子的。
2005-6-11 14:35
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
20
最初由 monkeycz 发布

忘了缓冲区了么




哎,有些东西光看是每没用的,没实践过总是不能把知识联系到一起
2005-6-11 15:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
因为我太想知道这个问题的解答方法,所以急了点
望monkeycz 版主不要放心上,特向您道歉
2005-6-13 02:28
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
22
最初由 huoshan 发布
因为我太想知道这个问题的解答方法,所以急了点
望monkeycz 版主不要放心上,特向您道歉

呵呵,不必在意
2005-6-13 09:41
0
游客
登录 | 注册 方可回帖
返回
//