Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Application MDI dans une classe [ Archives / API ] (PLUiK)

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

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,452 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.