IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

(win32) Fenetre fille avec scrollbar


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 31
    Points : 28
    Points
    28
    Par défaut (win32) Fenetre fille avec scrollbar
    Bonjour

    je suis nouveau sur le forum,
    plutot, c'est mon 1er message

    bref...
    voici mon probleme :


    je cherche à inserer dans une zone d'une fenetre, une autre fenetre avec scrollbar.
    qui par la suite ressemblera à ca :

    sauf que, j'ai des resultats bizarres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HWND hBuffer, hBuffer2;
            
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                     hBuffer = CreateWindowEx (
               0,                   
               szClassName,         
               "Test",       
               WS_VISIBLE | WS_CHILD | WS_VSCROLL, 
               50,       
               50,       
               300,                 
               200,                 
               hwnd,        
               NULL,                
               hInst,       
               NULL                 
               );
    
    hBuffer2 = CreateWindow(
                                   "Edit",
                                   TEXT(""),
                                   WS_CHILD|WS_VISIBLE|WS_BORDER|ES_CENTER ,
                                   1,
                                   20,
                                   100,
                                   20,
                                   hBuffer,
                                   (HMENU)(1002),
                                   hInst,
                                   NULL);
    
                 break;   
               
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    le reste étant simplement la creation de la fenetre principale avec attachement à cette methode...

    avec ce code, j'ai ma fenetre principale, une fenetre avec scrollbar incluse dans la principale
    et 4 objets "edit"

    1) deja, pourquoi 4 ? (le 4 semble dépendre de la taille de la fenetre hbuffer)
    et pourquoi sont-ils en "cascade" ?

    2) si je fait un setwindowlong sur hbuffer
    et que dans le wm_create, je cree le hbuffer2, là le champ edit ne se crée pas
    d'où vient le problème ?


    merci

    PS : je developpe avec Devcpp

  2. #2
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    salut et bienvenue,

    pour ton point 1, je pense que chaque CreateWindow génère un WM_CREATE (ton edit aussi).
    C'est pour cela que tu te retrouves avec plusieurs Edit en cascade...

    dans le message envoyé, tu as aussi le handle de la fenetre à qui le message est destiné, si mes souvenirs sont bon....

    pour ton point 2, pas compris, et je ne saurai répondre de toute façon...

    bon courage.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par dug
    salut et bienvenue,

    pour ton point 1, je pense que chaque CreateWindow génère un WM_CREATE (ton edit aussi).
    C'est pour cela que tu te retrouves avec plusieurs Edit en cascade...

    dans le message envoyé, tu as aussi le handle de la fenetre à qui le message est destiné, si mes souvenirs sont bon....

    pour ton point 2, pas compris, et je ne saurai répondre de toute façon...

    bon courage.
    pour le point 1, zut !
    t'as raison, je viens de tracer le code et c'est recursif

    pour le point 2, setwindowlong te permet de surcharger les evenements de l'objet passé en parametre !

    petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message) 
    	{
    	case WM_CREATE:
    	.....
    	break;
    
    
    	default:
    		break;
    	}
    	// Appeler la procédure originale:
    	return CallWindowProc(OldEditProc, hwnd, message, wParam, lParam);
    }
    
    
    et l'appel :
     OldEditProc= (WNDPROC) SetWindowLong(hBuffer, GWL_WNDPROC, (LPARAM)EditProc);

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tout dépend à qui est associé WindowProcedure. Si WindowProcedure est associé à la classe szClassName, tu as un problème de serpent qui se mord la queue. Ta fenêtre s'auto-crée à sa création...
    Donc en fait tu crées de manière récursive une fenêtre dans celle en cours de création, et cela à chaque fois au pixel (50,50), donc ça fait une cascade. Je pense que tu n'en n'a pas 4, mais beaucoup plus, mais qui dépassent les limites visibles.
    D'apres ce que j'ai compris, c'est pas szClassName qu'il faut utiliser dans le 1° CreateWindow, mais le nom d'une classe affichant ton entête. Un STATIC pourrait faire l'affaire.
    2) si tu fais un SetWindowLong, alors c'est que l'EDIT a déjà été créé avec succès, puisque tu as son handle (ou alors il est invalide, et son échec est du a autre chose). SetWindowLong ne permet pas de surcharger des évènements, mais de modifier diverses choses d'une fenêtre. SetWindowLong( GWL_WNDPROC ) permet de faire du subclassing, c.a.d de remplacer la procédure de fenêtre par la tienne. Dans ta nouvelle procedure de fenêtre, là oui, tu peux remplacer le traitement de certains messages par un traitement à toi. Mais, les messages que tu ne remplaces pas, il faut les "donner" à la procedure remplacée pour qu'elle fasse son travail, comme par exemple dessiner le controle, ce qui doit expliqué qu'il est pas visible dans ton cas. Appeles-tu bien la WndProc remplacée ?
    Au passage tu ne peux pas recevoir WM_CREATE dans une wndproc de subclass, car tu subclass un controle déjà créé.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    merci pour tes explications

    donc j'ai bien un truc recursif
    en fait, j'ai 15 objets...


    j'arrive à gérer les scrolls sur une fenetre tout entiere

    ce que je voudrais faire, c'est que cette "fenetre entiere" soit integree dans une partie de fenetre
    dans ce cas, je ne crois pas que SetWindowLong puisse m'aider...

    d'apres ce que j'ai compris, il me faut 2 "windowprocedure"
    1 pour la fenetre generale, 1 pour la fenetre integree (la zone qui a les scrolls)
    mais là, je bloque...

    merci

Discussions similaires

  1. [XL-2010] Ajuster automatiquement fenetre userform avec une scrollbar
    Par bastou93 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/06/2011, 11h33
  2. Réponses: 22
    Dernier message: 22/06/2011, 07h13
  3. Réponses: 7
    Dernier message: 15/06/2007, 09h55
  4. Quitter un processus avec un fenetre fille
    Par ludovic85 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/02/2007, 12h29
  5. [WIN32] fenetre fille au 1er plan
    Par Grulim dans le forum MFC
    Réponses: 3
    Dernier message: 31/01/2006, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo