[問題] Visual C++ 2008 如何接收鍵盤按鍵?

看板C_and_CPP (C/C++)作者 (皮卡丘)時間15年前 (2010/11/30 18:00), 編輯推噓5(5035)
留言40則, 7人參與, 最新討論串1/1
想請問有使用過VC++ 2008 及 OpenCV 寫過程式的大大... 由於以前上課是用Turbo C 或 Dev C++, 像這種的開發環境,編譯時會跑DOS視窗出來, 所以可以使用system("pause"); 或 scanf 之類的指令, 在開發的時候,因為使用OpenCV, 所以可以使用他的cvWaitKey 來達到取一個值的目的。 但是因為還要使用MFC,所以拉了一個介面, 程式執行時只會跑出介面,不會出現DOS視窗, 雖然像pause 這樣的指令還是可以用(但按任意鍵後會當機...) 但是scanf就沒辦法用.... 在自己拉的介面上,程式不會暫停,按按鍵也不會理你... 而且因為要整合, 所以把OpenCV 所開的視窗都取消掉了, 沒開OpenCV視窗的情況下,又無法使用OpenCV的函數取值, 所以不知道應該怎麼辦...。 總結問題是..... 在VC++ 2008 的環境下,怎麼在MFC介面視窗上,從鍵盤取一個值? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.127.182.2

11/30 18:03, , 1F
我猜你是用Dialog,在main dialog的class去攔
11/30 18:03, 1F

11/30 18:04, , 2F
PreTranslateMessage
11/30 18:04, 2F

11/30 18:12, , 3F
前言很長...在對話方塊畫面,選屬性->訊息->WM_KEYDOWN
11/30 18:12, 3F

11/30 18:12, , 4F
會出現下拉選單,拉下去選"加入..."就會生成一個函數叫
11/30 18:12, 4F

11/30 18:13, , 5F
OnKeyDown在那裡面做處理。詳細你還是去找MFC書才是鄭解
11/30 18:13, 5F

11/30 18:13, , 7F
有閃電的地方給他按下去就好了 XD
11/30 18:13, 7F

11/30 18:22, , 8F
弄個閃電圖案,好像MFC程式常常被雷劈一樣
11/30 18:22, 8F

11/30 19:11, , 9F
網路爬文了一下,還是不會用PreTranslateMessage,
11/30 19:11, 9F

11/30 19:11, , 10F
只看到教人怎麼把按鍵訊息都吃掉~@@
11/30 19:11, 10F

11/30 19:12, , 11F
閃電是什麼意思0.0 OnKeyDown 還需要摸索一下...
11/30 19:12, 11F

11/30 19:13, , 12F
我主要是要把這個按鍵值給主程式的if做判斷...
11/30 19:13, 12F

11/30 20:20, , 13F
KeyPress事件就能接收鍵盤的值了
11/30 20:20, 13F

11/30 20:21, , 14F
如e->keyChar就能接收使用者鍵盤上輸入字元
11/30 20:21, 14F

11/30 20:31, , 15F
話說,MFC 可以搭配 .NET 嗎?
11/30 20:31, 15F

11/30 20:42, , 16F
因該不行...耍笨了,請無視我的推文,謝P大提醒
11/30 20:42, 16F

11/30 21:29, , 17F
不要再"因該"了orz
11/30 21:29, 17F

12/01 02:01, , 18F
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
12/01 02:01, 18F

12/01 02:06, , 19F
{
12/01 02:06, 19F

12/01 02:07, , 20F
if(pMsg->message == WM_KEYDOWN)
12/01 02:07, 20F

12/01 02:07, , 21F
{
12/01 02:07, 21F

12/01 02:07, , 22F
if(pMsg->wParam == '\r')
12/01 02:07, 22F

12/01 02:07, , 23F
{
12/01 02:07, 23F

12/01 02:08, , 24F
// press enter key
12/01 02:08, 24F

12/01 02:08, , 25F
}
12/01 02:08, 25F

12/01 02:08, , 26F
}
12/01 02:08, 26F

12/01 02:08, , 27F
return CDialog::PreTranslateMessage(pMsg);
12/01 02:08, 27F

12/01 02:08, , 28F
}
12/01 02:08, 28F

12/01 02:11, , 29F
另外請在header file裡加上這行
12/01 02:11, 29F

12/01 02:11, , 30F
virtual BOOL PreTranslateMessage(MSG* pMsg);
12/01 02:11, 30F

12/01 02:33, , 31F
恕我跳tone,你不考慮用CEdit,CButton,CMessageBox這些
12/01 02:33, 31F

12/01 02:33, , 32F
去取代您所說的嗎?
12/01 02:33, 32F

12/01 14:32, , 33F
我不懂的地方是...PreTranslateMessage 的回傳不是BOOL嗎
12/01 14:32, 33F

12/01 14:33, , 34F
回傳是 Ture 或 False 這樣怎麼接收按鍵值?
12/01 14:33, 34F

12/01 14:36, , 35F
原本用opencv時的寫法是 c = cvWaitKey(0); 想取代這行
12/01 14:36, 35F

12/01 17:59, , 36F
PreTranslateMessage 你把它看成"攔截"會比較好
12/01 17:59, 36F

12/01 18:02, , 37F
任何動作 鍵盤 滑鼠 或其他訊息,都會先進到這
12/01 18:02, 37F

12/01 18:03, , 38F
您所說的 c = cvWaitKey(0); 這是跟user互動吧?! 那我會
12/01 18:03, 38F

12/01 18:04, , 39F
建議您參考tropical72的建議,拉個介面給user輸入
12/01 18:04, 39F

12/03 14:23, , 40F
感謝大大 0.0 介面的部份我再試試看..@@
12/03 14:23, 40F
文章代碼(AID): #1CzCj2uU (C_and_CPP)
文章代碼(AID): #1CzCj2uU (C_and_CPP)