2010-11-06 4 views
0

Dans mon interface j'ai quelques boutons, une combo et une fenêtre où j'affiche une séquence d'images. Ces boutons naviguent à travers la séquence, mais je voulais aussi naviguer à travers les flèches GAUCHE et DROITE sur le clavier. Après la compilation, les touches du clavier fonctionnent correctement, car Focus est réglé sur la fenêtre principale, mais après avoir cliqué sur un bouton ou une combinaison, les touches du clavier ne fonctionnent pas. Je le gère avec SetFocus (main_hwnd) dans ma boucle principale mais la zone de liste déroulante ne réagit pas lorsque je clique dessus.BOUTONS, CLAVIER et CLAVIER CLAVIER (winapi)

Exemple ci-dessous:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 

     case WM_CREATE: 
     CreateWindowEx(0, "COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLIST, 478, 5, 50, 200, hwnd, (HMENU)ID_COMBO1, GetModuleHandle(NULL), NULL); 
     break; 

     case WM_COMMAND: 
     break; 

     case WM_KEYDOWN: 
     switch(wParam) 
     { 
      case VK_SPACE: 
      PostQuitMessage(0); 
      break; 
     } 
     break; 

     case WM_DESTROY: 
      PostQuitMessage (0); 
      break; 

     default: 
      return DefWindowProc (hwnd, message, wParam, lParam); 
    } 
    // SetFocus(hwnd); 
    return 0; 
} 

assumig cet exemple: après la compilation sur la touche ESPACE fonctionnera, mais après avoir cliqué sur combobox, il ne fonctionnera pas. Si j'utilise SetFocus (hwnd) SPACE KEY fonctionnera toujours mais la liste déroulante sera désactivée.

Merci pour votre aide.

Répondre

1

Oui, votre procédure de fenêtre est uniquement pour cette fenêtre, une zone de liste modifiable est une fenêtre distincte. J'aime gérer mes raccourcis clavier dans la boucle de message comme ceci:

MSG msg; 

while (GetMessage(&msg, NULL, 0, 0) > 0) 
{ 
    if (msg.message == WM_KEYDOWN) 
    { 
     if ((UINT)msg.wParam == VK_SPACE) 
     { 
      return 0; // or use postquitmessage 
     } 
    } 

    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
+0

Il y a un certain nombre de problèmes avec ce code: Une subtile est que vous avalez des messages 'WM_KEYDOWN' alors que les contrôles recevront toujours la' WM_KEYUP' correspondant message. Plus important encore, vous ré-inventez mal le gestionnaire de dialogue: La navigation au clavier doit être implémentée en utilisant [IsDialogMessage] (http://msdn.microsoft.com/fr-fr/library/ms645498.aspx) et une gestion correcte du Message "WM_GETDLGCODE". – IInspectable

1

Le message du clavier est envoyé à la fenêtre avec le focus. Ce ne sera pas votre fenêtre principale, la combobox le voit. Cela est normalement géré par la logique de boîte de dialogue intégrée à Windows, mais vous n'avez probablement pas créé de boîte de dialogue. Vous ne savez pas jusqu'où vous voulez aller avec cela, toute bibliothèque de classes gère cela pour vous, principalement en sous-classant les contrôles et en recherchant les touches de navigation dans la boucle de message, avant de distribuer le message.