分享
 
 
 

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

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

十、读取鼠标信息

与读取键盘信息方法相似,鼠标信息也是通过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++以及文本界面设计成为一件比较轻易的事件。当然文本界面的设计还需要一定的方法和技巧,限于篇幅,这里不再阐述。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有