begin process at 2012 05 30 18:13:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

MFC

 > 

Tabulation dans les champs d'une fenetre


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

Tabulation dans les champs d'une fenetre

dimanche 12 août 2007 à 00:01:09 | Tabulation dans les champs d'une fenetre

billy5938

Bonjour,

Je veux pouvoir parcourir les champs d'édition (ou même des checkBox) d'une fenetre. En utilisant la methode IsDialogMessage dans la boucle de gestion des message et en ajoutant le WS_TABSTOP sur les éléments, tout va bien si les éléments sont des fils direct de la fenetre principale.
Par commodité, je veux regrouper mes boutons et champs dans un GROUPBOX. Comme ça je fais la disposition d'un ensemble et je bouge le tout en ne changeant que les coordonnées du groupbox.  Dans ce cas la mes éléments ne sont plus fils direct de la fenetre principale mais du GROUPBOX. Et dans ce cas là la tabulation ne fonctionne plus.
Je ne vois pas quoi modifier pour faire marcher le tout. Si je vire le IsDialogMessage, j'obtiens bien le VK_TAB via un WM_COMMAND mais uniquement si je suis sur une zone de la fenetre principale. J'avais fait un subclass pour avoir ma methode de gestion de evenement sur les objets du GROUPBOX (j'avais un bouton pour ouvrir une fenetre de selection d'un fichier qui ne fonctionnait plus). Mais dans cette fonction je ne vois passer aucune WM_COMMAND avec le VK_TAB.
Si quelqu'un a une idée ou mieux directement la solution parce que ce serait un grand classique du winapi, je suis preneur

Ci-joint un code simplifier où il y a un groupbox et 4 edit, les deux 1er dans le groupbox (fils du) et les deux autres directement fils de la  fenetre principale.

Cordialement

Pour compiler sous gcc (j'utilise mingw32):
gcc -o simple.exe simple.c -mwindows

----------------------------------------------------------------------

#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
                                                LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS wc;

    wc.style = 0;
    wc.lpfnWndProc = MainWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hinstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    wc.lpszMenuName =  NULL;
    wc.lpszClassName = "MaWinClass";

    if(!RegisterClass(&wc)) return FALSE;

    hwnd = CreateWindow("MaWinClass", "Poblem TABSTOP", WS_DLGFRAME|WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
                                                   NULL, NULL, hinstance, NULL);
    if (!hwnd) return FALSE;

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);


    while (GetMessage(&msg, NULL, 0, 0))
    {
     if (!IsDialogMessage(hwnd, &msg))
     {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
     }
    }
    return msg.wParam;
}
/******************************************************************************/
static HWND hEdit1,hEdit2,hEdit3,hEdit4,gp1;
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:
             gp1=CreateWindowEx(0,"BUTTON","GROUPBOX",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,10,10,250,80,hwnd,NULL,0,NULL);
             hEdit1=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD|WS_VISIBLE|WS_GROUP|WS_TABSTOP,10,20,220,20,gp1,NULL,0,NULL);
             hEdit2=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD|WS_VISIBLE|WS_TABSTOP,10,50,220,20,gp1,0,0,0);
             hEdit3=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD|WS_VISIBLE|WS_GROUP|WS_TABSTOP,20,100,220,20,hwnd,NULL,0,NULL);
             hEdit4=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD|WS_VISIBLE|WS_TABSTOP,20,130,220,20,hwnd,0,0,0);

            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}
 
dimanche 12 août 2007 à 16:57:19 | Re : Tabulation dans les champs d'une fenetre

racpp

Administrateur CodeS-SourceS
Salut,
Normalement, les controles ayant le style WS_TABSTOP doivent avoir la même fenêtre mère. Si tu veux que certains controles se déplacent suivant ton groupbox, tu peux sous-classer ce dernier. Pendant le traitement de WM_MOVE (ou WM_WINDOWPOSCHANGED), tu repositionnes les controles que tu veux par rapport à la nouvelle position du groupbox.
dimanche 12 août 2007 à 19:36:38 | Re : Tabulation dans les champs d'une fenetre

billy5938

Réponse acceptée !
Salut,

Merci pour la proposition de gestion des fenêtres mais c'est un peu lourd à mon goût. Et puis j'ai fini par trouver la solution. Dans le GROUPBOX, à la création de cette fenêtre, il faut mettre WS_EX_CONTROLPARENT pour que le la gestion du WS_TABSTOP soit récursive dans les enfants de celle-ci.
Donc il faut changer le code précedent en:
             gp1=CreateWindowEx(WS_EX_CONTROLPARENT,"BUTTON","GROUPBOX",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,10,10,250,80,hwnd,NULL,0,NULL);

et maintenant tout roule!

Merci


Cette discussion est classée dans : fenetre, hwnd, ws, wc, groupbox


Répondre à ce message

Sujets en rapport avec ce message

Où passent mes tabulations... [ par Nebula ] 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 ape rafraichissement fenetre, ou creation de fenetre dans fenetre [ par kuruma ] Bonjour qq'un pourrait il m'indiquer comment créer une fenetre dans une autre fenetre, ou alors comment allouer une zone de ma fenetre principale, en Application MDI [ par LordBob ] Bonjour a tous,voila j'essaie de créé ma première application MDI, mais j'ai beaucoup de mal, surtout que je n'ai pas trouvé de tutorial sur le net, e Fenetre fille [ par mogwai93 ] Bonjour, je cherche à inserer dans une zone d'une fenetre, une autre fenetre avec scrollbar. sauf que, j'ai des resultats bizarres : --------- LRESU Ajout d'une fenetre supplémentaire en plus de la fenetre principale dans un programme en win32 [ par djin94 ] Bonjour à tous. Je butte actuellement sur un problème. Je souhaite en fait ajouter une fenetre transparente avec CreateWindowEx( ) pour créer une OSD TRANSPARENTE [ par kiki67100 ] Salut voila jai trouver un code mais une fenetre TRANSPARENTE http://files.codes-sources.com/fichier.aspx?id=9615&f=Main.cpp  mais le probleme se que Problème avec fichier manifest [ par Sceyllia ] Bonjour à tous, J'aurais besoin de l'avis de connaisseurs en c/c++ pour m'éclairer sur le soucis que j'ai depuis quelques semaines concernant ce morc Opacité d'une EditBox [ par Parmesan ] Bonjour,Voila j'ai un petit problème que je n'arrive pas à résoudre.Je travaille sur Dev c++ en Windows Applications, en utlisant les api win32Je poss Sous classer plusieurs controles dans une classe [ par julien_boss ] Bonjour,je vous détail l'ossature de ma classe, qui crée une fenetre :jappelle une methode Create() qui va ... créer la fenetre, je fais passer dans l Remplir un combobox win32 api [ par ssefyou ] Bonsoir , comment remplir un combobox sous winapi en c ? j'ai cree un combo en utilisant la fonction createWindowEx() mais je n'arrive pas à le rempl


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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 : 0,811 sec (3)

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