2012-08-03 14 views
0

有时我需要在屏幕上的位置(例如:第10列和第20行)写东西。我在网上搜索,发现它使用Windows处理程序使用windows.h完成。,在不使用窗口句柄的情况下更改光标位置。 Qbasic模仿缓慢

是的,使用句柄很快但有点复杂,所以我编写了一个只使用printf(字符串)的类,并以适合屏幕的方式更改字符串,并且每个printf命令都填充整个80x24控制台屏幕。该类模仿QBasic的CLS,LOCATE x,y和PRINT命令。

问题:有没有一种更简单的方法来达到屏幕上的任何位置,并把一个字符或点(绘图),而不使用窗口句柄或像我这样的缓慢的类?

here is sample output:

我的QBASIC类是这么慢,我可以用它每秒只有几次。 VC++ 10.0 windows XP

谢谢你的时间。

这是我的阶级和一些例子:

// print_test.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
class QBASIC 
{ 
public: 
QBASIC() 
{ 
    for(int i=0;i<(80*23);i++) 
    { 
     default_fill[i]=' '; 
     current_fill[i]=' '; 
    } 
    default_fill[80*23]=NULL; 
    current_fill[80*23]=NULL; 
    row=0; 
    column=0; 
    window_number=0; 

} 
void locate(int x,int y) 
{ 
    row=y; 
    column=x; 
    return; 
} 
void print(char* text) 
{ 
    int length=strlen(text); 
    for(int i=0;i<length;i++) 
    { 
     current_fill[row*80+column+i]=text[i]; 
    } 
    row++; 
    column=0; 
    printf("%s",current_fill); 

    return; 
} 
void cls() 
{ 
    for(int i=0;i<(80*24);i++) 
    { 
     current_fill[i]=default_fill[i]; 
    } 
    column=0; 
    row=0; 
    printf("%s",current_fill); 

} 
void window(int x1,int y1,int x2,int y2,char*text,int id) 
{ 
    //178 wall code 
    window_buffer[window_number]=new unsigned char[1000]; 
    window_number++; 
    for(int i=x1;i<(x2+1);i++) 
    { 
     current_fill[i+80*y1]=178; 
     current_fill[i+80*y2]=178; 

    } 
    for(int j=y1;j<(y2+1);j++) 
    { 
     current_fill[x1+80*j]=178; 
     current_fill[x2+80*j]=178; 

    } 
    int length=strlen(text);int temp_row=0;int temp_column=0; 
    for(int i=0;i<length;i++) 
    { 
     if(current_fill[(x1+1+temp_column)+(y1+1+temp_row)*80+i]!=178) 
     { 
     current_fill[(x1+1+temp_column)+(y1+1+temp_row)*80+i]=text[i]; 
     } 
     else 
     { 
      temp_row++; 
      temp_column=-i; 
      current_fill[(x1+1+temp_column)+(y1+1+temp_row)*80+i]=text[i]; 

     } 

    } 
    printf("%s",current_fill); 
    return; 
} 
private: 
unsigned char default_fill[80*23+1000]; 
unsigned char current_fill[80*23+1000]; 
int row,column; 
unsigned char *window_buffer[10];//max windows number=10 
int window_number; 

}; 

int main() 
{ 
QBASIC *mimic=new QBASIC(); 
mimic->cls(); 
mimic->locate(25,10); 
mimic->print("x <--here is 26th column and 11th row"); 

mimic->locate(5,4); 
mimic->print("x <--here is 6th column and 5th row"); 

mimic->locate(0,0); 
mimic->print("x <--here is origin"); 


mimic->print("x <--here is sequantial print after"); 
mimic->print("x <--here is another"); 
int window_id_1=0,window_id_2=1; 
mimic->window(20,5,28,9,"this is a window",window_id_1); 
mimic->window(10,18,70,22,"this is another window from 10,18 to 70,22",window_id_2); 


delete mimic; 


getchar();// waiting to see the screen before exiting. press enter to continue 
return 0; 
} 

我认为世界上没有其他的解决方案。

+0

是不是有人知道qbasic或一些简单的绘图命令在c + +? – 2012-08-04 12:46:59

回答

0

好的,我会继续使用句柄。

void LOCATE(int x, int y) 
{ 
    COORD newPosition = { x, y }; 
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleCursorPosition(h, newPosition); 
} 
+1

你没有使用'GetConsoleScreenBufferInfo'返回的任何数据。只需创建一个'COORD'变量并将其填入自己(如我的编辑所示)。这应该解决你的“有点复杂”的投诉。 – 2012-08-04 12:58:32

+0

好的谢谢。这是好多了 – 2012-08-04 13:02:22

+0

你也知道我怎么能在VC++ 10.0或Digital Mars 4中使用Turbo-C的graphics.h? – 2012-08-04 13:04:18

相关问题