C语言节制台窗口图形界面编程之八 鼠标事件
当前位置:以往代写 > C/C++ 教程 >C语言节制台窗口图形界面编程之八 鼠标事件
2019-06-13

C语言节制台窗口图形界面编程之八 鼠标事件

C语言节制台窗口图形界面编程之八 鼠标事件

上次讲的是键盘事件,这次我们先容鼠标事件。下面先先容下鼠标事件的布局体以及相关信息。

typedef struct _MOUSE_EVENT_RECORD      //鼠标事件布局体    
{    
    COORD dwMousePosition;      //当前鼠标在节制台窗口缓冲区的位置    
    DWORD dwButtonState;        //鼠标按键的状态    
    DWORD dwControlKeyState;    //节制键状态    
    DWORD dwEventFlags;         //鼠标事件范例    
} MOUSE_EVENT_RECORD;    
/*   
个中鼠标按键状态dwButtonState大概的值有   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
FROM_LEFT_1ST_BUTTON_PRESSED        最左边的鼠标键被按下      一般来说就是鼠标左键   
FROM_LEFT_2ND_BUTTON_PRESSED        左起第二个鼠标键被按下    一般来说是鼠标中键,就是滚轮键   
FROM_LEFT_3RD_BUTTON_PRESSED        左起第三个鼠标键被按下   
FROM_LEFT_4TH_BUTTON_PRESSED        左起第四个鼠标键被按下   
RIGHTMOST_BUTTON_PRESSED            最右边的鼠标键被按下      一般来说是鼠标右键   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
节制键状态dwControlKeyState与键盘事件的一样   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
ENHANCED_KEY        扩展键被按下    
LEFT_ALT_PRESSED    左Alt键被按下    
LEFT_CTRL_PRESSED   左Ctrl键被按下    
RIGHT_ALT_PRESSED   右Alt键被按下    
RIGHT_CTRL_PRESSED  右Ctrl键被按下    
NUMLOCK_ON          数字锁定被打开    
SCROLLLOCK_ON       转动锁定被打开    
CAPSLOCK_ON         大写锁定被打开    
SHIFT_PRESSED       Shift键被按下   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
鼠标事件范例dwEventFlags有以下几种   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
DOUBLE_CLICK            双击,第一击只作为普通按键事件,第二击才作为双击事件   
MOUSE_HWHEELED          程度鼠标滚轮移动   
MOUSE_MOVED             鼠标移动   
MOUSE_WHEELED           垂直鼠标滚轮移动   
0                       当鼠标有键被按下可能释放   
*/

本栏目

下面给一个样例措施,实此刻节制台窗口缓冲区的最下面一行显示当前鼠标在缓冲区的坐标,单击左键在当前鼠标位置输出字母A,单击右键则输出字母B,双击任何鼠标键退出的成果。措施如下:

#include <stdio.h>    
#include <windows.h>    
#include <conio.h>    
        
HANDLE handle_in;    
HANDLE handle_out;    
CONSOLE_SCREEN_BUFFER_INFO csbi;        //界说窗口缓冲区信息布局体    
        
void DisplayMousePosition(COORD pos);   //显示鼠标地址位置    
        
void gotoxy(int x, int y);  //将光标移到坐标为(x,y)的位置    
        
int main()    
{    
    handle_in = GetStdHandle(STD_INPUT_HANDLE);      //得到尺度输入设备句柄    
    handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //得到尺度输出设备句柄    
    INPUT_RECORD mouserec;      //界说输入事件布局体    
    DWORD res;      //用于存储读取记录    
    COORD pos;      //用于存储鼠标当前位置    
    COORD size = {80, 25};  //窗口缓冲区巨细    
    GetConsoleScreenBufferInfo(handle_out, &csbi);  //得到窗口缓冲区信息    
    SetConsoleScreenBufferSize(handle_out, size);   //配置窗口缓冲区巨细    
    for (;;)    
    {    
        ReadConsoleInput(handle_in, &mouserec, 1, &res);      //读取输入事件    
        pos = mouserec.Event.MouseEvent.dwMousePosition;    //获恰当前鼠标位置    
        gotoxy(0, 24);  //在第25行显示鼠标位置    
        DisplayMousePosition(pos);      //显示鼠标位置    
        if (mouserec.EventType == MOUSE_EVENT)    //假如当前为鼠标事件    
        {    
            gotoxy(pos.X, pos.Y);    
            //单击鼠标左键,输出字符A    
            if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)    
            {    
                putchar('A');    
            }    
            //单击鼠标右键,输出字符B    
            if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)    
            {    
                putchar('B');    
            }    
            //双击退出    
            if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)    
            {    
                break;    
            }    
        }    
    }    
    CloseHandle(handle_out);    
    CloseHandle(handle_in);    
    return 0;    
}    
        
void DisplayMousePosition(COORD pos)    
{    
    COORD dis = {0, 24};        //在第24行显示鼠标位置    
    WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文本属性    
    GetConsoleScreenBufferInfo(handle_out, &csbi);  //得到窗口缓冲区信息    
    printf("X = %3d, Y = %3d", (int)pos.X, (int)pos.Y);    
    FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL);  //填充文本属性    
    return;    
}    
        
void gotoxy(int x, int y)    
{    
    COORD pos = {x, y};    
    SetConsoleCursorPosition(handle_out, pos);    
}

附上用本措施写的Hello world!的图:C语言控制台窗口图形界面编程之八 鼠标事件

From:cnblogs 龙梦之痕

    关键字:

在线提交作业