- 按回車鍵執(zhí)行了什么?在哪里處理回車鍵的事件?
有確定按鈕的窗體
無確定按鈕的窗體 - 輸入焦點(diǎn)怎樣跳到下一個(gè)控件
- 例子程序
有確定按鈕的窗體的例子
無確定按鈕的窗體的例子
一. 按回車鍵執(zhí)行了什么?在哪里處理回車鍵的事件?
1. 有確定按鈕的窗體
一般情況,如果窗體上有確定按鈕,把這個(gè)按鈕的 Default 屬性設(shè)為 true;如果窗體上有取消按鈕,把這個(gè)按鈕的 Cancel 屬性設(shè)為 false,這樣就可以用最簡(jiǎn)單的方法處理回車和 Esc 鍵執(zhí)行的內(nèi)容。
- 如果按鈕的 Default 屬性設(shè)為 true,按鍵盤的回車鍵會(huì)執(zhí)行點(diǎn)擊這個(gè)按鈕;
- 如果按鈕的 Cancel 屬性設(shè)為 true,按鍵盤的 Esc 鍵會(huì)執(zhí)行點(diǎn)擊這個(gè)按鈕;
- 如果按鈕的 Default 屬性和 Cancel 屬性都設(shè)為 true,按鍵盤的回車鍵和 Esc 鍵都會(huì)執(zhí)行點(diǎn)擊這個(gè)按鈕。
2. 無確定按鈕的窗體
如果沒有確定按鈕,需要使用窗體的 KeyPreview 屬性和窗體的鍵盤按鍵事件。
- 默認(rèn)情況下,窗體的 KeyPreview 屬性為 false,如果窗體上存在有輸入焦點(diǎn)的控件,那么鍵盤輸入都被定向到了這個(gè)控件,窗體的按鍵事件就不會(huì)被觸發(fā)和執(zhí)行;
- 如果窗體的 KeyPreview 屬性設(shè)為 true,那么無論是否存在有輸入焦點(diǎn)的控件,窗體的按鍵事件都會(huì)被觸發(fā)和執(zhí)行。
二. 輸入焦點(diǎn)怎樣跳到下一個(gè)控件
窗體的 ActiveControl 屬性:指向當(dāng)前有焦點(diǎn)的控件;
窗體的 FindNextControl 方法:尋找下一個(gè)控件。
TWinControl* __fastcall FindNextControl(TWinControl* CurControl, bool GoForward, bool CheckTabStop, bool CheckParent);
| 參數(shù) | 說明 |
|---|---|
| TWinControl* CurControl | 從這個(gè)控件開始找 |
| bool GoForward | true: 找下一個(gè); false: 找上一個(gè) |
| bool CheckTabStop | true: 控件的 TabStop 屬性必須為 true; false: 不檢查控件的 TabStop 屬性 |
| bool CheckParent | true: 找到的是容器,不會(huì)在這個(gè)容器里面找控件; false: 找到的是容器,在這個(gè)容器里面找控件 |
從當(dāng)前有焦點(diǎn)的控件 ActiveControl 開始,找下一個(gè)有 TabStop 的控件,如果找到,就讓這個(gè)控件獲取焦點(diǎn):
TWinControl *lpNext = FindNextControl(ActiveControl, true, true, false);
if(lpNext != NULL)
{
lpNext->SetFocus();
}
三. 例子程序
1. 有確定按鈕的窗體的例子
這是通用的辦法,只要有 “OK” 或 “確定” 按鈕,就可以用這個(gè)辦法,而且代碼也是通用的,不用修改。

把 OK 按鈕的 Default 屬性設(shè)為 true,在 OK 按鈕的點(diǎn)擊事件里面寫:
void __fastcall TForm1::BtnOKClick(TObject *Sender)
{
if(Sender != ActiveControl)
{
TWinControl *lpNext = FindNextControl(ActiveControl, true, true, false);
if(lpNext != NULL && lpNext != Sender)
{
lpNext->SetFocus();
return;
}
}
ShowMessage(L"真正的處理點(diǎn)擊 OK 按鈕的內(nèi)容");
}
運(yùn)行結(jié)果:只要輸入焦點(diǎn)不在按鈕上,回車就會(huì)把輸入焦點(diǎn)跳到下一個(gè)控件上。
2. 無確定按鈕的窗體的例子
這是通用的方法,F(xiàn)orm 的 KeyPreview 屬性設(shè)為 true,然后處理 Form 的 OnKeyDown 事件。

Form 的 OnKeyDown 事件:
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
if(Key == VK_RETURN)
{
TWinControl *lpNext = FindNextControl(ActiveControl, true, true, false);
if(lpNext != NULL)
{
lpNext->SetFocus();
}
}
}
運(yùn)行結(jié)果:回車會(huì)把輸入焦點(diǎn)跳到下一個(gè)控件。