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 :

WinAPI : controle dans des controles


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut WinAPI : controle dans des controles
    Bonjour j'aimerais savoir comment faire pour ajouter par exemple des barre
    Progress Bar ou autre dans des controle -> List View, Statu Bar
    etc...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ben, normalement, un simple CreateWindow() avec l'autre contrôle en parent suffit.
    Le problème, c'est que tu ne pourras pas recevoir les notifications (WM_COMMAND et WM_NOTIFY), puisque c'est l'autre contrôle qui les recevra...

    Sinon, tu peux juste créer le contrôle "par-dessus" l'autre (histoires de Z-order etc.), mais tu devras peut-être spécifier le style WS_CLIPSIBLINGS dans la fenêtre parent...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    Aie d'accord. oui si je ne peux pas recevoir les messages c'est énervant . Il n'y as pas d'autre moyen ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Tu peux toujours créer un contrôle perso qui forwarde les messages vers une fenêtre de ton choix, puis créer une progressbar dans ce contrôle et créer le tout dans la statusbar...

    De toute façon, il me semble qu'une statusbar ne renvoit rien au parent.
    C'est plus gênant si tu veux un bouton, par exemple...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    aie je débute, je n'ai pas tout compris. tu n'aurais pas un petit exemple pour me montrer ceci ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Je n'ai rien sous la main, désolé...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    Je viens de faire un code assez rapidement :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    #include <windows.h>
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK BarreProcedure (HWND, UINT, WPARAM, LPARAM);
    char szClassName[ ] = "MainWindowsApp";
    char szClassNameBarre[ ] = "barre";
    HINSTANCE hThisInstance = 0 ;
    int WINAPI WinMain (HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nFunsterStil)
    {
        hThisInstance = hInstance;
        HWND hwnd;
        HWND hwnd2;
        MSG messages;
        WNDCLASSEX wincl;
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;
        wincl.style = CS_DBLCLKS;
        wincl.cbSize = sizeof (WNDCLASSEX);
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;
        wincl.cbClsExtra = 0;
        wincl.cbWndExtra = 0;
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
        if (!RegisterClassEx (&wincl))
            return 0;
        wincl.lpszClassName = szClassNameBarre;
        wincl.lpfnWndProc = BarreProcedure;
        if (!RegisterClassEx (&wincl))
            return 0;
        hwnd = CreateWindowEx(NULL,
               szClassName,
               "fenetre",
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT,
               CW_USEDEFAULT,
               544,
               375,
               HWND_DESKTOP,
               NULL,
               hThisInstance,
               NULL
               );
        hwnd2 = CreateWindowEx(NULL,
               szClassNameBarre,
               "fenetre",
               WS_OVERLAPPEDWINDOW | WS_CHILD ,
               30,
               30,
               100,
               100,
               hwnd,
               NULL,
               hThisInstance,
               NULL
               );
        if( hwnd2 == NULL )
            return 0 ;
        ShowWindow (hwnd, nFunsterStil);
        ShowWindow (hwnd2, nFunsterStil);
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
        return messages.wParam;
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_DESTROY:
                PostQuitMessage (0);
                break;
            default:
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
        return 0;
    }
    LRESULT CALLBACK BarreProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_CREATE:
                MessageBox(hwnd,"","",MB_OK);
                CreateWindow("BUTTON",
                                "Action",
                                WS_CHILD | WS_VISIBLE,
                                100,100,
                                100,100,
                                hwnd,
                                NULL,
                                hThisInstance,
                                NULL);
                break;
            case WM_COMMAND:
                break;
            case WM_DESTROY:
                PostQuitMessage (0);
                break;
            default:
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
        return 0;
    }
    C'est comme ca que tu voulais dire

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    (attention, WS_OVERLAPPED et WS_CHILD ne peuvent être utilisés en même temps).

    Non, plutôt à un truc de ce genre:
    Code pseudocode : 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
    WinMain()
    {
    RegisterClassEx(FenetrePrincipale)
    RegisterClassEx(HoteDeControle)
    CreateWindow(FenetrePrincipale, WS_OVERLAPPEDWINDOW)
    
    BoucleDeMessages()
    }
    
    ProcFenetrePrincipale()
    {
    case WM_CREATE:
    	CreateWindow(StatusBar, WS_CHILD, hWnd)
    	CreateWindow(HoteDeControle, WS_CHILD, StatusBar, lpParam=hWnd)
    	CreateWindow(Button, WS_CHILD, HoteDeControle)
    	break;
    
    case WM_COMMAND:
    	case Button:
    		MessageBox(hWnd, "Coucou!", "!", MB_OK);
    	break;
    }
    
    ProcHoteDeControle()
    {
    case WM_CREATE:
    	{
    	LPCREATESTRUCT pCs = lParam;
    	SetWindowLongPtr(hWnd, GWLP_USERDATA, pCs->lpCreateParams);
    	}
    	break;
    
    case WM_COMMAND:
    	{
    	HWND hFenetrePrincipale = GetWindowLongPtr(hWnd, GWLP_USERDATA);
    	if(hFenetrePrincipale != NULL)
    		SendMessage(hFenetrePrincipale, WM_COMMAND, wParam, lParam);
    	}	
    	break;
    //Et la même chose pour WM_NOTIFY
    }
    Naturellement, ce pseudocode ne risque pas de compiler. Mais c'est l'idée générale.
    De plus, au lieu de GWLP_USERDATA, tu peux utiliser directement des valeurs dans wincl.cbWndExtra, puisque tu définis toi-même la classe...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    D'accord merci. je viens de tester en faisant de que tu m'as dit :

    fenetre -> dedant une statue barre -> dans la statue une ' fenetre perso '
    mais elle n'apparait pas...

    Je ne sais pas me servir de :
    cbClsExtra
    cbWndExtra
    A quoi servent-ils en faites...
    je les met à 0 tout le temps

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    cbWndExtra sert avec SetWindowLong()/GetWindowLong().
    Mais si tu utilises GWLP_USERDATA, tu n'en as pas besoin.

    PS: Idéalement, la fenêtre perso contient juste le contrôle que tu veux afficher, et elle est visible, sans barre de titre ni contour, et de la même taille.

Discussions similaires

  1. Boucle sur Control : Ordre des controls dans la Liste
    Par juanpa dans le forum Général VBA
    Réponses: 5
    Dernier message: 05/02/2015, 01h16
  2. [VB]inserer automatiquement des controls dans un listbox
    Par oumarsaw dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 05/04/2006, 19h22
  3. ajouter des control dans une onglet de sstab sous VB6
    Par aymane_farissi dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 26/09/2005, 14h44
  4. Liés des controls dans un GroupBox ?
    Par vincthav dans le forum MFC
    Réponses: 4
    Dernier message: 18/08/2005, 18h34
  5. Comment peut on integer des controles dans un prog opengl
    Par franck31400 dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/04/2004, 10h06

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