Partage
  • Partager sur Facebook
  • Partager sur Twitter

Navigation de fenêtre Win32 API?

Sujet résolu
    22 mai 2018 à 12:50:15

    Bonjour à tous,

    Je viens tout juste de me mettre à créer une interface graphique (avec Win32 API en C++) pour un projet

    J'aimerai savoir s'il est possible de faire en sorte que si on appui sur un bouton, cela ouvre une autre fenêtre un peu comme sur internet, mais je parle pas d'un pop-up, je parle bien d'une fenêtre dans laquelle on rentre, je ne vois pas trop comment faire

    Pour vous faire une petite idée, voici une image

    Voici l'interface que j'ai réalisé, j'aimerai que l'appui sur un bouton nous amène sur une autre page

    Là je l'ai fait sur paint mais j'aimerai que ça donne quelque chose comme celà

    Je ne demande pas à ce qu'on fasse le code à ma place mais je tiens à savoir si c'est possible, et si oui avec quelle fonction?

    -
    Edité par SimonLancelot1 22 mai 2018 à 12:50:43

    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2018 à 14:18:47

      Regarde du coté des évenements clavier et de la fonction CreateWindows().
      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2018 à 17:11:36

        Oui, c'est possible. Par contre tu ne dis pas sur quoi tu bloques. Tu sais déjà créer une fenêtre. Donc je suppose que c'est de traiter l'appuis sur le bouton qui te bloque.

        Donc en Win32 les événements sont envoyer sous forme de messages, que l'on doit traiter dans ce que l'on appelle la procédure de fenêtre. Comme il s'agit d'un bouton, l'appui du bouton génère un message WM_COMMAND, tu vérifies en testant l'ID de la commande que c'est bien le bouton qui l'envoi, si oui tu crées ta nouvelle fenêtre.

        Le mieux, c'est que tu montre ce que tu as déjà fait, ça sera plus facile pour te guider. 

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2018 à 8:05:51

          Voici le code, en fait j'ai réussit à faire en sorte que ça ouvre une nouvelle fenêtre, mais c'est bien un pop-up, je ne vois pas comment faire en sorte que ça reste sur la fenêtre principale et en changeant de page, régénérer une page avec des nouveaux boutons en fait

          //      Auteur : LANCELOT Simon
          //      Date de début : 22.05.2018
          //      Description : Dans le cadre de ma formation en BTS SNEC
          
          //===============================================================
          
          //https://openclassrooms.com/courses/apprentissage-de-l-api-windows/les-bases-27
          //https://www.youtube.com/watch?v=8GCvZs55mEM PART 1
          //https://www.youtube.com/watch?v=7K6HCeog09c PART 2
          //https://msdn.microsoft.com/fr-fr/libra    MessageBox(NULL,"Version 1.0","Version",MB_OK); //Arg 2 : Message , Arg 3 : Titlery/windows/desktop/ms633576(v=vs.85).aspx
          
          //===============================================================
          
          #include <windows.h>
          #include "main.h"
          
          LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);
          char Credits=0; char Version=0; char About=0;
          
          void AddMenus(HWND); // Prototype
          void AddControls(HWND hWnd); // Prototype
          void LoadImages(); // Prototype
          void ElecPopupWindow(HINSTANCE hInst); //Prototype
          void LangPopupWindow(HINSTANCE hInst); //Prototype
          void displayElecWin(HWND hWnd); // Prototype
          void displayLangWin(HWND hWnd); // Prototype
          
          HWND hTitle; HWND hElectTitle; // Handler pour fenêtre
          HMENU hMenu; // Handler pour menu
          HBITMAP hTitleImage; HBITMAP hElecTitleImage; // Handler pour image
          
          int WINAPI WinMain(HINSTANCE hInst , HINSTANCE hPrevInst, LPSTR args, int ncmdshow) //-->> // Point d'entrée application Windows
          {                                                                                          // Argument 1 : C'est le handle d'instance de l'application. C'est un numéro unique attribué par le système d'exploitation qui lui permet de l'identifier
              WNDCLASSW wc = {0}; // Structure - http://ponte.s206.xrea.com/typedef/WNDCLASSW.html   // Argument 2 : Toujours null pouur les applications Win32
                                  // Nom de la structure : wc                                        // Argument 3 : Pointeur sur la ligne de commande
                                                                                                     // Argument 4 : Identificateur qui indique comment Windows désire afficher la fenêtre (normal, caché, minimisé ...).
              wc.hbrBackground = (HBRUSH)COLOR_WINDOW; // Couleur Windows pour la fenêtre
              wc.hCursor = LoadCursor(NULL,IDC_ARROW);
              wc.hInstance = hInst;
              wc.lpszClassName = L"MainWindow"; // Nom de la fenêtre (pour l'identification)
              wc.lpfnWndProc = WindowProcedure; // Procédure windows qui prend en compte tout ce que la fenêtre a à faire
          
              if(!RegisterClassW(&wc)) // Succès ?
                  return -1;
          
              ElecPopupWindow(hInst);
              LangPopupWindow(hInst);
          
              //Main Window Creation
              CreateWindowW(L"MainWindow",L"BTS SNEC Guide", WS_OVERLAPPEDWINDOW | WS_VISIBLE,350,150,640,480,
                           NULL, NULL, NULL, NULL); // Param 1 Coordonée de longueur, Param 2 Coordonnée de largeur
                                                    // Param 3 Longueur démarrage, Param 4 Largeur démarrage
              MSG msg = {0};
          
              while(GetMessage(&msg, NULL, NULL, NULL))
              {
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
              }
              return 0;
          }
          
          LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
          {
              switch (msg)
              {
              case WM_COMMAND:
                  switch (wp)
                  {
                  case FILE_MENU_EXIT:
                      DestroyWindow(hWnd); // Quitter
                      break;
                  case HELP_MENU_VER:
                      MessageBeep(MB_ICONINFORMATION); // Son
                      MessageVersion(Version); //Arg 2 : Message , Arg 3 : Title
                      break;
                  case HELP_MENU_CRDTS:
                      MessageCredits(Credits);
                      break;
                  case HELP_MENU_ABOUT:
                      MessageAbout(About);
                      break;
                  case ELEC:
                      //MessageBox(NULL,"Success","Success",MB_ICONINFORMATION);
                      displayElecWin(hWnd);
                      break;
                  case PROG:
                      //MessageBox(NULL,"Success","Success",MB_ICONINFORMATION);
                      displayLangWin(hWnd);
                      break;
                  }
                  break;
          
          
              case WM_CREATE:
                  LoadImages();
                  AddMenus(hWnd);
                  AddControls(hWnd);
                  break;
              case WM_DESTROY:
                  PostQuitMessage(0);
                  break;
              default:
                  return DefWindowProcW(hWnd,msg,wp,lp);
              }
          }
          
          /**************************************/
          /*              MENUS                 */
          /**************************************/
          
          void AddMenus(HWND hWnd)
          {
          /* MENU INIT */
          
              hMenu = CreateMenu();
              HMENU hFileMenu = CreateMenu(); // File Menu (1)
              HMENU hHelpMenu = CreateMenu(); // Help Menu (2)
              HMENU hSubMenuHelp = CreateMenu(); // Sub Menu (1)
          
          /* SUB MENUS */
          
              // Help Menu
              AppendMenu(hSubMenuHelp, MF_STRING, HELP_MENU_CRDTS, "Credits"); // Sub Menu 1 dans Help
              AppendMenu(hSubMenuHelp, MF_SEPARATOR, NULL, NULL); // Séparateur dans la liste
              AppendMenu(hSubMenuHelp, MF_STRING, HELP_MENU_ABOUT, "About"); // Sub Menu 1 dans Help
          
          /* MENUS IN TOOLBAR MENUS */
          
              // File Menu
              AppendMenu(hFileMenu, MF_STRING, NULL, "Unfinished");
              AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL); // Séparateur dans la liste
              AppendMenu(hFileMenu, MF_STRING, FILE_MENU_EXIT, "Exit"); // Menu 3 dans File
          
              // Help Menu
              AppendMenu(hHelpMenu, MF_POPUP, (UINT_PTR)hSubMenuHelp,"Information"); // Menu 1 dans Help
              AppendMenu(hHelpMenu, MF_SEPARATOR, NULL, NULL); //Séparateur dans la liste
              AppendMenu(hHelpMenu, MF_STRING, HELP_MENU_VER, "Version 1.0 U"); // Menu 3 dans File (Version Jour 1 Edition 1 - début projet 22.05.2018)
          
          /* TOOLBAR MENUS */
          
              AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu,"File"); // File - Argument 2 : Popup au clic , Argument 3 : ID , Argument 4 : nom du menu
              AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hHelpMenu,"Help"); // Help
          
              SetMenu(hWnd, hMenu);
          }
          
          /**************************************/
          /*            SUB WINDOWS             */
          /**************************************/
          
          void AddControls(HWND hWnd)
          {
              //[TITLE]
          /*  CreateWindowW(L"Static",L"BTS SNEC Guide", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 220, 30, 200, 30, hWnd,
                            NULL, NULL, NULL); //Child window (arg 1 : nom, arg 2 : text) // Param 1 : Pos X Param 2 : Pos Y, Param 3 Long Param 4 Larg*/
          
              //[ENTER YOUR NAME]
              CreateWindowW(L"Edit",L"Your name here", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 15,35,125,20, hWnd, NULL, NULL, NULL);
          
              //[ELECTRICITY BUTTON]
              CreateWindowW(L"Button",L"Electricity", WS_VISIBLE | WS_CHILD | SS_CENTER, 220, 90, 200, 30, hWnd, (HMENU)ELEC, NULL, NULL);
          
              //[C LANGUAGE BUTTON]
              CreateWindowW(L"Button",L"C Language", WS_VISIBLE | WS_CHILD | SS_CENTER, 220,150, 200, 30, hWnd, (HMENU)PROG, NULL, NULL);
          
              //[EXIT BUTTON]
              CreateWindowW(L"Button",L"Exit", WS_VISIBLE | WS_CHILD | SS_CENTER, 220,210, 200, 30, hWnd, (HMENU)FILE_MENU_EXIT, NULL, NULL);
          
              // Title Image
              hTitle = CreateWindowW(L"Static",NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 220,30,200,30, hWnd, NULL, NULL, NULL);
              SendMessageW(hTitle, STM_SETIMAGE,IMAGE_BITMAP, (LPARAM)hTitleImage);
          }
          
          /**************************************/
          /*               IMAGES               */
          /**************************************/
          
          void LoadImages()
          {
              // Static Image
              hTitleImage = (HBITMAP)LoadImageW(NULL,L"Title.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
              hElecTitleImage = (HBITMAP)LoadImageW(NULL,L"Electricity.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
          
          }
          
          /**************************************/
          /*            FENETRE ELEC            */
          /**************************************/
          
          // Procédure
          LRESULT CALLBACK ElecClassProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
          {
              switch(msg)
              {
              case WM_COMMAND:
                  switch (wp)
                  {
                  case ELEC_CLOSE:
                      DestroyWindow(hWnd);
                      break;
                  }
              case WM_CLOSE:
                  DestroyWindow(hWnd);
                  break;
              case WM_CREATE:
                  LoadImages();
              default:
                  return DefWindowProcW(hWnd,msg,wp,lp); // Retour à la fenêtre principale "MainWindow"
              }
          }
          
          // Structuration de la fenêtre
          void ElecPopupWindow(HINSTANCE hInst)
          {
              WNDCLASSW ElecWin = {0};
          
              ElecWin.hbrBackground = (HBRUSH)COLOR_WINDOW;
              ElecWin.hCursor = LoadCursor(NULL,IDC_ARROW);
              ElecWin.hInstance = hInst;
              ElecWin.lpszClassName = L"ElecClass";
              ElecWin.lpfnWndProc = ElecClassProcedure;
          
              RegisterClassW(&ElecWin);
          }
          
          void displayElecWin(HWND hWnd)
          {
              HWND hElecTitle;
              HWND hElec = CreateWindowW(L"ElecClass",L"Electricity",WS_VISIBLE | WS_OVERLAPPEDWINDOW,50,10,1280,720, hWnd, NULL, NULL, NULL);
          
              CreateWindowW(L"Button",L"Back",WS_VISIBLE | WS_CHILD, 20, 620, 100, 40, hElec, (HMENU)ELEC_CLOSE, NULL, NULL);
          
              hElecTitle = CreateWindowW(L"Static",NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 500,50,0,0, hElec, NULL, NULL, NULL); // Electricity Title
              SendMessageW(hElecTitle, STM_SETIMAGE,IMAGE_BITMAP, (LPARAM)hElecTitleImage);
          }
          
          
          /**************************************/
          /*         FENETRE LANGAGE C          */
          /**************************************/
          
          // Procédure
          LRESULT CALLBACK LangClassProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
          {
              switch(msg)
              {
              case WM_COMMAND:
                  switch (wp)
                  {
                  case LANG_CLOSE:
                      DestroyWindow(hWnd);
                      break;
                  }
              case WM_CLOSE:
                  DestroyWindow(hWnd);
                  break;
              default:
                  return DefWindowProcW(hWnd,msg,wp,lp); // Retour à la fenêtre principale "MainWindow"
              }
          }
          
          // Structuration de la fenêtre
          void LangPopupWindow(HINSTANCE hInst)
          {
              WNDCLASSW LangWin = {0};
          
              LangWin.hbrBackground = (HBRUSH)COLOR_WINDOW;
              LangWin.hCursor = LoadCursor(NULL,IDC_ARROW);
              LangWin.hInstance = hInst;
              LangWin.lpszClassName = L"LangClass";
              LangWin.lpfnWndProc = LangClassProcedure;
          
              RegisterClassW(&LangWin);
          }
          
          void displayLangWin(HWND hWnd)
          {
              HWND hLang = CreateWindowW(L"LangClass",L"C Language",WS_VISIBLE | WS_OVERLAPPEDWINDOW,50,10,1280,720, hWnd, NULL, NULL, NULL);
          
              CreateWindowW(L"Button",L"Back",WS_VISIBLE | WS_CHILD, 20, 620, 100, 40, hLang, (HMENU)LANG_CLOSE, NULL, NULL);
          
          }
          
          
          
          /*
          
          === Momento===
          MessageBox(NULL,"Hello","My first GUI",MB_OK);
          
          AppendMenu(NOM DU MENU DANS LEQUEL IL SE SITUE, TYPE (Popup, String, Separator), ID , " NOM"); // Syntaxe
          
          Param ES_MULTILINE pour plusieurs ligne sur zone de texte
                ES_AUTOSCROLL
                ES_AUTOHSCROLL horizontal
                ES_AUTOVSCROLL vertical
          
          */
          

          Et voici le main.h

          #ifndef MAIN_H_INCLUDED
          #define MAIN_H_INCLUDED
          
          #define FILE_MENU_EXIT 1
          #define HELP_MENU_VER 2
          #define HELP_MENU_CRDTS 3
          #define HELP_MENU_ABOUT 4
          
          #define ELEC 5
          #define PROG 6
          
          #define ELEC_CLOSE 7
          #define LANG_CLOSE 8
          void MessageCredits(char Credits)
          {
              MessageBox(NULL,"Special thanks to :\n\n- The Pentamollis Project for his really helpful tutorials\n- Microsoft for C++ manual which helped me in understanding the syntax better\n   (https://msdn.microsoft.com)","Credits",MB_OK);
          }
          
          void MessageVersion(char Version)
          {
              MessageBox(NULL,"Version 1.0 U","Version",MB_ICONINFORMATION); //Arg 2 : Message , Arg 3 : Title
          }
          
          void MessageAbout(char About)
          {
              MessageBox(NULL,"Author : LANCELOT Simon\nCreation Date : 22-05-2018\nLatest Update: 22-05-2018","About BTS SNEC Guide",MB_ICONINFORMATION); //Arg 2 : Message , Arg 3 : Title
          }
          #endif // MAIN_H_INCLUDED
          



          -
          Edité par SimonLancelot1 23 mai 2018 à 8:09:23

          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2018 à 10:05:15

            Salut,

            Un 'Tab Control' pourrait peut-être te convenir

            ...

            -
            Edité par magma 23 mai 2018 à 10:05:44

            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2018 à 15:47:43

              Je crois avoir compris, tu veux que ce soit la même fenêtre, mais avec un autre design, c'est cela ? 

              Une solution est de faire des template de boîte de dialog sans barre de titre que tu incrustes dans la fenêtre (WS_CHILD),  que tu rends visible ou pas selon tes besoins.

              • Partager sur Facebook
              • Partager sur Twitter

              Navigation de fenêtre Win32 API?

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown