begin process at 2012 02 12 19:01:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

Application MDI dans une classe


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

Application MDI dans une classe

vendredi 1 juillet 2005 à 13:41:01 | Application MDI dans une classe

PLUiK

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 à nouveau (car avant, le pointeur n'é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) &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 (&wc)) //Enregistrement de la classe
return FALSE;

//Création de la fenê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être

MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&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être n'a pas encore reç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ît !!!
PS: Je n'ai pas codé la création des fenêtres enfants,
je pense que c'est inutil, car il y a déjà l'erreur.

samedi 2 juillet 2005 à 12:16:25 | Re : Application MDI dans une classe

PLUiK

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...




Cette discussion est classée dans : hwnd, wc, hinstance, mdiapp, cmdiapp


Répondre à ce message

Sujets en rapport avec ce message

Pb sur un ptit bout de prog en DirectX.... [ par Haldwin ] Salut a tous....Voila j'ai deux ptits pbs quand je lance cette appli ci-dessous... (VC++)La première est q'une fois sur deux ma variable hWnd apres le ouvrir une 2eme fenetre avec editbox et tout et tout, c'est possible? [ par Arnaud16022 ] Hello tout le monde!je voudrais mettre un bouton dans une fenetre (ca c'est facile), mais seulement quand on clique dessus un autre fenetre s'ouvre, a [C++]Problème de pointeur ou de liste chainee [ par Arkko ] Bonjour... J'essaye de convertir une liste chainée du site en une liste chainée demandant comme parametre un new par exemple ajouter(new Test);Cela f dev sans MFC [ par c2millet ] Voilà j'essaie de faire un prog sans MFC et je voudrais changer la couleur de text d'un bouton ainsi que ça couleur de fond.Si qqun peu m'aider mercim pb avec le plein écran de DirectX que je veux enlever [ par Diabolus ] Bonjour à tous !Je souhaiterai créer une fenêtre en mode normal et tout ce que j'arrive à faire c'est du plein écran. J'aimerai enlever le plein écran Problème de linker dans programme de base. [ par vith17 ] Bonjour,J'ai tapé le code suivant sous Dev-C++. Lorsque je lance la compilation, il me revoie l'erreur suivante :    [Linker error] undefined referenc API + logiciel réseau [ par lolorenzeb ] Bonjour à tous,Voila j'ai réalisé deux petites applications simples (client et serveur) en mode console. Je souhaite donc améliorer mon programme avec api window [ par ropars ] Bonjour<br interface en c [ par Med2009 ] salut je suis Mohamed un petit développeur en c et qui désire etre le plus grand développeur dans le monde...


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 2,449 sec (3)

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