WM_KEYxx et gestion des tabulations

Le
Sylvain SF
Bonjour,

le titre aurait pu être comment traiter WM_KEYDOWN / WM_KEYUP pour
gérer la sélection d'un edit control (WC_EDIT) via la touche [TAB]
dans une fenêtre parent en contenant plusieurs.

mes fenêtres sont généralement construites via des panels et
containers imbriqués, par exemple:

|-|
| panel |
| |--| |
| | container | |
| | [ edit control ] | |
| |--| |
|-|

lorsque la touche TAB est pressée alors qu'un edit control a le focus,
aucun msg WM_KEYDOWN n'est reçu et le msg WM_KEYUP est reçu par la
fenêtre de niveau n-2 (ie le 'panel' et non le 'container').

comment faire en sorte que le "bon parent" reçoive les événements
claviers ou comment dispatcher correctement un caractère TAB ??

merci d'avance.
Sylvain.


exemple minimaliste:

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

ATOM RegisterClass(HINSTANCE hInstance, LPCSTR className, COLORREF bgColor)
{
WNDCLASSEX wcex;
::memset(&wcex, 0, sizeof(wcex));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = ::CreateSolidBrush(bgColor);
wcex.lpszClassName = className;
return ::RegisterClassEx(&wcex);
}

HWND InitInstance(HINSTANCE instance, LPCSTR className, int nCmdShow)
{
if (RegisterClass(instance, "FrameUI", RGB(0, 192, 192)) == NULL ||
RegisterClass(instance, "PanelUI", RGB(192, 0, 192)) == NULL ||
RegisterClass(instance, "ContainerUI", RGB(192, 192, 0)) == NULL)
return NULL;

HWND hWnd = ::CreateWindow(className, "Composite Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 400, 300, NULL, NULL, instance, NULL);
if (!hWnd)
return NULL;

HWND panel = ::CreateWindow("PanelUI", NULL, WS_CHILD | WS_VISIBLE,
20, 20, 360, 240, hWnd, NULL, instance, NULL);

HWND container1 = ::CreateWindow("ContainerUI", NULL, WS_CHILD |
WS_VISIBLE,
20, 20, 150, 200, panel, NULL, instance, NULL);

int editStyle = WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP |
ES_AUTOHSCROLL;
::CreateWindow(WC_EDIT, NULL, editStyle, 10, 10, 100, 20,
container1, NULL, instance, NULL);
::CreateWindow(WC_EDIT, NULL, editStyle, 10, 40, 100, 20,
container1, NULL, instance, NULL);
::CreateWindow(WC_EDIT, NULL, editStyle, 10, 70, 100, 20,
container1, NULL, instance, NULL);

HWND container2 = ::CreateWindow("ContainerUI", NULL, WS_CHILD |
WS_VISIBLE,
190, 20, 150, 200, panel, NULL, instance, NULL);

::CreateWindow(WC_EDIT, NULL, editStyle, 10, 10, 100, 20,
container2, NULL, instance, NULL);
::CreateWindow(WC_EDIT, NULL, editStyle, 10, 40, 100, 20,
container2, NULL, instance, NULL);
::CreateWindow(WC_EDIT, NULL, editStyle, 10, 70, 100, 20,
container2, NULL, instance, NULL);

::ShowWindow(hWnd, nCmdShow);
::UpdateWindow(hWnd);
return hWnd;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch (message){
case WM_PAINT:
hdc = ::BeginPaint(hWnd, &ps);
::EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
default:
return ::DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

int __stdcall _tWinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int cmdShow)
{
HWND hWnd = InitInstance(instance, "FrameUI", cmdShow);
if (hWnd == NULL)
return -1;

MSG msg;
while (::GetMessage(&msg, NULL, 0, 0)){
if (!::IsDialogMessage(hWnd, &msg)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #19547791
On 12 juin, 10:20, Sylvain SF
Bonjour,

le titre aurait pu être comment traiter WM_KEYDOWN / WM_KEYUP pour
gérer la sélection d'un edit control (WC_EDIT) via la touche [TAB]
dans une fenêtre parent en contenant plusieurs.

mes fenêtres sont généralement construites via des panels et
containers imbriqués, par exemple:

|-------------------------|
| panel                   |
|  |--------------------| |
|  | container          | |
|  | [ edit control ]   | |
|  |--------------------| |
|-------------------------|

lorsque la touche TAB est pressée alors qu'un edit control a le focus,
aucun msg WM_KEYDOWN n'est reçu et le msg WM_KEYUP est reçu par la
fenêtre de niveau n-2 (ie le 'panel' et non le 'container').

comment faire en sorte que le "bon parent" reçoive les événements
claviers ou comment dispatcher correctement un caractère TAB ??



Il faut que chaque container ait le style étendu WS_EX_CONTROLPARENT
Sylvain SF
Le #19548831
Christian ASTOR a écrit :

Il faut que chaque container ait le style étendu WS_EX_CONTROLPARENT



ça marche bcp mieux avec, en effet, merci Christian.

SF.
Publicité
Poster une réponse
Anonyme