VC學習筆記 回車鍵

2022-02-01 03:57:50 字數 3459 閱讀 6262

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秒裡面,又有新的字元傳過來,那麼這個字元將丟失。於是,研製人員想了個辦法解決這個問題,就是在每...