论坛登陆 用户: 密码:
联系我们
设为首页
加入收藏
业界新闻 网络编程 程序开发 网页图象 聊天通讯 软件应用 网络安全 硬件学堂 教育频道 站长club
  ·推荐新闻
 
·美前任官员认为amd告倒英特
·搜索引擎关键字排行简介
·网站优化教程(一)
·msn近期遭受木马病毒骚扰 用
·用qq管理你的系统^_^ 
·测评中心金山毒霸联合发布7
·qq群聊实名 普通用户不受影
·雅虎思科联手推数字邮件签名
·这18条背下来没人敢和你忽悠
·自己动手,拯救丢失的硬盘数
  ·资料搜索
 
  ·相关文章
·深度探索c++对象模型(完结篇)
·深度探索c++对象模型(10)
·深度探索c++对象模型(9)
·深度探索c++对象模型(8)
·深度探索c++对象模型(7)
·深度探索c++对象模型(6)
·深度探索c++对象模型(5)
·深度探索c++对象模型(4)
·深度探索c++对象模型(3)
·深度探索c++对象模型(2)
  ·热门新闻
首页>>程序开发>>c/c++区>>文章正文

控制台窗口界面的编程控制(四)


 日期:2005-7-18 9:13:48     来源:易特网络技术   编辑:黑鹰  点击:

  七、滚动和移动

  scrollconsolescreenbuffer是实现文本区滚动和移动的api函数。它可以将指定的一块文本区域移动到另一个区域,被移空的那块区域由指定字符填充。函数的原型如下:

bool scrollconsolescreenbuffer(
  handle hconsoleoutput, // 句柄
  const small_rect* lpscrollrectangle, // 要滚动或移动的区域
  const small_rect* lpcliprectangle, // 裁剪区域
  coord dwdestinationorigin, // 新的位置
  const char_info* lpfill // 填充字符
);

  利用这个api函数还可以实现删除指定行的操作。下面来举一个例子,程序如下:

#include
#include
#include
handle hout;
void deleteline(int row); // 删除一行
void movetext(int x, int y, small_rect rc); // 移动文本块区域
void clearscreen(void); // 清屏
void main()
{
 hout = getstdhandle(std_output_handle); // 获取标准输出设备句柄
 word att = foreground_red | foreground_green | foreground_intensity |   
       background_blue ;
 // 背景是蓝色,文本颜色是黄色
 setconsoletextattribute(hout, att);
 clearscreen();
 printf("\n\nthe soul selects her own society,\n");
 printf("then shuts the door;\n");
 printf("on her devine majority;\n");
 printf("obtrude no more.\n\n");
 console_screen_buffer_info binfo;
 getconsolescreenbufferinfo( hout, &binfo );
 coord endpos = {0, binfo.dwsize.y - 1};
 setconsolecursorposition(hout, endpos); // 设置光标位置
 small_rect rc = {0, 2, 40, 5};
 _getch();
 movetext(10, 5, rc);
 _getch();
 deleteline(5);
 closehandle(hout); // 关闭标准输出设备句柄
}

void deleteline(int row)
{
 small_rect rcscroll, rcclip;
 coord crdest = {0, row - 1};
 char_info chfill;
 console_screen_buffer_info binfo;
 getconsolescreenbufferinfo( hout, &binfo );
 rcscroll.left = 0;
 rcscroll.top = row;
 rcscroll.right = binfo.dwsize.x - 1;
 rcscroll.bottom = binfo.dwsize.y - 1;
 rcclip = rcscroll;
 chfill.attributes = binfo.wattributes;
 chfill.char.asciichar = ' ';
 scrollconsolescreenbuffer(hout, &rcscroll, &rcclip, crdest, &chfill);
}

void movetext(int x, int y, small_rect rc)
{
 coord crdest = {x, y};
 char_info chfill;
 console_screen_buffer_info binfo;
 getconsolescreenbufferinfo( hout, &binfo );
 chfill.attributes = binfo.wattributes;
 chfill.char.asciichar = ' ';
 scrollconsolescreenbuffer(hout, &rc, null, crdest, &chfill);
}

void clearscreen(void)
{
 console_screen_buffer_info binfo;
 getconsolescreenbufferinfo( hout, &binfo );
 coord home = {0, 0};
 word att = binfo.wattributes;
 unsigned long size = binfo.dwsize.x * binfo.dwsize.y;
 fillconsoleoutputattribute(hout, att, size, home, null);
 fillconsoleoutputcharacter(hout, ' ', size, home, null);
}

  程序中,实现删除行的操作deleteline的基本原理是:首先将裁剪区域和移动区域都设置成指定行row(包括该行)以下的控制台窗口区域,然后将移动的位置指定为(0, row-1)。这样,超出裁剪区域的内容被裁剪掉,从而达到删除行的目的。

  需要说明的是,若裁剪区域参数为null,则裁剪区域为整个控制台窗口。
 
上一篇:控制台窗口界面的编程控制(三)
下一篇:控制台窗口界面的编程控制(五)
[发送给好友] [打印本页] [关闭窗口] [返回顶部转载请注明来源:http://www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 黑鹰 投稿作者: 易特网络
信息来源: 易特网络技术 录入时间: 2005-7-18 9:13:48
浏览次数: 投稿信箱: shtghy@163.com
设置首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights ©2004-2005 iyit.net all rights reserved. 网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息