论坛登陆 用户: 密码:
联系我们
设为首页
加入收藏
业界新闻 网络编程 程序开发 网页图象 聊天通讯 软件应用 网络安全 硬件学堂 教育频道 站长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:54     来源:易特网络技术   编辑:黑鹰  点击:


  十、读取鼠标信息

  与读取键盘信息方法相似,鼠标信息也是通过readconsoleinput来获取的,其mouse_event_record具有下列定义:

typedef struct _mouse_event_record {
 coord dwmouseposition; // 当前鼠标位置
 dword dwbuttonstate; // 鼠标按钮状态
 dword dwcontrolkeystate; // 键盘控制键状态
 dword dweventflags; // 事件状态
} mouse_event_record;

  其中,dwbuttonstate反映了用户按下鼠标按钮的情况,它可以是:from_left_1st_button_pressed(最左边按钮)、rightmost_button_pressed(最右边按钮)、from_left_2nd_button_pressed(左起第二个按钮)、from_left_3rd_button_pressed(左起第三个按钮)和from_left_4th_button_pressed (左起第四个按钮)。而dweventflags表示鼠标的事件,如double_click(双击)、mouse_moved(移动)和mouse_wheeled(滚轮滚动,只适用于windows 2000/xp)。dwcontrolkeystate的含义同前。

  下面举一个例子。这个例子能把鼠标的当前位置显示在控制台窗口的最后一行上,若单击鼠标左键,则在当前位置处写一个字符‘a’,若双击鼠标任一按钮,则程序终止。具体代码如下:

#include <windows.h>
#include <stdio.h>
#include <string.h>
handle hout;
handle hin;
void clearscreen(void);
void dispmousepos(coord pos); // 在最后一行显示鼠标位置
void main()
{
 hout = getstdhandle(std_output_handle); // 获取标准输出设备句柄
 hin = getstdhandle(std_input_handle); // 获取标准输入设备句柄
 word att = foreground_red | foreground_green | foreground_intensity |  
       background_blue ;
 // 背景是蓝色,文本颜色是黄色
 setconsoletextattribute(hout, att);
 clearscreen(); // 清屏
 input_record mouserec;
 dword state = 0, res;
 coord pos = {0, 0};
 for(;;) // 循环
 {
  readconsoleinput(hin, &mouserec, 1, &res);
  if (mouserec.eventtype == mouse_event){
   if (mouserec.event.mouseevent.dweventflags == double_click) break;
    // 双击鼠标退出循环
    pos = mouserec.event.mouseevent.dwmouseposition;
    dispmousepos(pos);
    if (mouserec.event.mouseevent.dwbuttonstate == from_left_1st_button_pressed)
          fillconsoleoutputcharacter(hout, 'a', 1, pos, null);
   }
  }
  pos.x = 0; pos.y = 0;
  setconsolecursorposition(hout, pos); // 设置光标位置
  closehandle(hout); // 关闭标准输出设备句柄
  closehandle(hin); // 关闭标准输入设备句柄
 }

void dispmousepos(coord pos) // 在最后一行显示鼠标位置
{
 console_screen_buffer_info binfo;
 getconsolescreenbufferinfo( hout, &binfo );
 coord home = {0, binfo.dwsize.y-1};
 word att0 = background_intensity ;
 fillconsoleoutputattribute(hout, att0, binfo.dwsize.x, home, null);
 fillconsoleoutputcharacter(hout, ' ', binfo.dwsize.x, home, null);
 char s[20];
 sprintf(s,"x = %2lu, y = %2lu",pos.x, pos.y);
 setconsoletextattribute(hout, att0);
 setconsolecursorposition(hout, home);
 writeconsole(hout, s, strlen(s), null, null);
 setconsoletextattribute(hout, binfo.wattributes); // 恢复原来的属性
 setconsolecursorposition(hout, binfo.dwcursorposition); // 恢复原来的光标位置
}

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

  程序运行结果如下:
 

  十一、结语

  综上所述,利用控制台窗口的widows api函数可以设计简洁美观的文本界面,使得用visual c++ 6.0开发环境深入学习c++以及文本界面设计成为一件比较容易的事件。当然文本界面的设计还需要一定的方法和技巧,限于篇幅,这里不再阐述。
 
上一篇:控制台窗口界面的编程控制(五)
下一篇:用builder c++设计串行口com1或com2的读写操作
[发送给好友] [打印本页] [关闭窗口] [返回顶部转载请注明来源:http://www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 黑鹰 投稿作者: 易特网络
信息来源: 易特网络技术 录入时间: 2005-7-18 9:13:54
浏览次数: 投稿信箱: shtghy@163.com
设置首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights ©2004-2005 iyit.net all rights reserved. 网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息