2013-08-03 2 views
1

Window가 DialogBox가 아니기 때문에 WS_TABSTOP이 작동하지 않습니다. 또한 모든 컨트롤을 통해 Tab 키를 사용하지 않으려 고합니다. 몇 가지 Edit 컨트롤을 통해 Tab 키를 누릅니다.Tab을 사용하여 편집 컨트롤간에 전환 하시겠습니까?

내가 한 것은 편집 컨트롤을 수퍼 클래스로 만들고 편집 컨트롤간에 전환하는 WM_KEYDOWN 메시지를 처리하는 것으로, 다음 줄에있는 줄을 얻는 것입니다. thorugh :: GetWindow (hwnd, GW_HWNDNEXT); 또한 마지막 컨트롤에 도달했을 때 포커스를 첫 번째 Edit 컨트롤로 다시 전환하고 싶습니다.

코드가 마지막 편집 컨트롤에 도달했을 때 작동하지 않습니다. :: GetWindow는 수퍼 클래 싱되지 않은 편집 컨트롤 인 줄 (?)의 다음 창만 반환합니다. 숨겨진 하위 창 (SW_HIDE)이 더 있습니다.

아마도 내가 창 HWND의 클래스 이름을 아는 방법을 알고 있다면?

참고 : 순수 Win32 API, C++입니다.

else if ( (int) wParam == VK_TAB ) 
{ 
    HWND nextInLine; 
    nextInLine = ::GetWindow (hwnd, GW_HWNDNEXT); 
    if (hwnd == NULL) nextInLine = ::GetWindow (hwnd, GW_HWNDPREV); 
    ::SendMessage (nextInLine, EM_SETSEL, (WPARAM) 0, (LPARAM) -1); 
    ::SetFocus (nextInLine); 
    return 0; 
} 
+2

http://blogs.msdn.com/b/oldnewthing/archive/2003/10/21/55384.aspx – jamesdlin

답변

2

IsDialogMessage API 호출을 사용하면 모든 창에서 무료로 키보드 탐색이 가능합니다. 서비스를 사용하려면 IsDialogMessage에 대한 호출을 포함하도록 창 메시지 루프를 수정하고 대화 관리자가 이미 처리하지 않은 경우에만 메시지를 일반 메시지 처리로 전달해야합니다.

MSG msg = { 0 }; 
while (GetMessage(&msg, NULL, 0, 0)) { 
    if (IsDialogMessage(hwnd, &msg)) { 
     /* Already handled by dialog manager */ 
    } else { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

는되도록 대화 관리자 재귀 자식 창에 부모 창에서 WS_EX_CONTROLPARENT extended window style을 설정하는 것을 잊지 마십시오.

+0

이 답변 자체가 모두 내 전체 탭 문제와 여기에있는 문제를 해결했습니다. –

1

그냥 calling IsDialogMessage으로 도망 갈 수도 있지만 그 결과는 100 % 대화와 비슷하지 않습니다.

  • WNDCLASS (데이터의 인덱스를 이미 사용하고있는 여분의 공간에 추가하고 상쇄하는 것을 잊지 마세요)
  • 전화의 cbWndExtra 필드로 DLGWINDOWEXTRA를 지정 일반 창을 대화처럼 동작하도록하려면 이 당신의 창 대화 상자를 만드는 때문에 GetWindowLongPtr 또는를 호출 할 때, 그것을 사용하는 경우 DefDlgProc보다는 DefWindowProc

, 당신은 긴 대신 GWLP_USERDATADWLP_USER 창을 사용할 필요가.

(메모리에서, 위의 일에서 얻는 중요한 것은 내가 http://support.microsoft.com/kb/102589에 설명 된 방법을 사용하여 Enter 키를 사용하여 변경 초점을 지원하기 위해 사용하는 것이 유용 발견했습니다 WM_NEXTDLGCTL에 대한 지원입니다.)

메시지 펌프에서 메시지 펌프의 각 대화 상자와 유사한 창에 대해 IsDialogMessage으로 전화하십시오.

당신의 대화 같은 윈도우 컨트롤을 만들 때

마지막으로, 당신은 자식 창에 대한 WS_EX_CONTROLPARENT 창 exstyle (리소스 편집기에서 일명 Control Parent을)를 탭 이동에 참여하고, 설정하려는 각 창에 대한 WS_TABSTOP 창 스타일을 설정하는 것이 대화 상자 컨트롤이 포함되어 있습니다.

관련 문제