国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

控制臺窗口界面的編程控制(六)

2019-11-17 05:15:12
字體:
供稿:網(wǎng)友

  十、讀取鼠標信息

  與讀取鍵盤信息方法相似,鼠標信息也是通過ReadConsoleInput來獲取的,其MOUSE_EVENT_RECORD具有下列定義:

typedef strUCt _MOUSE_EVENT_RECORD {
 COORD dwMousePosition; // 當前鼠標位置
 DWord dwButtonState; // 鼠標按鈕狀態(tài)
 DWORD dwControlKeyState; // 鍵盤控制鍵狀態(tài)
 DWORD dwEventFlags; // 事件狀態(tài)
} 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(;;) // 循環(huán)
 {
  ReadConsoleInput(hIn, &mouseRec, 1, &res);
  if (mouseRec.EventType == MOUSE_EVENT){
   if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) break;
    // 雙擊鼠標退出循環(huán)
    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函數(shù)可以設計簡潔美觀的文本界面,使得用Visual C++ 6.0開發(fā)環(huán)境深入學習C++以及文本界面設計成為一件比較輕易的事件。當然文本界面的設計還需要一定的方法和技巧,限于篇幅,這里不再闡述。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴青县| 祁东县| 松溪县| 乐陵市| 四平市| 成都市| 汝州市| 鸡泽县| 米易县| 阿合奇县| 嵊泗县| 莲花县| 兴业县| 新巴尔虎左旗| 涡阳县| 从江县| 营口市| 鄂托克前旗| 高陵县| 长治县| 康马县| 黄山市| 合川市| 沧州市| 溆浦县| 高阳县| 大冶市| 安阳县| 如皋市| 正宁县| 黔江区| 孝昌县| 西林县| 漠河县| 旬阳县| 洮南市| 通辽市| 利辛县| 高安市| 杨浦区| 松溪县|