關於tabstop。可以在.rc編輯畫面中,Ctrl+D顯示Tab鍵的執行順序,直接用鼠標點擊控件就可以改變這些順序。
關於group。比如要設定3個按鈕爲一組,需要把第一個按鈕的group屬性設定爲true,另外兩個設定爲False,這樣系統就會知道這3個控件爲一組。具體應用看下面的代碼。
把控制焦點移動的代碼放到消息循環裏:
while (GetMessage(&msg, NULL, 0, 0))
{
//下面這段代碼就是用Tab鍵控制焦點的。
if (msg.message == WM_KEYDOWN && (int)msg.wParam == VK_TAB){
HWND hDlg = GetParent(msg.hwnd);
if (hDlg && GetWindowLong(hDlg, DWL_DLGPROC)){
HWND hNext;
BOOL prev = (GetKeyState(VK_SHIFT) < 0);//如果按住Shift,再按Tab,就會往回走
if (hNext = GetNextDlgTabItem(hDlg, msg.hwnd, prev)){//這是尋找下一個tabstop爲true的控件
SetFocus(hNext);
continue;
}
}
//下面這段代碼是用上下左右鍵控制焦點的。不過要求這些控件必須在同一group內
if (msg.message == WM_KEYDOWN && ((int)msg.wParam == VK_RIGHT || (int)msg.wParam == VK_DOWN)){
HWND hDlg = GetParent(msg.hwnd);
if (hDlg && GetWindowLong(hDlg, DWL_DLGPROC)){
HWND hNext;
if (hNext = GetNextDlgGroupItem(hDlg, msg.hwnd, FALSE)){//這是尋找下一個同一group的控件
SetFocus(hNext);
continue;
}
}
}
if (msg.message == WM_KEYDOWN && ((int)msg.wParam == VK_LEFT || (int)msg.wParam == VK_UP)){
HWND hDlg = GetParent(msg.hwnd);
if (hDlg && GetWindowLong(hDlg, DWL_DLGPROC)){
HWND hNext;
if (hNext = GetNextDlgGroupItem(hDlg, msg.hwnd, TRUE)){
SetFocus(hNext);
continue;
}
}
}
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
下面代碼實現的效果:當焦點在一個RadioBox上,用鍵盤上的箭頭,把焦點移動到下一個RadioBox上,並且選中。
if( Button_GetCheck(hwndNext) == UNCHECKED) {
Button_SetCheck( hwndNext, TRUE);
}
ps:這個函數Button_GetCheck,可用來判斷當前焦點的控件是否被選(check)上。