vc學習筆記:回車鍵
skyseraph nov.9th 2009 hqu
[email protected] qq-452728574
latest modified date:nov.9th 2010 hqu
回車鍵實現 輸入焦點的傳遞
0 前期:建立單文件工程;新增對話方塊,關聯類ctestdlg;新增選單,新增view類訊息處理函式;view標頭檔案中包含ctestdlg
預設按鈕
預設情況下,ok按鈕的屬性中預設選上了default button,遮蔽只需要雙擊/右擊,選擇登出onok響應中的cdialg::ok()
編輯框按鈕
選上multiline,接受多行,才能效應回車鍵;ws_tabstop預設選上
預設按鈕
當使用者按下回車鍵時,先檢查對話方塊中是否存在指定的預設按鈕(default button),如果有,則呼叫該預設按鈕的訊息響應函式;若沒有,會呼叫虛擬的onok函式。
視窗所有訊息都要到視窗過程中報到的,修改制定視窗的屬性採用setwindowlong函式
long setwindowlong(hwnd hwnd,int nindex,long dwnewlong);
//返回值為視窗制定的32位整形值,如果nindex為gwl_wndproc, 則返回該視窗制定的視窗過程的位址
3 把setwindowlong函式放哪?
放wm_create訊息響應函式中?
在響應這個訊息時,對話方塊的子控制項還未建立完成,只有在訊息處理完畢之後,對話方塊及子控制項才建立完成
在程式執行時,當對話方塊及其子視窗建立完成,將要顯示之前會發生乙個訊息:wm_initdiadlg,[在ctestdlg類新增此訊息響應函式]
4 程式
//①編輯編輯框 視窗過程
wndproc preproc;
lresult callback myproc
( hwnd hwnd,
uint umsg,
wparam wparam,
lparam lparam
if(umsg==wm_char && wparam ==0x0d)//擷取wm_char訊息並作相應判斷和處理,因為對於wm_char訊息,其wparam引數儲存的是字元的asc碼
//獲得視窗控制代碼的方法
//法一
//::setfocus(getnextwindow(hwnd ,gw_hwndnext)); //myproc是全域性函式,不能呼叫cwnd類的成員函式,只能使用相應的sdk函式
//hwnd getnextwindow(hwnd hwnd,uint wcmd);
//法二
//setfocus(::getwindow(hwnd,gw_hwndnext));
//hwnd getwindow(hwnd hwnd,uint ucmd);
//法三
setfocus(::getnextdlgtabitem(::getparent(hwnd),hwnd,false));
//hwnd getnextdlgtabitem(hwnd hdlg,hwnd hctl,bool bprevious);
return 1;
else
return preproc(hwnd,umsg,wparam,lparam);
//②改變視窗屬性
bool ctestdlg::oninitdialog()
cdialog::oninitdialog();
// todo: 在此新增額外的初始化
preproc = (wndproc)setwindowlong(getdlgitem(idc_edit1)->m_hwnd,gwl_wndproc,(long)myproc);
//long setwindowlong(hwnd hwnd,int nindex,long dwnewlong);
//返回值為視窗制定的32位整形值,如果nindex為gwl_wndproc, 則返回該視窗制定的視窗過程的位址
return true; // return true unless you set the focus to a control
// 異常: ocx 屬性頁應返回 false
//③依次傳遞功能的實現
void ctestdlg::onbnclickedok()
//把multiline屬性去掉
//getdlgitem(idc_edit1)->getnextwindow()->setfocus();//不能實現功能
//getfocus()->getnextwindow()->setfocus();//最後乙個控制項呼叫此函式時,返回的這個視窗指標式null,再呼叫setfocus時非法訪問
//getfocus()->getwindow()->setfocus();//同上
getnextdlgtabitem(getfocus())->setfocus();//ok
//onok();
總結:① ② ③
vc回車鍵和關閉
當用vc建立對話方塊之後,直接點選回車鍵之後,對話方塊就自動關閉了,如果要實現點選回車鍵不關閉對話方塊,且能實現相關的功能,則需要重新定義pretranslatemessage函式。其基本流程如下:
1.在對話方塊中,滑鼠右鍵》classwizard。
2.選擇新增pretranslatemessage函式:
bool registerdlldialog::pretranslatemessage(msg* pmsg)
// todo: add your specialized code here and/or call the base class
/*** @如果敲擊回車鍵,響應檢測使用者是否正確的函式.*/
if( pmsg->message == wm_keydown && pmsg->wparam == vk_return )
/*@自己定義的函式*/
oncheckuser();
return true;
return cdialog::pretranslatemessage(pmsg);
這樣再點選回車鍵的時候就會呼叫您自己定義的函式,當然如果不定義的話,敲擊回車鍵,不會有任何反應。
對於對話方塊右上角的關閉按鈕,其響應函式為onclose,只需要在上面第二張圖中的message中選擇wm_close,新增函式就可以出來onclose函式。如果你想在使用者點選這個關閉按鈕的時候,做一些響應,就可以而對這個函式進行處理。
void registerdlldialog::onclose()
// todo: add your message handler code here and/or call default
cdialog::onclose();
源文件 <>
author: skyseraph
from:
回車鍵的使用
在vc中建立一基於對話方塊的工程,編譯執行,成功。面對著剛剛建立的工程,心裡那個高興呀。突然一時心血來潮,按了個回車鍵,工程一閃而過沒了。再編譯執行,成功。按了個esc鍵,工程一閃而過也沒了。為什麼會這樣,因為cdialog 中有預設對enter和esc鍵的處理。解決這種一按回車和esc鍵就關閉工程...
Swing JDialog監聽回車鍵
在做專案時,發現在jdialog中,直接通過addkeylistener來監聽回車鍵不起作用,無法監聽到回車鍵,後面在網上查了些資料,終於解決了。方法如下 keystroke stroke keystroke.getkeystroke keyevent.vk enter,0 this.getroot...
換行符 回車鍵
在計算機還沒有出現之前,有一種叫做電傳打字機 teletype model 33 的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。於是,研製人員想了個辦法解決這個問題,就是在每...