Où passent mes tabulations...

Signaler
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Bonjour,



En utilisant des richedits dans une fenêtre créée avec CreateWindowEx
et dont les messages sont traités avec IsDialogMessage, je me suis
aperçu que la touche "tabulation" n'était plus traitée ni par les
richedits, ni par IsDialogMessage. J'ai alors pensé résoudre le
problème en traitant WM_GETDLGCODE et en retournant DLGC_WANTALLKEYS,
ce qui permet effectivement à mes richedits de retrouver leur
comportement habituel.



Mais (et c'est là que çà devient amusant), la procédure originale des
richedits retourne déjà cette valeur... J'ai alors fait le petit
programme de test suivant, qui met en avant ce problème :



#include <windows.h>

#include <richedit.h>



static HINSTANCE hInstance = NULL;

static WNDPROC DefRichProcA = NULL;

static WNDPROC DefRichProcB = NULL;



static LRESULT CALLBACK RichWndProcA(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

switch (uMsg) {

case WM_GETDLGCODE:

/* on
renvoie 143, soit DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTALLKEYS |
DLGC_HASSETSEL | DLGC_WANTCHARS */

return 143;

default:

return DefRichProcA(hWnd, uMsg, wParam, lParam);

}

}



static LRESULT CALLBACK RichWndProcB(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

switch (uMsg) {

case WM_GETDLGCODE:

/* ceci a le même effet que l'autre routine, et renvoie 143 aussi */

return CallWindowProc(DefRichProcB, hWnd, uMsg, wParam, lParam);

default:

return DefRichProcB(hWnd, uMsg, wParam, lParam);

}

}



static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

switch (uMsg) {

HWND hRich;

case WM_CREATE:

hRich =
CreateWindowEx(WS_EX_CLIENTEDGE, RICHEDIT_CLASS, "Tabulez-moi, çà
marche !", WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL
| ES_DISABLENOSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE |
ES_WANTRETURN, 10, 10, 280, 350, hWnd, NULL, hInstance, NULL);

DefRichProcA = (WNDPROC) GetWindowLong(hRich, GWL_WNDPROC);

SetWindowLong(hRich, GWL_WNDPROC, (LONG) RichWndProcA);

hRich =
CreateWindowEx(WS_EX_CLIENTEDGE, RICHEDIT_CLASS, "Tabulez-moi, çà
marche pas...", WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_HSCROLL |
WS_VSCROLL | ES_DISABLENOSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL |
ES_MULTILINE | ES_WANTRETURN, 300, 10, 280, 350, hWnd, NULL, hInstance,
NULL);

DefRichProcB = (WNDPROC) GetWindowLong(hRich, GWL_WNDPROC);

SetWindowLong(hRich, GWL_WNDPROC, (LONG) RichWndProcB);

return 0;

case WM_CLOSE:

DestroyWindow(hWnd);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

default:

return DefWindowProc(hWnd, uMsg, wParam, lParam);

}

}



INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) {

WNDCLASSEX wc;

HWND hWnd;

MSG msg;

LoadLibrary("riched20.dll");

wc.cbSize = sizeof(WNDCLASSEX);

wc.style = CS_PARENTDC;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance hInstance hInst;

wc.hIcon = LoadImage(NULL, MAKEINTRESOURCE(OIC_INFORMATION), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR | LR_SHARED);

wc.hCursor =
LoadImage(NULL, MAKEINTRESOURCE(OCR_NORMAL), IMAGE_CURSOR, 0, 0,
LR_DEFAULTCOLOR | LR_DEFAULTSIZE | LR_SHARED);

wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);

wc.lpszMenuName = NULL;

wc.lpszClassName = "Bug tabulations";

wc.hIconSm = LoadImage(NULL, MAKEINTRESOURCE(OIC_INFORMATION), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR | LR_SHARED);

RegisterClassEx(&wc);

hWnd =
CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CONTROLPARENT, "Bug
tabulations", "Bug tabulations", (WS_CLIPSIBLINGS |
WS_OVERLAPPEDWINDOW) ^ (WS_SIZEBOX | WS_MAXIMIZEBOX), CW_USEDEFAULT,
CW_USEDEFAULT, 600, 400, NULL, NULL, wc.hInstance, NULL);

ShowWindow(hWnd, SW_SHOWNORMAL);

UpdateWindow(hWnd);

while (GetMessage(&msg, NULL, 0, 0) > 0) {

if (IsDialogMessage(hWnd, &msg) == 0) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return msg.wParam;

}



Le premier richedit fonctionne parfaitement, alors que le deuxième non.
Quelqu'un a t'il une explication à ce comportement des plus étranges,
constaté sous MinGW et MSVC ?



PS : le code est disponible sous une forme plus lisible (coloré et indenté) ici : http://athanatos.free.fr/temp/tabulations.htm

2 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Que fait "IsDialogMessage(hWnd, &msg)" dans ton code ?

ciao...
BruNews, MVP VC++
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Là pas grand chose, ce n'est évidemment un exemple minimaliste... Dans
le véritable code, elle sert à fournir la même interface "clavier" à ma
fenêtre qu'une dialog. Tu vas encore me dire d'utiliser des dialogs,
mais j'ai essayé et cela ne me convient pas vraiment : j'aime pas du
tout la syntaxe des .rc, et les templates en mémoire c'est une horreur
(exemple sans frais : http://athanatos.free.fr/temp/dlg.htm) :-/



De plus, les dialog étant "interprétées" par Windows à coups de
CreateWindowEx (selon l'aide), il doit bien y avoir moyen de gérer la
même chose par l'API... Non ?