C/C++ SOUS WINDOWS SANS MFC TUTORIAL 1

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 26 juin 2004 à 18:33
encoreUnAutre Messages postés 2 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 14 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.

https://codes-sources.commentcamarche.net/source/24022-c-c-sous-windows-sans-mfc-tutorial-1

encoreUnAutre Messages postés 2 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 14 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és 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Derniè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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 12 Date d'inscription jeudi 30 novembre 2000 Statut Membre Dernière intervention 29 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
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és 53 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 19 décembre 2009
10 févr. 2005 à 20:02
de rien, j'espère que cela a pu t'aider.
paulo46 Messages postés 3 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 10 février 2005
10 févr. 2005 à 11:49
Merci beaucoup pour ce tuto !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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>

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;
}
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 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és 53 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 19 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és 53 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 19 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és 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
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és 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Derniè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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

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++
Rejoignez-nous