Accueil > Forum > > > > Petit problème API Windows
Petit problème API Windows
vendredi 9 avril 2010 à 23:55:10 |
Petit problème API Windows

hichem16
|
Bonjour à tous ( ou bien bonsoir vu l'heure  )
voila , je débute en API Windows et je suis entrain de faire un petit programme bien à moi, je bloque sur la manière de faire apparaitre une fenêtre en cliquant sur un bouton que j'ai créé. voici mon code source, veuillez m'indiquer mon erreur
Code C/C++ : #include <windows.h>
#define ID_B_CONFIG 0
#define ID_B_QUITTER 1
HINSTANCE cetteInstance;
LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK procedureNewWND(HWND, UINT, WPARAM, LPARAM);
int CreateNewWND();
int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance,
LPSTR lignesDeCommande, int modeDAffichage)
{
HWND fenetrePrincipale;
MSG message;
WNDCLASS classeFenetre;
classeFenetre.style = 0;
classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
classeFenetre.cbClsExtra = 0;
classeFenetre.cbWndExtra = 0;
classeFenetre.hInstance = NULL;
classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
classeFenetre.lpszMenuName = NULL;
classeFenetre.lpszClassName = "classeF";
// au cas où ça échoue
if(!RegisterClass(&classeFenetre)) return FALSE;
fenetrePrincipale = CreateWindow("classeF", "Gestion Puissance", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640,480,
NULL, NULL, cetteInstance, NULL);
if (!fenetrePrincipale) return FALSE;
ShowWindow(fenetrePrincipale, modeDAffichage);
UpdateWindow(fenetrePrincipale);
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND boutons[2] = {NULL};
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_B_CONFIG:
CreateNewWND();
break;
case ID_B_QUITTER:
SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0);
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
boutons[0] = (HWND__*)CreateWindow("BUTTON", "Config", WS_CHILD | WS_VISIBLE,550, 5, 70, 30, fenetrePrincipale, ID_B_CONFIG, cetteInstance, NULL);
boutons[1] = (HWND__*)CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE,550, 40, 70, 30, fenetrePrincipale, (HMENU__*)ID_B_QUITTER, cetteInstance, NULL);
return 0;
default:
return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
}
}
int CreateNewWND()
{
HWND NewWND;
WNDCLASS classeFenetre;
int modeDAffichage = 0;
classeFenetre.style = 0;
classeFenetre.lpfnWndProc = procedureNewWND;
classeFenetre.cbClsExtra = 0;
classeFenetre.cbWndExtra = 0;
classeFenetre.hInstance = NULL;
classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
classeFenetre.lpszMenuName = NULL;
classeFenetre.lpszClassName = "classeE";
NewWND = CreateWindow("classeE", "config", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 320,480,
NULL, NULL, cetteInstance, NULL);
if (!NewWND) return FALSE;
ShowWindow(NewWND, modeDAffichage);
UpdateWindow(NewWND);
}
LRESULT CALLBACK procedureNewWND(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
}
}
|
|
samedi 10 avril 2010 à 07:39:47 |
Re : Petit problème API Windows

BruNews
|
classeE n'est pas enregistrée.
Il faut l'enregistrer 1 SEULE FOIS au début du prog.
ciao...
BruNews, MVP VC++
|
|
samedi 10 avril 2010 à 10:03:17 |
Re : Petit problème API Windows

hichem16
|
Merci pour la réponse,
quand vous dites n'est pas enregistrée, comment je fais ? ClasseF est utilisée directement dans le main 
|
|
samedi 10 avril 2010 à 10:14:06 |
Re : Petit problème API Windows

uaip
|
Oui et euh, de plus, la variable globale "cetteInstance" utilisée pour créer la fenêtre de classe classeE n'a pas de valeur (même si je suppose que ça n'affecte pas directement ton problème).
Pour répondre à ta question, enregistre classeE juste après l'enregistrement de classeF (que ce soit fait une fois pour toutes) et à la limite laisse dans la fonction CreateNewWND() que le CreateWindow() et ce qui suit. Ou mieux, créés la fenêtre dès le départ et joues sur sa visibilité (show/hide).
Pour enregistrer une classe, ce sont les lignes de code entre "WNDCLASS classeFenetre;" (et les suivantes qui mettent à jour cette structure), jusqu'à "RegisterClass(&classeFenetre)".
C'est cette fonction qui manque pour classeE, comme le dit BruNews.
Cordialement, uaip.
|
|
samedi 10 avril 2010 à 10:43:41 |
Re : Petit problème API Windows

hichem16
|
Voilà donc !!
maintenant que la deuxieme fenetre est créée, j'ai 2 autres problèmes:
comment cacher cette fenetre et ne la faire apparaitre que lorsque je clique sur le bouton "CONFIG", et comment faire pour que lorsque je clique sur le bouton quitter le la fenetre "Param" la fenetre principale retse ouverte quand meme ( je crosi que c'est un probleme de parent ou un truc comme ca mais je sais pas comment faire  ).
merci pour vos réponses, voici mon code modifié:
Code C/C++ : #include <windows.h>
#define ID_B_CONFIG 0
#define ID_B_QUITTER 1
HINSTANCE cetteInstance;
LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK procedureNewWND(HWND, UINT, WPARAM, LPARAM);
int CreateNewWND();
int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance,
LPSTR lignesDeCommande, int modeDAffichage)
{
HWND fenetrePrincipale,param;
MSG message;
WNDCLASS classeFenetre,classeEnfant;
classeFenetre.style = 0;
classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
classeFenetre.cbClsExtra = 0;
classeFenetre.cbWndExtra = 0;
classeFenetre.hInstance = NULL;
classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
classeFenetre.lpszMenuName = NULL;
classeFenetre.lpszClassName = "classeF";
// au cas où ça échoue
if(!RegisterClass(&classeFenetre)) return FALSE;
classeEnfant.style = 0;
classeEnfant.lpfnWndProc = procedureNewWND;
classeEnfant.cbClsExtra = 0;
classeEnfant.cbWndExtra = 0;
classeEnfant.hInstance = NULL;
classeEnfant.hIcon = LoadIcon(NULL, IDI_APPLICATION);
classeEnfant.hCursor = LoadCursor(NULL, IDC_ARROW);
classeEnfant.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
classeEnfant.lpszMenuName = NULL;
classeEnfant.lpszClassName = "classeE";
if(!RegisterClass(&classeEnfant)) return FALSE;
fenetrePrincipale = CreateWindow("classeF", "Gestion Puissance", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640,480, NULL, NULL, cetteInstance, NULL);
if (!fenetrePrincipale) return FALSE;
ShowWindow(fenetrePrincipale, modeDAffichage);
UpdateWindow(fenetrePrincipale);
param = CreateWindow("classeE", "param", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320,480, fenetrePrincipale, NULL, cetteInstance, NULL);
if (!param) return FALSE;
ShowWindow(param, modeDAffichage);
UpdateWindow(param);
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND boutons[2] = {NULL};
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_B_CONFIG:
break;
case ID_B_QUITTER:
SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0);
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
boutons[0] = (HWND__*)CreateWindow("BUTTON", "Config", WS_CHILD | WS_VISIBLE,550, 5, 70, 30, fenetrePrincipale, ID_B_CONFIG, cetteInstance, NULL);
boutons[1] = (HWND__*)CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE,550, 40, 70, 30, fenetrePrincipale, (HMENU__*)ID_B_QUITTER, cetteInstance, NULL);
return 0;
default:
return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
}
}
LRESULT CALLBACK procedureNewWND(HWND NewWND, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(NewWND, message, wParam, lParam);
}
}
|
|
samedi 10 avril 2010 à 11:41:40 |
Re : Petit problème API Windows

uaip
|
Réponse acceptée !
Pour masquer ta fenêtre enfant dès le départ, il suffit de remplacer ta ligne :
Code C/C++ : ShowWindow(param, modeDAffichage); //Affiche la fenêtre par défaut
par :
Code C/C++ : ShowWindow(param, SW_HIDE); //Masque la fenêtre
Du coup, tu as :
Code C/C++ :
//Pour afficher la fenêtre enfant
case ID_B_CONFIG:
ShowWindow(param, SW_SHOW); //Affiche la fenêtre
break;
//...
LRESULT CALLBACK procedureNewWND(HWND NewWND, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
//Pour masquer la fenêtre enfant
case WM_QUIT:
ShowWindow(NewWND, SW_SHOW); //Masque la fenêtre
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(NewWND, message, wParam, lParam);
}
}
Pour jouer avec la visibilité d'une fenêtre, tu peux jeter un oeil ici.
Il faudra quand même prévoir un moyen d'appeler DestroyWindow pour détruire "proprement" la fenêtre enfant en fin de programme. Quoi que la destruction de la fenêtre parent le fait automatiquement.
Cordialement, uaip.
|
|
samedi 10 avril 2010 à 11:44:01 |
Re : Petit problème API Windows

uaip
|
Erf, je me suis mal relu...
C'est plutôt :
Code C/C++ : //Pour masquer la fenêtre enfant
case WM_QUIT:
ShowWindow(NewWND, SW_HIDE); //Masque la fenêtre
return 0;
j'avais mis SW_SHOW au lieu de SW_HIDE...
Cordialement, uaip.
|
|
samedi 10 avril 2010 à 12:23:03 |
Re : Petit problème API Windows

hichem16
|
Merci beaucoup pour votre aide ^^
pour le reste j'essayerais de me débrouiller ( c'est le meilleur moyen d'apprendre  )
cordialement
|
|
Cette discussion est classée dans : message, wparam, return, classefenetre, fenetreprincipale
Répondre à ce message
Sujets en rapport avec ce message
SysTreeView - au secours [ par Y0ch ]
Bonsoir,Je cherche désespérément a comprendre comment initialiser et faire fonctionner un contrôle SysTreeView, mais sans résultat.Peut-être un bête p
SendMessage à Dialog [ par vecchio56 ]
Salut J'ai un question pour la valeur retournée pas SendMessage quand on l'utilise pour envoyer un message à un Dialog. Voici un exemple: INT_PTR CAL
probleme de menu [ par Stubbornman ]
Bonsoir a tous,J'ai un soucis avec des menus. Je souhaite creer des fenetres filles qui ont chacune un menu. Or je n'arrive pas a afficher les menus d
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
Dll Visual Aide [ par TheMaster ]
Salut!j'ai un probleme, j'ai créer un logiciel permettant de visualiser des images.Les images sont stocke en ressource dans un dll.Mais je n'arrive pa
[Dev C++] disparition hook [ par erehtnaP ]
Salut, je commence en C++, et je voudrais creer un hook global avec Dev-C++ Le code de la dll et de l'exe se compile sans erreur, les fonction de mis
probleme focus ? [ par sleeper41 ]
bonjourvoila j ai 2 threads qui lance 2 dialogbox avec sur l un 1 bouton et sur l autre 1 editbox.mon but est quand j appuie sur le bouton d'ecrire le
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
petite question sur les message [ par LordBob ]
bonjour a tous,voila mon code est structuré comme ca:BOOL CALLBACK Dialog(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){switch(msg){case WM_INI
Annuler Action Menu en Hookant [ par Zootella ]
Hello, j'ai cette procédure hook: LRESULT CALLBACK HookMenuMessage(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) {
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|