Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

WM_KEYxx et gestion des tabulations

2 réponses
Avatar
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;
}

2 réponses

Avatar
Christian ASTOR
On 12 juin, 10:20, Sylvain SF wrote:
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
Avatar
Sylvain SF
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.