BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
26 juin 2004 à 18:33
encoreUnAutre
Messages postés2Date d'inscriptionjeudi 14 février 2008StatutMembreDernière intervention14 février 2008
-
21 févr. 2008 à 17:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
encoreUnAutre
Messages postés2Date d'inscriptionjeudi 14 février 2008StatutMembreDernière intervention14 février 2008 21 févr. 2008 à 17:47
TROP FORT !!!
Merci beaucoup, tu m'as énormément éclairé.
Super bien foutu, ton tutoriel. Tu détailles vraiment bien chaque ligne.
cs_lol55
Messages postés86Date d'inscriptiondimanche 8 janvier 2006StatutMembreDernière intervention 5 décembre 2010 20 juin 2006 à 23:20
Merci pour ce tuto SIMPLE et CLAIR !
J'ai enfin compris comment faire une fenêtre en API (une fenêtre de base biensûr ;-)
Je continu la lecture de ce Tuto :-)
Merci pour tout!
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 29 janv. 2006 à 18:49
oh EXACT, je n'avais pas fait gaffe au hFenetre en second param, faut toujours mettre 0 et laisser DispatchMessage distribuer à la fenêtre cible.
hugues7E5
Messages postés12Date d'inscriptionjeudi 30 novembre 2000StatutMembreDernière intervention29 janvier 2006 29 janv. 2006 à 18:35
J'ai beucoup apprécié ton tuto, et les corrections de BruNews!
Ton language simple permet un apprentissage rapide sans trp grandes réflexions.
message pour BruNews, j'ai vérifié, le programme reste bien en mémoire si l'on met:
while (GetMessage(&MessagesAEnvoyer, hFenetre, 0, 0)) qui est ce qui correspond au tuto.
Il faut remplacer par:
while (GetMessage(&MessagesAEnvoyer, NULL, 0, 0))
Je ne sais pas pourquoi car débutant en C++, éclairez ma lanterne!
Merci à vous deux.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 sept. 2005 à 14:12
C'est le controle qui a le focus qui récupère les entrées clavier.
Soit tu détournes les events au niveau de la pompe à messages du WinMain soit tu sous classes les controles.
gamemonde
Messages postés336Date d'inscriptionsamedi 9 août 2003StatutMembreDernière intervention 9 juillet 20112 20 sept. 2005 à 13:55
pour pouvoir utiliser keydown faut t'il absolument creer une boite de dialog avec la fonction CreateWindowEx car moi j'utilisais la foncion pour utiliser la resource du dialog. mais si je met un oject comme un edit, la keydown ne fonctionne plus.
cs_LaPatoshe
Messages postés53Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 décembre 2009 10 févr. 2005 à 20:02
de rien, j'espère que cela a pu t'aider.
paulo46
Messages postés3Date d'inscriptionmardi 6 avril 2004StatutMembreDernière intervention10 février 2005 10 févr. 2005 à 11:49
Merci beaucoup pour ce tuto !
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 juin 2004 à 11:19
J'ai verifie ce qu'il y a dessous, rien ne reste en memoire sur un 98.
Compile et verifie chez toi.
-----------------------
#include <windows.h>
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 juin 2004 à 10:44
Pamaury > ok j'ai fait dans l'ultra raccourci mais il vaut mieux qu'on considere un handle en tant que valeur et non pointeur au niveau d'un prog user. On le reçoit, on s'en sert mais on ne va jamais le dereferencer pour lire ou manipuler ce qu'il y a derriere.
Pamaury
Messages postés341Date d'inscriptionjeudi 3 avril 2003StatutMembreDernière intervention17 juin 20083 27 juin 2004 à 10:25
"un handle n'est pas un pointeur mais une valeur 32 bits identifiant un objet de maniere unique, win32 en maintient une table."
Faux : un handle est un pointeur sur une struture contenant un indentifiant 32 bit(int) dont une table est mainetnu par windows et cela n'est pas du tout les même chose en particulier pour les cast de HANDLE vers HMODULE, HACCEL.... qui ne sont en fait que des alias des HANDLE dont le but est fixé à l'avance pour plus de praticité
Sinon, c'est un bon tuto .
Dernière chose:
"while (!stop)"
>>en plus d'être inutile çà te bouffe le CPU car GetMessage est une fonction bloquante donc le thread est mis en attente et ne consomme rien alors qu'avec un boucle infini(utile dans les jeux mais pas là), tu prend 100% du CPU
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 juin 2004 à 02:18
Ah oui, il y a aussi ton prog qui reste en memoire sous win98, je jette un oeil demain, pour l'heure ce sera dodo.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 juin 2004 à 02:10
bien entendu, tant qu'on ne fera que modifier des octets dedans devrait bien se passer mais ce n'est pas a conseiller. Il vaut mieux considerer lpCmdLine comme une 'const char*' et se la recopier dans un buffer s'il y a d'eventuelles manips a faire dessus sinon pourrait etre une source de bug tres difficile a traquer ensuite.
BlackGoddess
Messages postés338Date d'inscriptionjeudi 22 août 2002StatutMembreDernière intervention14 juin 2005 27 juin 2004 à 01:53
LPSTR lpCmdLine est un pointeur et non une 'chaine de caracteres'.
Rappelons egalement qu'il ne faut jamais tenter de modifier la chaine pointee avec des strcpy, strcat ou autre.
>> on peut changer son contenu mais pas sa taille, vu qu'on ne connait pas la taille allouée, est-ce exact ?
cs_LaPatoshe
Messages postés53Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 décembre 2009 26 juin 2004 à 23:53
Pour info, je viens pour la mise à jour du tuto de corriger plusieurs fautes dans l'intro et la première partie, et annexer un ZIP au format de WordPad (RTF), comme ça, on peut lire le tuto sans risquer de problèmes occulaires.
Petit message pour BruNews qui je dois le dire a pas mal éclairé ma lanterne : Je n'ai pas mis while(GetMessage(.... car dans ce cas précis, le fait de fermer la fenêtre, ne met pas fin au programme. Je ne sais pas pourquoi, sous Windows 98, il reste en mémoire malgré mon PostQuitMessage(0) dans WinProc. Peut être faut il mettre également une instruction PostQuitMessage (0) avant le return 0 de WinMain, je ne sais pas peut être pourras tu me répondre.
Merci à plus
cs_LaPatoshe
Messages postés53Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 décembre 2009 26 juin 2004 à 23:19
Salut à tous, et merci pour vos précisions, qui m'aident énormément. J'avais écrit ce tuto un peu pour ceux qui comme moi ont voulu un jour passer de Visual Basic à un langage compilé, et qui après avoir apris le C++ se sont retrouvés devant une usine à gaz qu'est Win32.
Ce tuto était destiné au départ à un site de tutoriaux ou à une page perso, mais j'ai eu pas mal d'ennuis pour retrouver ma page avec des moteurs de recherche, donc, je l'ai adapté à Code Source, site pour lequel j'avais écrit des Démos DirectX en VB. C'est pous cela, qu'au niveau mise en page, c'est pas top , je le reconnais.
En tout cas merci encore pour les précisions que vous avez pu donner à certains points d'ombre du tuto, et également aux corrections apportées et je pense qu'elle sont et seront encore nombreuses.
A plus
cs_Urgo
Messages postés780Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention16 avril 20091 26 juin 2004 à 20:48
Ce langage permet de créer des application répidement sous //Windows
Essai de faire gaffe aux fautes, car moi j'ai arreté au bout de deux minutes tellement ça me soule...
Fait aussi une mise à jour grâce aux remarques de BruNews.
Et puis un fichier chm ou doc ne serait pas de refus, car la lisibilité n'est pas très bonne dans ce tableau, on a l'impression d'avoir des oeillères.
Ne prend pas mal mes remarques, elles sont là pour conseiller.
bye
cs_jb60
Messages postés55Date d'inscriptionmardi 16 septembre 2003StatutMembreDernière intervention 4 août 2008 26 juin 2004 à 18:53
Je trouve tes commentaires assez pédagogiques, je trouve ça très bien, même si ça se voit que tu n'es pas encore un pro en programmation API (rassure toi, je ne te dis pas ça pour te vexer, car je suis nul aussi, je débute en API)...
Quand tu ne sais pas, tu le dit, et c'est appréciable.
En tout cas, ton petit tuto m'a bien servi, même si j'ai lu pas mal de trucs sur la programmation API peu de temps avant.
Au moins tu expliques avec des mots simples et compréhensibles !!!
Ceci va bien te valloir un 8/10, facile...
Franchement, continue comme ça avec des programmes un peu plus complexes, par exemple en commentant les paramètres WPARAM et LPARAM que j'ai du mal à comprendre aujord'hui :-)
Encouragements
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 26 juin 2004 à 18:33
Salut,
un tuto Windows, vaste sujet, bon courage.
Ne prends pas mal, j'annote quelques points:
WinMain() n'est pas une proc de reception des messsages mais le simple point d'entree du prog.
Les types win ne sont que des alias des types primaires.
LPSTR est un #define de char*, sera donc compatible a tout coup.
"message contenant le nom du controle" NON, rien que du numerique et toujours.
Je deconseille ce: #include <windowsx.h> qui inclut des macros predefinies.
Autant apprendre en voyant clairement ce qui se passe.
Aucun besoin de declaration prealable des fonctions si elles sont placees dans l'ordre d'utilisation.
int WINAPI WinMain(): celle ci encore moins que les autres(point d'entree, compilo doit la trouver).
WINAPI est alias de __stdcall, protocole ou l'appele depile les params.
HINSTANCE ne dit jamais combien de fois... c'est le handle de processus.
LPSTR lpCmdLine est un pointeur et non une 'chaine de caracteres'.
Rappelons egalement qu'il ne faut jamais tenter de modifier la chaine pointee avec des strcpy, strcat ou autre.
"WinProc ... cette fonction attend un retour", c'est win32 qui attend le retour de la fonction winproc pour savoir quoi faire.
LRESULT est #define de long (32 bits).
un handle n'est pas un pointeur mais une valeur 32 bits identifiant un objet de maniere unique, win32 en maintient une table.
while (!stop) INUTILE !!!
GetMessage retournera 0 quand sera le moment donc:
while(GetMessage(.... fera l'affaire.
21 févr. 2008 à 17:47
Merci beaucoup, tu m'as énormément éclairé.
Super bien foutu, ton tutoriel. Tu détailles vraiment bien chaque ligne.
20 juin 2006 à 23:20
J'ai enfin compris comment faire une fenêtre en API (une fenêtre de base biensûr ;-)
Je continu la lecture de ce Tuto :-)
Merci pour tout!
29 janv. 2006 à 18:49
29 janv. 2006 à 18:35
Ton language simple permet un apprentissage rapide sans trp grandes réflexions.
message pour BruNews, j'ai vérifié, le programme reste bien en mémoire si l'on met:
while (GetMessage(&MessagesAEnvoyer, hFenetre, 0, 0)) qui est ce qui correspond au tuto.
Il faut remplacer par:
while (GetMessage(&MessagesAEnvoyer, NULL, 0, 0))
Je ne sais pas pourquoi car débutant en C++, éclairez ma lanterne!
Merci à vous deux.
20 sept. 2005 à 14:12
Soit tu détournes les events au niveau de la pompe à messages du WinMain soit tu sous classes les controles.
20 sept. 2005 à 13:55
10 févr. 2005 à 20:02
10 févr. 2005 à 11:49
27 juin 2004 à 11:19
Compile et verifie chez toi.
-----------------------
#include <windows.h>
HINSTANCE hinst;
HWND hmain;
char szappname[] = "Fenetre";
LRESULT CALLBACK AppWndProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, mssg, wParam, lParam);
}
int InitInstance()
{
WNDCLASSEX wndcls;
memset(&wndcls, 0, sizeof(WNDCLASSEX));
wndcls.cbSize = sizeof(WNDCLASSEX);
wndcls.lpfnWndProc = AppWndProc;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.hInstance = hinst;
wndcls.lpszClassName = szappname;
wndcls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndcls.hCursor = LoadCursor(0, IDC_ARROW);
if(!RegisterClassEx(&wndcls)) return 0;
hmain = CreateWindowEx(0, szappname, szappname, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hinst, 0);
return (int) hmain;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
MSG msg;
hinst = hInstance;
if(!InitInstance()) return 0;
ShowWindow(hmain, SW_NORMAL);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
27 juin 2004 à 10:44
27 juin 2004 à 10:25
Faux : un handle est un pointeur sur une struture contenant un indentifiant 32 bit(int) dont une table est mainetnu par windows et cela n'est pas du tout les même chose en particulier pour les cast de HANDLE vers HMODULE, HACCEL.... qui ne sont en fait que des alias des HANDLE dont le but est fixé à l'avance pour plus de praticité
Sinon, c'est un bon tuto .
Dernière chose:
"while (!stop)"
>>en plus d'être inutile çà te bouffe le CPU car GetMessage est une fonction bloquante donc le thread est mis en attente et ne consomme rien alors qu'avec un boucle infini(utile dans les jeux mais pas là), tu prend 100% du CPU
27 juin 2004 à 02:18
27 juin 2004 à 02:10
27 juin 2004 à 01:53
Rappelons egalement qu'il ne faut jamais tenter de modifier la chaine pointee avec des strcpy, strcat ou autre.
>> on peut changer son contenu mais pas sa taille, vu qu'on ne connait pas la taille allouée, est-ce exact ?
26 juin 2004 à 23:53
Petit message pour BruNews qui je dois le dire a pas mal éclairé ma lanterne : Je n'ai pas mis while(GetMessage(.... car dans ce cas précis, le fait de fermer la fenêtre, ne met pas fin au programme. Je ne sais pas pourquoi, sous Windows 98, il reste en mémoire malgré mon PostQuitMessage(0) dans WinProc. Peut être faut il mettre également une instruction PostQuitMessage (0) avant le return 0 de WinMain, je ne sais pas peut être pourras tu me répondre.
Merci à plus
26 juin 2004 à 23:19
Ce tuto était destiné au départ à un site de tutoriaux ou à une page perso, mais j'ai eu pas mal d'ennuis pour retrouver ma page avec des moteurs de recherche, donc, je l'ai adapté à Code Source, site pour lequel j'avais écrit des Démos DirectX en VB. C'est pous cela, qu'au niveau mise en page, c'est pas top , je le reconnais.
En tout cas merci encore pour les précisions que vous avez pu donner à certains points d'ombre du tuto, et également aux corrections apportées et je pense qu'elle sont et seront encore nombreuses.
A plus
26 juin 2004 à 20:48
Essai de faire gaffe aux fautes, car moi j'ai arreté au bout de deux minutes tellement ça me soule...
Fait aussi une mise à jour grâce aux remarques de BruNews.
Et puis un fichier chm ou doc ne serait pas de refus, car la lisibilité n'est pas très bonne dans ce tableau, on a l'impression d'avoir des oeillères.
Ne prend pas mal mes remarques, elles sont là pour conseiller.
bye
26 juin 2004 à 18:53
Quand tu ne sais pas, tu le dit, et c'est appréciable.
En tout cas, ton petit tuto m'a bien servi, même si j'ai lu pas mal de trucs sur la programmation API peu de temps avant.
Au moins tu expliques avec des mots simples et compréhensibles !!!
Ceci va bien te valloir un 8/10, facile...
Franchement, continue comme ça avec des programmes un peu plus complexes, par exemple en commentant les paramètres WPARAM et LPARAM que j'ai du mal à comprendre aujord'hui :-)
Encouragements
26 juin 2004 à 18:33
un tuto Windows, vaste sujet, bon courage.
Ne prends pas mal, j'annote quelques points:
WinMain() n'est pas une proc de reception des messsages mais le simple point d'entree du prog.
Les types win ne sont que des alias des types primaires.
LPSTR est un #define de char*, sera donc compatible a tout coup.
"message contenant le nom du controle" NON, rien que du numerique et toujours.
Je deconseille ce: #include <windowsx.h> qui inclut des macros predefinies.
Autant apprendre en voyant clairement ce qui se passe.
Aucun besoin de declaration prealable des fonctions si elles sont placees dans l'ordre d'utilisation.
int WINAPI WinMain(): celle ci encore moins que les autres(point d'entree, compilo doit la trouver).
WINAPI est alias de __stdcall, protocole ou l'appele depile les params.
HINSTANCE ne dit jamais combien de fois... c'est le handle de processus.
LPSTR lpCmdLine est un pointeur et non une 'chaine de caracteres'.
Rappelons egalement qu'il ne faut jamais tenter de modifier la chaine pointee avec des strcpy, strcat ou autre.
"WinProc ... cette fonction attend un retour", c'est win32 qui attend le retour de la fonction winproc pour savoir quoi faire.
LRESULT est #define de long (32 bits).
un handle n'est pas un pointeur mais une valeur 32 bits identifiant un objet de maniere unique, win32 en maintient une table.
while (!stop) INUTILE !!!
GetMessage retournera 0 quand sera le moment donc:
while(GetMessage(.... fera l'affaire.
Pour les autres points, RegisterClass etc... regarder MSDN toujours.
La meilleure doc sur ce sujet est Petzlod:
http://brunews.free.fr/brunews/download/CP5.zip
http://brunews.free.fr/brunews/download/CP5Sources.zip
ciao...
BruNews, Admin CS, MVP Visual C++