1. 程式人生 > >【mfc】滑鼠、鍵盤響應事件

【mfc】滑鼠、鍵盤響應事件

對於mfc這東西,你真的必要跟我扯一大堆怎麼類,什麼派生,什麼鬼東西

告訴我怎麼做出一個個小功能,我記住它就可以了

這期為大家帶來MFC的滑鼠響應事件

這也是所謂的MFC中的“訊息對映事件”

一、基本目標

1、有一個基本的MFC程式,點選“關閉”則“關閉”這個程式,這點沒什麼好講的,把自帶的“取消”按鈕,右鍵->屬性的Caption改成“關閉”二字就可以了


2、滑鼠在對話方塊中移動,則顯示其位置資訊,這個座標是視窗內部座標


3、如果按著滑鼠右鍵移動滑鼠,則在這個工程的標題欄會顯示“按著滑鼠右鍵移動滑鼠”,鬆開滑鼠右鍵回覆如初


4、如果按著鍵盤上的Ctrl鍵或者Shift鍵在對話方塊的視窗中移動滑鼠,標題欄同樣會有相應的提示,是否同時按下也會有提示


5、左擊對話方塊,會彈出對話方塊,顯示滑鼠位置在哪裡


二、製作過程

1、首先新建一個MFC工程,除了自帶的“取消”按鈕改名為“關閉”以外,統統刪去,拖出一個靜態文字放在視窗的中間,注意這個靜態文字的尺寸就足夠大,否則無法容納“滑鼠處於X=?,Y=?的位置”這樣的字型,如下圖所示,這個不再展開贅述,可以參考我之前的《【mfc】學生資訊管理,實現List控制元件節點的增刪改查》(點選開啟連結)。


2、注意,要把靜態文字的屬性中的樣式中的“排列文字”改成“居中”


3、拖完控制元件,開始新增滑鼠響應、鍵盤響應的事件,下面只新增滑鼠響應時間即可,鍵盤響應可以放在滑鼠響應的函式內部的實現,新增響應事件的過程先選擇“檢視”->“新建類嚮導”


4、之後則彈出如下的對話方塊,在右下角的Messages框中,找到WM_LBUTTONDOWN與WM_MOUSEMOVE,雙擊,或者單擊後,選擇右方的“Add Function”,之後點選確認或者Edit Code,即可,這裡的意思是:告訴MFC,在這個對話方塊中點選滑鼠的左鍵,移動滑鼠,有響應的處理函式。



5、點選Edit Code則自動跳到ClassView中的內碼表,點選“確定”的則要自己手動切過去,此時,在ClassView中就多了剛才我們自己新增的”響應類“,或者我更加喜歡稱其為“響應函式”,反正你懂是什麼就行了,我知道又有理論帝噴我不專業,反正你喜歡。點選這兩個響應函式,分別寫程式碼,這兩個響應事件函式,請分別在原有的// TODO: Add your message handler code here and/or call default與CDialog::OnLButtonDown(nFlags, point);之間寫程式碼


6、對於void CMouseDlg::OnLButtonDown(UINT nFlags, CPoint point)要完成左擊對話方塊就顯示滑鼠位置在哪裡的使命,


見如下程式碼:

void CMouseDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CString str;
	//可以用point.x,point.y這兩個成員變數之間取出滑鼠的位置,注意到,此函式的頭,系統已經自動帶入了滑鼠類CPoint point
	str.Format("點下左鍵時,滑鼠處於x=%d,y=%d的位置",point.x,point.y);
	AfxMessageBox(str);
	CDialog::OnLButtonDown(nFlags, point);
}
7、對於void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point)是滑鼠移動時候的函式。

滑鼠響應事件裡面附帶鍵盤響應時間就如下面所下,不為什麼。

void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	//同理,取出滑鼠的位置,放到靜態文字中
	CString str;
	str.Format("滑鼠處於x=%d,y=%d的位置",point.x,point.y);
	SetDlgItemText(IDC_STATIC,str);	
	//如果按下Ctrl而沒有按下Shift
	if((MK_CONTROL & nFlags) && !(MK_SHIFT & nFlags))
		//設定對話方塊的標題為“按下了Ctrl在移動滑鼠”
		SetWindowText("按下了Ctrl在移動滑鼠");
	//如果沒有按下Ctrl而按下Shift
	else if (!(MK_CONTROL & nFlags) && (MK_SHIFT & nFlags))
		SetWindowText("按下了Shift在移動滑鼠");
	//如果同時按下Ctrl與Shift
	else if ((MK_CONTROL & nFlags) && (MK_SHIFT & nFlags))
		SetWindowText("按下了Ctrl+Shift在移動滑鼠");
	//如果按下滑鼠的右鍵
	else if (MK_RBUTTON & nFlags)
		SetWindowText("按下了滑鼠右鍵在移動滑鼠");
	//如果什麼都沒有按下
	else
		SetWindowText("mouse");
	CDialog::OnMouseMove(nFlags, point);
}

到這裡編譯之後,就完成了整個工程了,必須注意的是:

對於void CMouseDlg::OnLButtonDown(UINT nFlags, CPoint point)與void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point)都是滑鼠左擊對話方塊一次與滑鼠在對話方塊內移動一次就執行一次。

CString str,是Win32程式讀有的字串,設定其值的方式,請用其自帶的Format()方法,因為其本質是類,不是一個單獨的變數,不能直接等於

相關推薦

mfc滑鼠鍵盤響應事件

對於mfc這東西,你真的必要跟我扯一大堆怎麼類,什麼派生,什麼鬼東西 告訴我怎麼做出一個個小功能,我記住它就可以了 這期為大家帶來MFC的滑鼠響應事件 這也是所謂的MFC中的“訊息對映事件” 一、基本目標 1、有一個基本的MFC程式,點選“關閉”則“關閉”這個程式,這點沒

OpenCVMFC圖片視頻攝像頭輸入響應詳細圖解

tsp box 背景建模 img 有變 highgui 復制 creat int 記住新建項目後,要配置OpenCV環境!參考鏈接http://blog.csdn.net/zy122121cs/article/details/49180541 做工程搭建框架什麽的,基本的

OpenGL(十六) 滑鼠鍵盤互動響應事件

OpenGL中通過滑鼠和鍵盤跟程式互動的實現需要實現註冊滑鼠和鍵盤響應事件,在一定條件下,該事件被觸發,事件裡的程式被執行,達到互動的目的。 通過glutMouseFunc(&OnMouse)註冊滑鼠事件,OnMouse是滑鼠事件的響應,函式格式是void OnM

UE4 第06講 碰撞事件響應

(版權宣告,禁止轉載)        今天實現了一下碰撞事件的響應問題,原本感覺陽光明媚,然而當打包到Android的時候,一下掉進了黑暗的深淵,UE4的安卓打包簡直是魔鬼,在真機上跑起來的時候和在電腦上的預覽效果有很大不同,Panda(我喜歡功夫熊貓

MFC 如何通過主對話方塊的按鈕響應建立非模態對話方塊

1.首先新建一個對話方塊IDD_DIALOG_Create, 並新增類CDialog_Create。 //在工程中會新生成一個Dialog_Create.h標頭檔案和一個Dialog_Create.CPP原始檔。 2.在主對話方塊的標頭檔案SerialDlg.h

Qt事件總結(滑鼠鍵盤)

Qt 程式需要在main()函式建立一個QCoreApplication物件,然後呼叫它的exec()函式。這個函式就是開始 Qt 的事件迴圈。在執行 exec()函式之後,程式將進入事件迴圈來監聽應用程式的事件。當事件發生時,Qt 將建立一個事件物件。Qt 中所有事件類都

JS中的事件滑鼠鍵盤HTML事件

<body> <div> <img class="a" src="../../img/new_01" alt=""> <img class="a" src="../../img/new_02"

MFC關於OnOK()OnCancel()OnClose()OnDestroy() 模式對話方塊

第一,OnOK()和OnCancel()是CDialog基類的成員函式,而OnClose()和OnDestroy()是CWnd基類的成員函式,即WM訊息響應函式。從應用程式結構的角度,拿對話方塊來說,紅色的X對應的是CWnd,而處於對話方塊中的“確定”、“取消”按鈕則對應

python Tkinter圖形使用者介面元件(滑鼠鍵盤事件)

<KeyPress>  按下任意的鍵 <KeyRelease>   鬆開任意鍵 <KeyPress-key>,<KeyRelease-key>  按下或者鬆開key <Key>,<Key-key> 分別是<KeyPress>,

Redis2CentOS 7 上安裝 redis3.2.3安裝與配置

sync 倉庫 ace /var/ 發現 wan sudo base str 一、redis源碼安裝 【更正】現在最新穩定的版本已經到了3.2.8 截至到2016.8.11,redis最新穩定版本為3.2.3.本篇文章我們就以此版本為基礎,進行相關的講解。 下載redis源

docker02docker安裝

docker一、在CentOS上安裝Docker以下版本的CentOS 支持 Docker :CentOS 7 (64-bit) # CentOS 從 7 開始,和 RHEL 7 一樣都只支持 64 位架構。CentOS 6.5 (64-bit) or later請註意,由於 Docker 的局限

Python05python程序結構控制語句

python一、程序結構程序結構:語句和表達式按照什麽樣的順序執行所有語言無非就三種程序結構: 順序:默認結構 語句從上到下依次一行一行的執行, 分支:選擇一個分支執行,永遠最多只執行一個分支 循環:二、分支結構語句1、Python的比較操作

Python06python內置數據結構1

python list 一、數據結構與獲取幫助信息1、數據結構 通過某種方式(例如對元素進行編號)組織在一起的數據元素的集合,這些數據元素可以是數字或者字符,甚至可以是其它的數據結構。 python的最基本數據結構是序列 序列中的每個元素被分配一個序號(即元素的位置),也稱為索引:索引從0開始編

Python07python內置數據結構之字符串及bytes

str 字符串 一、字符串1、定義和初始化In [4]: s = "hello python" In [4]: s = "hello python" In [5]: s Out[5]: ‘hello python‘ In [6]: s = ‘hello python‘ In [7]: s Out

Python10python內置數據結構之集合

set一、集合1、集合的定義In [74]: s = {} In [74]: s = {} # 空大括號是空的字典 In [75]: type(s) Out[75]: dict In [77]: type(s) Out[77]: set In [78]: help(set) Help on cl

Python11python內置數據結構之字典

dict一、字典1、字典的初始化 字典是一種key-value結構In [160]: d = {} In [161]: type(d) Out[161]: dict In [166]: d = {‘a‘:1, ‘b‘:2} In [167]: d Out[167]: {‘a‘: 1, ‘b‘:

Python11集合與字典的實現

python一、字典的實現dict是在list之上實現的 i(索引) = hash(key) % solt(槽位數)此時i重復了怎麽辦(hash沖突)?1、拉鏈法 每個槽位上拉一個List,就是拉鏈法2、開地址法 使用某個算法重新計算i,就交開地址法 常用,效率更高,i = fn(key, i)【Pyt

SonarQube安裝配置與使用 01

ges 工具 順序 64位系統 runner lba 問題 分析 clas SonarQube是管理代碼質量一個開放平臺,可以快速的定位代碼中潛在的或者明顯的錯誤,下面將會介紹一下這個工具的安裝、配置以及使用。 準備工作; 1、jdk(不再介紹) 2、sonarqube:h

React- 1React介紹

log htm css代碼 大型 har html 高內聚低耦合 目的 耦合 React的開發背景 構建數據不斷變化的大型應用         大量DOM操作     <---- 自動DOM操作 數據變化         邏輯及其復雜     <---

IO01文件對象

文件io一、打開和關閉文件1、文件打開和關閉In [1]: help(open) Help on built-in function open in module io: open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newl