Application MDI dans une classe

PLUiK Messages postés 46 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 25 août 2006 - 1 juil. 2005 à 13:41
PLUiK Messages postés 46 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 25 août 2006 - 2 juil. 2005 à 12:16
Salut!
Je voudrais savoir s'il est possible de coder une
application MDI en C++ (en mettant presque tout le code
dans la classe):

#include <windows.h>

//Code de la classe
class CMDIApp
{
  HWND hMain;
  HWND hMDIClient; //Client MDI
  HINSTANCE hInst;
  static LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  {
    CMDIApp * MDIApp = (CMDIApp *)GetWindowLong (hWnd, GWL_USERDATA);
    switch (uMsg)
    {
      case WM_CREATE:
        SetWindowLong (hWnd, GWL_USERDATA, (LONG) ((LPCREATESTRUCT) lParam) -> lpCreateParams);
        MDIApp = (CMDIApp*) GetWindowLong (hWnd, GWL_USERDATA); //On obtient la classe &#224; nouveau (car avant, le pointeur n'&#233;tait pas valide)
        CLIENTCREATESTRUCT ccs;
        ccs.hWindowMenu  = NULL;
        ccs.idFirstChild = 500;
        MDIApp -> hMDIClient = CreateWindow ("MDIClient", NULL,
              WS_CHILD | WS_CLIPCHILDREN |WS_VSCROLL | WS_HSCROLL, 0, 0, 0, 0,
                 MDIApp -> hMain, (HMENU) 1, MDIApp -> hInst, (PVOID) &amp;ccs);
        return0;
    }
    return DefFrameProc (hWnd, MDIApp -> hMDIClient, uMsg, wParam, lParam); //Je pense que l'erreur se produit ici
  }
  public:
    CMDIApp (HINSTANCE hInstance){hInst = hInstance;}
    BOOL CreateWnd ()
    {
      WNDCLASS wc; //Classe

      wc.style = 0;
      wc.lpfnWndProc = WndProc;
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;
      wc.hInstance = hInst;
      wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
      wc.hCursor = LoadCursor (NULL, IDC_ARROW);
      wc.hbrBackground = GetSysColorBrush (COLOR_BTNFACE);
      wc.lpszMenuName = NULL;
      wc.lpszClassName = "WndClass";

      if (!RegisterClass (&amp;wc)) //Enregistrement de la classe
return FALSE;

      //Cr&#233;ation de la fen&#234;tre
      hMain = CreateWindow ("WndClass", "Titre", WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            HWND_DESKTOP, NULL, hInst, this);

      if (hMain == NULL)
        return FALSE;

      ShowWindow (hMain, SW_SHOW); //Affichage de la fen&#234;tre

      MSG msg;
      while (GetMessage (&amp;msg, NULL, 0, 0))
      {
        TranslateMessage (&amp;msg);
        DispatchMessage (&amp;msg);
      }
      return TRUE;
    }
};

//WinMain
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hprevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  CMDIApp MDIApp (hInstance);
  MDIApp.CreateWnd ();
  return0;
}

Je compile, aucune erreur, aucun warning; cependant, au lancement du programme, erreur!
L'erreur se produit ici (je pense):
return DefFrameProc (hWnd, MDIApp -> hMDIClient, uMsg, wParam, lParam); //Dans WndProc
Supposition : Comme la fen&#234;tre n'a pas encore re&#231;u le message WM_CREATE,
GetWindowLong (hWnd, GWL_USERDATA) ne retourne pas un pointeur valide.
Ai-je tort ou raison ? Dans ce cas aidez-moi, s'il vous pla&#238;t !!!
PS: Je n'ai pas cod&#233; la cr&#233;ation des fen&#234;tres enfants,
je pense que c'est inutil, car il y a d&#233;j&#224; l'erreur.


1 réponse

PLUiK Messages postés 46 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 25 août 2006
2 juil. 2005 à 12:16
Bon, j'ai trouvé une solution qui consiste à remplacer:

return DefFrameProc (hWnd, MDIApp -> hMDIClient, uMsg, wParam, lParam);


par:

if (!IsBadReadPtr (MDIApp, sizeof (CMDIApp)) //Pointeur valide
  return DefFrameProc (hWnd, MDIApp -> hMDIClient, uMsg, wParam, lParam);
return DefWindowProc (hWnd, uMsg, wParam, lParam); //Pointeur invalide

Mais si quelqu'un a une autre solution...
0
Rejoignez-nous