begin process at 2012 05 29 15:03:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Où passent mes tabulations...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Où passent mes tabulations...

lundi 10 janvier 2005 à 03:39:28 | Où passent mes tabulations...

Nebula

Membre Club
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
lundi 10 janvier 2005 à 10:16:23 | Re : Où passent mes tabulations...

BruNews

Administrateur CodeS-SourceS
Que fait "IsDialogMessage(hWnd, &msg)" dans ton code ?

ciao...
BruNews, MVP VC++
lundi 10 janvier 2005 à 11:09:34 | Re : Où passent mes tabulations...

Nebula

Membre Club
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 ?


Cette discussion est classée dans : hwnd, ws, wparam, wc, wndproc


Répondre à ce message

Sujets en rapport avec ce message

Pb sur un ptit bout de prog en DirectX.... [ par Haldwin ] Salut a tous....Voila j'ai deux ptits pbs quand je lance cette appli ci-dessous... (VC++)La première est q'une fois sur deux ma variable hWnd apres le thread sur WndProc [ par kidpigeyre ] G une fonction WndProc chargé de réaliser tout mon programme (application GUI) (avec fenetre windows) et jmerai pouvoir faire un thread de cette fonct Edit Control [ par cybermatthieu ] Bonjours,Je suis en Train d'apprendre comment progrmmer en Win32 avec la Class Windows.h. Ce petit programme ne fait q'afficher des caracter mais j'ai ouvrir une 2eme fenetre avec editbox et tout et tout, c'est possible? [ par Arnaud16022 ] Hello tout le monde!je voudrais mettre un bouton dans une fenetre (ca c'est facile), mais seulement quand on clique dessus un autre fenetre s'ouvre, a Savoir quand on clique sur un bouton [ par cyberlewis ] Slt à tous, Voilà j'ai un code que j'ai fait, et normalement si on cliques sur les boutons, ça lance la fonction Encode() ou Decode() en fonction du b Mélange entre C++ et Win32 [ par vecchio56 ] J'ai décidé d'encapsuler mes fenêtres dans des classes, mais je me trouve confronté à un problème: en gros je n'arrive pas à changer de WndProc en uti pb de CreateWindowEx [ par graall ] Bonjour,j'ai un pb dans une API ://---------------------------------------// dans le fichier mainlib.hpp ://--------------------------------------- Creer un controle standard API Win32 [ par Kazuya ] Bojour,Alors voila, j'essaie de me mettre aux API win32 et la j'ai un petit probleme, lorsque j'affiche un controle dans ma feuille principale, il sci Problème de linker dans programme de base. [ par vith17 ] Bonjour,J'ai tapé le code suivant sous Dev-C++. Lorsque je lance la compilation, il me revoie l'erreur suivante :    [Linker error] undefined referenc c++ API Windows : sous classement de fenetre dans une classe [ par _Jonathan ] Bonjour, je cherche à créer un controle de type Edit en utilisant une classe. Le probleme, c'est que je souhaite redéfinir la procedure callback du co


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales