2010-07-21 4 views
3

Я создал свой контроль в моем окне в сообщении WM_CREATE, как это:Как заставить вкладки работать с win32? Я не использую диалог

case WM_CREATE: 
{ 
    CreateWindowA("button", "Refresh Listview", 
        BS_MULTILINE | WS_CHILD | WS_VISIBLE, 10, 10, 70, 50, 
        hwnd, (HMENU)IDC_REFRESHLW, g_hInst, NULL); 
    break; 
} 

Когда я нажимаю вкладку он не делает ничего, делать я должен инициализировать его каким-то образом?

Я заметил, что если я использую диалог, он уже автоматически инициализируется табулированием, а порядок табуляции - это порядок, в котором вы создаете элементы управления в файле .rc.

Но я не хочу диалога!

благодаря

ответ

8

Чтобы табулируя работать в диалоге вам нужно построить вызов IsDialogMessage в свой цикл обработки сообщений.

Вашего цикл сообщения должен выглядеть примерно так:

HWND hwnd; // main window handle 

MSG msg; 
while(GetMessage(&msg,0,0,0)>0) 
{ 
    if(!IsDialogMessage(hwnd,&msg)) 
    { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 
} 

IsDialogMessage работы путь изучения сообщения и увидеть, если его VK_TAB или связанное сообщение - это то смотрит на HWND, передаваемый в видеть, какие из его дочерних окон имеет фокус и, если дочернее окно имеет фокус, ищет другие дочерние окна со стилем WS_TABSTOP и перемещает фокус на следующий элемент управления TABSTOP в окне. Окно НЕ должно быть диалогом для использования этой функции, просто иметь дочерние окна, которые могут принимать фокус, и иметь стиль WS_TABSTOP.

+0

Вау, спасибо. работает отлично. Я один раз видел этот вызов, но я думал, что его можно использовать, только если вы используете диалог. спасибо большое! – Kaije

+0

@ Крис благодарит за это, недавно удалось сломать клавиши табуляции и по умолчанию в моем приложении, и это исправило это. Никогда бы не выработал это без вашего ответа! –

Смежные вопросы