在vc中建立一基於對話方塊的工程,編譯執行,成功。面對著剛剛建立的工程,心裡那個高興呀。突然一時心血來潮,按了個回車鍵,工程一閃而過沒了。再編譯執行,成功。按了個esc鍵,工程一閃而過也沒了。
為什麼會這樣,因為cdialog 中有預設對enter和esc鍵的處理。
解決這種一按回車和esc鍵就關閉工程的正確處理方法是:觸發pretranslatemessage訊息,截獲enter和esc對對話方塊的訊息。
**如下:
bool c***::pretranslatemessage(msg* pmsg)
}return cdialog::pretranslatemessage(pmsg);
} ok了,這下好了。突然我在對話方塊上加了乙個編輯框和乙個列表框,我想先在編輯框中輸入內容,然後按一下回車鍵,就把編輯框的內容插入到列表框中。
突然一想還真無從下手,再一想還是在pretranslatemessage裡面做,上面的我是直接return true;的。我在這個return true;上面做就行了。
**如下:
bool c***::pretranslatemessage(msg* pmsg)
return true;
case vk_escape:
return true;
break;
}}
return cdialog::pretranslatemessage(pmsg);
}要是兩個編輯框呢。在編輯框1中回車,把編輯框1的內容加到列表框,在編輯框2中回車,把編輯框2的內容加到列表框,於是這樣。
**如下:
bool c***::pretranslatemessage(msg* pmsg)
if (pmsg->hwnd == h2)
return true;
case vk_escape:
return true;
break;
}}
return cdialog::pretranslatemessage(pmsg);
}為了下面的使用,先來講講vc的視窗類和視窗控制代碼的轉換。
視窗類就是cwnd,視窗控制代碼就是hwnd。cwnd和hwnd之間互相轉換**如下:
cwnd *pwnd;
hwnd hwnd;
hwnd = pwnd->getsafehwnd(); //cwnd->hwnd
pwnd = cwnd::fromhandle(hwnd); //hwnd->cwnd
則這樣上面的兩個編輯框的**,改一下第二個編輯框先得到cwnd,轉一下然後和hwnd比較。
改了的**如下:
bool c***::pretranslatemessage(msg* pmsg)
if (pmsg->hwnd == h2->getsafehwnd())
return true;
case vk_escape:
return true;
break;
}}
return cdialog::pretranslatemessage(pmsg);
}完成了,功能一模一樣。
好開心!
舉一反三,下面別的控制項你也可以這樣做了。如:列表框
等等。突然一天,我發現這種做法失效了。失效在組合框上了。
原本的希望卻變成了失望。痛苦啊。
程式如下:
bool c***::pretranslatemessage(msg* pmsg)
return true;
case vk_escape:
return true;
break;
}}
return cdialog::pretranslatemessage(pmsg);
}於是用spy++一看,組合框卻有兩個控制代碼,乙個是combobox,還有乙個是edit的控制代碼。想想也是呀:組合框的可視部分就是由乙個edit組合成的,而pmsg->hwnd得到的控制代碼就是這個edit所指的控制代碼(因為回車就是在這個edit裡面敲的),而hwnd h3 =::getdlgitem(m_hwnd,idc_combo1);得到的這個控制代碼卻是combobox的控制代碼,pmsg->hwnd 和 h3這兩個當然不等了。
呵呵,找到了原因就好辦了。
這下記起來有個這個函式了吧:cwnd* getparent() const;
其實combobox就是edit的父視窗(組合框和編輯框都可以看成是視窗)。
哦,既然pmsg->hwnd是edit的控制代碼,combobox又是edit的父視窗,那用個getparent();就得到父視窗的控制代碼了,就可以和得到的控制代碼比較了。
大功告成,於是**就出來了。
**如下(舉了兩個組合框):
bool centercombodlg::pretranslatemessage(msg* pmsg)
if (hhp == h2)
return true;
case vk_escape:
return true;
break;
} }
return cdialog::pretranslatemessage(pmsg);
}哦,不錯。
這只是回車鍵在vc的應用之一。
Swing JDialog監聽回車鍵
在做專案時,發現在jdialog中,直接通過addkeylistener來監聽回車鍵不起作用,無法監聽到回車鍵,後面在網上查了些資料,終於解決了。方法如下 keystroke stroke keystroke.getkeystroke keyevent.vk enter,0 this.getroot...
如何使用回車鍵模仿Tab鍵
李中未 在delphi程式設計中,如何實現用回車鍵在若干個編輯視窗中切換?比如,姓名和密碼兩個輸入視窗,輸入姓名後,只能用tab鍵或用滑鼠定位游標到密碼輸入視窗,我想用回車鍵切換視窗。回答 先將窗體的keypreview屬性設為true。然後在formkeypress事件中加入以下 procedur...
小程式 使用回車鍵搜尋
在data裡面 data 在getsearch txt中獲取輸入框內容 getsearch txt function console.log 搜尋框裡面的值 e.detail.value 然後在searchsubmit函式中寫內容 searchsubmit function options meth...