青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用鏈接

留言簿(8)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

1、 問題闡述

      在很多情況下,程序員迫切需要取得一個按鍵的ASCII碼值,一些常用的字符的ASCII可以去記住它,比如‘A’,‘1’等,但是一些生僻的字符的ASCII,比如‘:’、‘+’等,就要去查ASCII碼表,擴展ASCII碼共有256個字符,查詢時浪費時間并且有時還會查詢錯誤。下面寫一個程序,程序在接受到某個按鍵消息時,將接受到按鍵的轉換為ASCII碼。

2、 實現技巧

      Windows程序是消息機制的,鍵盤在按某個鍵時,會產生一個按鍵消息,這個消息被操作系統獲得。程序的處理重點就是如何從操作系統捕獲這個消息,從這個消息的參數中解析出所需要的值。應用程序從Windows接收的關于鍵盤事件的消息稱為按鍵消息。

      按鍵消息,當按下一個鍵時,操作系統把WM_KEYDOWN或者WM_SYSDOWN消息放入消息隊列中,當釋放一個按鍵時,操作系統把WM_KEYUP或者WM_SYSDOWN消息放入消息隊列中。
      DOWN和UP這一組消息通常成對出現。如果按住某個鍵長時間不動,讓它重復產生相同的功能,操作系統將連續的WM_KEYDOWN或者WM_SYSDOWN送入應用程序的消息處理窗口。釋放該鍵的時候,操作系統將連續的WM_KEYUP或者WM_SYSDOWN送入應用程序的消息處理窗口。
      按鍵之間也是有時間間隔,通過調用GetMessageTime()獲取按鍵和釋放按鍵的時間間隔WM_SYSKEYDOWNWM_SYSKEYUP是一對系統鍵消息,類似地消息由系統自動處理,用戶無需去截獲。產生這種消息的按鍵多為組合鍵,比如Alt+F,Ctrl+S等。
      
      消息原型消息名:WM_KEYDOWN,參數nVirtKey=(int)wParam;  IKeyData=IParam;,
      消息名:WM_KEYUP,參數nVirtKey=(int)wParam;  IKeyData=IParam;,
      其中,參數wParam是虛擬鍵碼。這個值是由鍵盤驅動程序轉換掃描碼獲得的,它是與設備無關的,所以稱為虛擬鍵碼,大多數虛擬鍵碼的名稱在WINUSER.H表頭文件中都定義為VK_開頭的。
      注意,數字和字母的虛擬鍵碼是ASCII碼。
      
      Windows程序幾乎從不使用這些虛擬鍵碼,實際上,程序使用的是ASCII碼字符的字符消息。參數IParam參數則含有對了解按鍵非常有用的其他信息。
      IParam的32位分為6個字段,其中0~15表示重復計數,重復計數是該消息所表示的按鍵次數;16~23表示OEM掃描碼,它是由硬件產生的值;24表示擴充鍵標識25~28表示保留位29表示內容代碼
      按右鍵時,假如同時按下【Alt】鍵,那么內容代碼為1,對WM_SYSKEYUPWM_SYSKEYDOWN而言,此位總視為1,而對WM_SYSKEYUPWM_KEYDOWN消息而言,此位為0;
      30表示先前狀態,如果在此之前鍵是釋放的,則鍵的先前狀態為0,否則為1,
      對WM_KEYUP或者WM_SYSKEYUP消息,它總是設定為1,但是對WM_KEYDOWN或者WM_SYSKEYDOWN消息,此位可以為0,也可以為1,如果為1,則表示該鍵是自動重復功能所產生的第二個或者后續消息;31為表示轉換狀態,如果鍵正被按下,則轉換狀態為0,如果鍵正被釋放,則轉換狀態為1,對WM_KEYDOWN或者WM_SYSKEYDOWN消息,此字段為0,對WM_KEYUP或者WM_SYSKEYUP消息,此字段為1。

3、 實例代碼

      接下來將開始制作一個ASCII碼查詢器。首先利用VC++6.0向導建立一個基于MFC的對話框工程QueryASCII,在界面上放置兩個只讀的EDIT,其中一個用于接收字符的值,另外一個顯示相應的ASCII碼值,界面布局如下圖所示(關于如何建立MFC工程,可參考隨筆——在VC6下建立MFC工程圖解


①通過
class winzard(View菜單下)添加對話框的WM_KEYDOWN消息響應函數OnKeyDown,如下圖所示:


②通過
class winzard(View菜單下)添加對話框QueryASCII的虛繼承函數PreTranslateMessage,如下圖所示:


添加好后,分別在相應的函數里面添加相應的代碼,因為我也不是很懂,就寫了很多注釋,代碼如下:
/* 接受KEYDOWN消息 */
// 關于OnKeyDown函數請看注釋一
void CQueryASCIIDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    
// TODO: Add your message handler code here and/or call default
    CString strTemp;
    
char ch=nChar;
    strTemp.Format(
"%c",ch);    //關于Format的說明請看注釋二
    SetDlgItemText(IDC_CHAR_ED,strTemp);    //當程序運行時出現,IDC_CHAR_ED未定義的說明時,請看注釋三
    strTemp.Format("%0x",nChar);
    SetDlgItemText(IDC_ASCII_ED,strTemp);
    
// then do not forget to call baseclass, 下面的是回調函數
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);    //想獲得更多知識可看注釋四
}

/* 翻譯信息 */
// 關于PreTranslateMessage函數的解釋可看注釋五
BOOL CQueryASCIIDlg::PreTranslateMessage(MSG* pMsg) 
{
    
// TODO: Add your specialized code here and/or call the base class
    if(pMsg->message == WM_KEYDOWN)
    
//    pMsg->hwnd = m_hWnd;
    return CDialog::PreTranslateMessage(pMsg);
}

/* 注釋一 */
/*******************************************************************/
/* typedef UINT unsign int,占4個字節,即為無符號整型
/* nChar: Specifies the virtual key code of the given key. For a list
/* of of standard virtual key codes, see Winuser.h
/* 指定給定鍵的虛擬鍵碼。有關標準的虛擬鍵碼清單,可查看Winuser.h中
/* nRepCnt: Repeat count(the number of times the keystroke is repeated
/* as a result of the user holding down the key).     
/* 重復計數(當用戶按住了鍵,才會造成按鍵的數目重復)。
/* nFlags: Specifies the scan code, key-transition code, previous key
/* state, and context code
/* 指定掃描碼,關鍵過渡代碼,上一個鍵的狀態以及代碼的上下文
/******************************************************************
*/

/* 注釋二 */
/********************************************************************************/
/* Format(String, Object) 
/* 將指定的 String 中的格式項替換為指定的 Object 實例的值的文本等效項。
/*
/* Format(String, array<Object>[]()[]) 
/* 將指定 String 中的格式項替換為指定數組中相應 Object 實例的值的文本等效項。
/* 
/* Format(IFormatProvider, String, array<Object>[]()[]) 
/* 將指定 String 中的格式項替換為指定數組中相應 Object 實例的值的文本等效項。指定
/* 的參數提供區域性特定的格式設置信息。
/*
/* Format(String, Object, Object) 
/* 將指定的 String 中的格式項替換為兩個指定的 Object 實例的值的文本等效項。
/*
/* Format(String, Object, Object, Object) 
/* 將指定的 String 中的格式項替換為三個指定的 Object 實例的值的文本等效項 
/*******************************************************************************
*/

/* 注釋三 */
/********************************************************************************/
/* IDC_CHAR_ED和IDC_ASCII_ED指的是Edit Box的ID,只要右鍵單擊字符對應的Edit Box選中
/* Properties(屬性),General里的ID選項改為IDC_CHAR_ED即可。ASCII對應的Edit Box的
/* ID改為IDC_ASCII_ED即可。
/* SetDlgItemText是一個函數,設置對話框中控件的文本和標題。
/* 函數原型:
/* BOOL SetDlgltemText(HWND hDlg,int nlDDlgltem,LPCTSTR IpString);
/* 參數:
/* hDlg:指定含有控件的對話框。
/* nlDDlgltem:標識帶有將被設置的標題和文本的控制。
/* IpString:指向一個以NULL結尾的字符串指針,該字符串指針包含了將被復制到控制的文本。
/* 返回值:如果函數調用成功,則返回值為非零值。如果函數調用失敗,則返回值為零。
/* 若想獲得更多的錯誤信息,請調用GetLastError函數。
/******************************************************************************
*/

/* 注釋四 */
/*******************************************************************************/
/* 要用“回車鍵”,“左移光標健”,“右移光標健”,“上移光標健”,“下移光標健”
/* 這幾個鍵,你可以在這樣:   
/* switch(nChar)   
/* {   
/*   case vk_return:   
/*       //your   code   
/*   case   vk_right:   
/*       //your   code   
/*   case   vk_left:  
/*   case   vk_up:   
/*   case   vk_down:  
/* }   
/******************************************************************************
*/

/* 注釋五 */
/****************************************************************/
/* 函數原型:virtual BOOL PreTranslateMessage(MSG* pMsg);      
/* 功能:重載該函數可以實現窗口消息派發給窗口函數TranslateMessage()
/* 和DispatchMessage()之前的過濾。默認的實現是完成加速鍵的翻譯。
/* 因為您必須在你的重載版本中調用CWinApp:PreTranslateMessage()函數.
/* 在MFC中,PreTranslateMessage()是虛函數,我們可以重載它來處理鍵盤和鼠標消息。
/* 在SDK中,這又有所不同,我們必須在回調函數中
/* LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
/* 處理消息,它和PreTranslateMessage起的作用是類似的。只是MFC封裝的更好而已
/* 更多相關信息可查看隨筆:
http://m.shnenglu.com/kangnixi/archive/2010/02/17/107989.html
/***************************************************************
*/


我對代碼進行了修改和優化,如下所示
(未完,稍等)

想要獲得更多內容,可點擊:《Visual C++代碼參考與技巧大全》學習筆記——索引隨筆

posted on 2010-02-17 23:38 煙皚 閱讀(3209) 評論(2)  編輯 收藏 引用 所屬分類: 《Visual C++代碼參考與技巧大全》學習筆記

Feedback

# re: ASCII碼查詢器 2010-04-04 01:36 huangzongwu@hotmail.com
BOOL CQueryASCIIDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
// pMsg->hwnd = m_hWnd;
return CDialog::PreTranslateMessage(pMsg);
}

這個函數很明顯陷入死循環了,好好想想吧

  回復  更多評論
  

# re: ASCII碼查詢器 2012-09-12 10:16 侯云猛
??
  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            永久免费毛片在线播放不卡| 久久久久国色av免费看影院| 久久精品国产清自在天天线| 午夜精品久久久久久久蜜桃app | 亚洲综合欧美日韩| 亚洲午夜电影| 亚洲欧美日韩综合aⅴ视频| 午夜视频一区二区| 久久久久九九九九| 欧美va亚洲va日韩∨a综合色| 欧美国产激情二区三区| 亚洲激情视频在线播放| 亚洲经典自拍| 亚洲一区二区三区影院| 久久精品女人| 欧美日韩国产综合一区二区| 国产欧美日韩一区二区三区| 亚洲精品视频一区| 欧美伊人久久久久久午夜久久久久| 久久久久免费观看| 亚洲区一区二区三区| 先锋影音久久久| 欧美激情一区三区| 国内偷自视频区视频综合| 夜夜嗨av色一区二区不卡| 久久久精品国产99久久精品芒果| 亚洲国产精品专区久久| 午夜精品理论片| 欧美极品在线播放| 国产一区二区看久久| 一区二区精品国产| 蜜臀av性久久久久蜜臀aⅴ| 亚洲图片欧洲图片av| 久久综合久久综合这里只有精品| 欧美日韩一区二区三区四区五区| 国内外成人免费激情在线视频 | 国产精品久久国产精麻豆99网站| 精品成人在线视频| 亚洲一区二区视频在线| 免费日韩av电影| 午夜一级在线看亚洲| 欧美裸体一区二区三区| aaa亚洲精品一二三区| 久久精品一区中文字幕| 亚洲日本中文字幕| 久久香蕉国产线看观看网| 欧美色图天堂网| 亚洲激情图片小说视频| 久久久久久夜| 欧美一区二区女人| 国产精品sm| 亚洲精品色图| 亚洲电影网站| 另类尿喷潮videofree| 今天的高清视频免费播放成人| 欧美在线欧美在线| 午夜在线a亚洲v天堂网2018| 国产精品视频大全| 亚洲在线免费| 在线亚洲一区| 国产精品theporn| 国产精品99久久久久久人| 亚洲人被黑人高潮完整版| 噜噜噜在线观看免费视频日韩| 国产自产2019最新不卡| 久久久久久网址| 久久嫩草精品久久久精品一| 国产主播在线一区| 麻豆精品视频在线观看| 久久久精品网| 亚洲激情一区二区| 亚洲激情不卡| 国产精品www| 久久本道综合色狠狠五月| 午夜天堂精品久久久久| 在线成人av.com| 亚洲第一福利视频| 欧美日韩ab片| 亚洲欧美在线高清| 欧美一区二区高清在线观看| 精品91久久久久| 亚洲国产一区二区三区在线播| 欧美片第一页| 欧美在线视频免费播放| 久久精品国产成人| 亚洲精品乱码| 亚洲欧美精品suv| 亚洲大片免费看| 亚洲精品免费一二三区| 国产精品欧美一区喷水| 久久在线免费| 国产精品久久久久久久午夜片| 日韩视频―中文字幕| 夜夜爽夜夜爽精品视频| 国产一区二区三区av电影| 蜜桃av久久久亚洲精品| 欧美欧美在线| 久久综合一区二区| 欧美日韩国产精品一卡| 久久精品国产成人| 欧美国产免费| 欧美精品免费视频| 亚洲一区二区视频在线| 欧美在线一二三| 中文日韩在线| 久久琪琪电影院| 久久久免费观看视频| 国产一区二区电影在线观看 | 国产亚洲欧美一区| 国产综合色精品一区二区三区| 美女精品在线观看| 欧美日本高清视频| 久久久综合精品| 欧美日韩第一页| 欧美激情五月| 国产综合色产| 亚洲免费影视第一页| 99精品国产99久久久久久福利| 欧美一区二区三区视频在线| 一区二区三区视频观看| 蜜桃久久精品乱码一区二区| 久久久国产精品一区二区中文 | 亚洲免费一在线| 在线综合亚洲| 欧美电影美腿模特1979在线看| 久久激情综合网| 国产精品男人爽免费视频1| 99re成人精品视频| 99这里只有精品| 欧美韩国日本一区| 欧美国产先锋| 91久久国产综合久久91精品网站| 久久本道综合色狠狠五月| 久久www成人_看片免费不卡| 国产精品高潮呻吟久久| 99视频在线精品国自产拍免费观看| 91久久精品国产91久久性色| 美女免费视频一区| 欧美国产日韩精品免费观看| 亚洲国产视频a| 欧美~级网站不卡| 欧美激情成人在线视频| 亚洲电影欧美电影有声小说| 久久中文欧美| 亚洲二区精品| 91久久精品国产91久久| 欧美成年人网站| 亚洲欧洲日韩女同| 夜夜爽99久久国产综合精品女不卡| 欧美激情亚洲精品| 亚洲精品五月天| 亚洲女人天堂成人av在线| 一区二区精品在线| 亚洲精品一区二区三区不| 一区二区三区日韩欧美精品| 欧美三级电影大全| 一区二区三区免费看| 西瓜成人精品人成网站| 国产亚洲精品v| 久久久免费av| 亚洲国产精品成人综合| 一本久久知道综合久久| 欧美日韩一区二区免费在线观看| 亚洲午夜精品一区二区| 久久久久免费| 亚洲精品久久久久久下一站| 欧美午夜精品久久久久久浪潮| 亚洲一级网站| 美日韩免费视频| 亚洲一区国产一区| 激情成人av在线| 欧美理论电影在线观看| 亚洲欧美在线免费| 亚洲成色最大综合在线| 亚洲免费小视频| 亚洲成人在线网| 欧美色视频一区| 久久免费视频这里只有精品| 亚洲精品日韩综合观看成人91| 性欧美暴力猛交69hd| 亚洲国产成人精品久久| 国产精品欧美一区二区三区奶水| 免费观看成人| 欧美中文字幕在线观看| 99re热这里只有精品免费视频| 久久精品一区二区三区不卡| 一本色道久久综合狠狠躁篇怎么玩| 国产日产精品一区二区三区四区的观看方式 | 老司机67194精品线观看| 999在线观看精品免费不卡网站| 久久国产欧美日韩精品| 夜夜躁日日躁狠狠久久88av| 国产欧美日韩综合一区在线观看| 欧美国产精品劲爆| 久久在线免费观看视频| 午夜一区二区三区不卡视频| 日韩写真视频在线观看| 欧美高清在线视频| 久久精品最新地址| 性做久久久久久久免费看|