Сделать мой графический интерфейс доступным через клавиатуру (Xp, Visual Studio, C++)

Я построил графический интерфейс с кнопками, группами кнопок, правками, списками... и т. Д.... но теперь я хочу знать, как сделать мой графический интерфейс доступным через клавиатуру, то есть изменить фокусировку, нажав кнопку табуляции. У кого-нибудь есть идеи, как это сделать? Я использую Windows Xp, и графический интерфейс написан на C++ с использованием Visual Studio 2008.

большое спасибо

ОБНОВИТЬ:

INT APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;

    INITCOMMONCONTROLSEX ics;
    ics.dwSize = sizeof(ics);
    ics.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&ics);

    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_PRUEBA, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDA_ACCEL_TABLE));

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if ((!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) && (!IsDialogMessage(msg.hwnd, &msg))) 
        //if ((!IsDialogMessage(msg.hwnd, &msg)) & (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) )) 
        //if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

У меня есть много элементов управления в моем графическом интерфейсе, я должен поставить WS_TABSTOP во всех них? Что если у меня есть группа кнопок... я должен поместить WS_TABSTOP в каждую кнопку и в группу? только в отдельных кнопках?

Например, я вставлю созданную мной группу:

INT CrearControles(HWND hwnd, LPARAM lParam) {
    HINSTANCE hInstance;
    HFONT hfont;
    HWND hctrl;
    int i;

    hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
    hfont = (HFONT)GetStockObject( DEFAULT_GUI_FONT );

    /* Insertar controles */    
    hctrl = CreateWindowEx(
        0,
        "BUTTON",        /* Nombre de la clase */
        "Rol",       /* Texto del título */
        BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP , /* Estilo */
        20, 15,           /* Posición */
        180, 100,          /* Tamaño */
        hwnd,            /* Ventana padre */
        (HMENU)GRUPO_ROL,/* Identificador del control */
        hInstance,       /* Instancia */
        NULL);           /* Sin datos de creación de ventana */ 
    SendMessage(hctrl, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE, 0));

    hctrl = CreateWindowEx(0, "BUTTON", "Receptor", BS_NOTIFY | BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 30, 35,
      70, 25, hwnd, (HMENU)BOTON_RECEPTOR, hInstance, NULL);           
    SendMessage(hctrl, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE, 0));
    SendDlgItemMessage(hwnd, BOTON_RECEPTOR, BM_SETCHECK, BST_CHECKED, 0);           
    SetFocus(hctrl);

    hctrl = CreateWindowEx(0, "BUTTON", "Emisor", BS_NOTIFY | BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 30, 65,
      70, 25, hwnd, (HMENU)BOTON_EMISOR, hInstance, NULL);         
    SendMessage(hctrl, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE, 0));


    hctrl = CreateWindowEx(0, "STATIC", "Telefono", SS_SIMPLE | WS_CHILD | WS_VISIBLE, 150, 55, 100, 55, hwnd, (HMENU)LABEL_TELEFONO,
          hInstance, NULL);          
    SendMessage(hctrl, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE, 0));
    SetFocus(hctrl); 

    hctrl = CreateWindowEx(0, "EDIT", "", ES_READONLY | ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_NUMBER , 115, 68,
          80, 20, hwnd, (HMENU)EDIT_TELEFONO, hInstance, NULL); 
    SendMessage(hctrl, WM_SETFONT, (WPARAM)hfont, MAKELPARAM(TRUE, 0));
    SetFocus(hctrl);       

    return 1;
}

Спасибо

1 ответ

Решение

Если ваш графический интерфейс работает как стандартный модальный диалог, вы должны получить вкладки и Alt клавиши навигации между элементами управления бесплатно.

то есть: элементы управления с установленным стилем WS_TABSTOP, к которым вы должны иметь возможность вкладки, элементы управления с определенным сочетанием клавиш (например: кнопка с надписью "&Do Something" должна быть доступна с помощью Alt+D - и D должен отображаться подчеркнутым).

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

например:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
    if (!IsDialogMessage(m_hWndYourWindow, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
Другие вопросы по тегам