Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1166 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C] Les interfaces des programmes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Les interfaces des programmes

n°295753
Z-Axis
Orienté troisième dimension
Posté le 28-01-2003 à 21:23:20  profilanswer
 

Bonjour,
Je débute en programmation C et je voulais avoir un petit renseignement.
 
Je ne savais pas comment programmer une interface il y a quelques temps quand je suis tombé sur un exemple tout fait sous Dev C++.
 
Voici le code que j'ai vu :
 
 

Code :
  1. #include <windows.h>
  2. /* Declare Windows procedure */
  3. LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
  4. /* Make the class name into a global variable */
  5. char szClassName[ ] = "WindowsApp";
  6. int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
  7. {
  8.     HWND hwnd;               /* This is the handle for our window */
  9.     MSG messages;            /* Here messages to the application are saved */
  10.     WNDCLASSEX wincl;        /* Data structure for the windowclass */
  11.     /* The Window structure */
  12.     wincl.hInstance = hThisInstance;
  13.     wincl.lpszClassName = szClassName;
  14.     wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
  15.     wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
  16.     wincl.cbSize = sizeof(WNDCLASSEX);
  17.     /* Use default icon and mouse-pointer */
  18.     wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  19.     wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  20.     wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
  21.     wincl.lpszMenuName = NULL; /* No menu */
  22.     wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
  23.     wincl.cbWndExtra = 0;                      /* structure or the window instance */
  24.     /* Use light-gray as the background of the window */
  25.     wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
  26.     /* Register the window class, if fail quit the program */
  27.     if(!RegisterClassEx(&wincl)) return 0;
  28.     /* The class is registered, let's create the program*/
  29.     hwnd = CreateWindowEx(
  30.            0,                   /* Extended possibilites for variation */
  31.            szClassName,         /* Classname */
  32.            "WindowsApp",         /* Title Text */
  33.            WS_OVERLAPPEDWINDOW, /* default window */
  34.            CW_USEDEFAULT,       /* Windows decides the position */
  35.            CW_USEDEFAULT,       /* where the window ends up on the screen */
  36.            544,                 /* The programs width */
  37.            375,                 /* and height in pixels */
  38.            HWND_DESKTOP,        /* The window is a child-window to desktop */
  39.            NULL,                /* No menu */
  40.            hThisInstance,       /* Program Instance handler */
  41.            NULL                 /* No Window Creation data */
  42.            );
  43.     /* Make the window visible on the screen */
  44.     ShowWindow(hwnd, nFunsterStil);
  45.     /* Run the message loop. It will run until GetMessage( ) returns 0 */
  46.     while(GetMessage(&messages, NULL, 0, 0))
  47.     {
  48.            /* Translate virtual-key messages into character messages */
  49.            TranslateMessage(&messages);
  50.            /* Send message to WindowProcedure */
  51.            DispatchMessage(&messages);
  52.     }
  53.     /* The program return-value is 0 - The value that PostQuitMessage( ) gave */
  54.     return messages.wParam;
  55. }
  56. /* This function is called by the Windows function DispatchMessage( ) */
  57. LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  58. {
  59.     switch (message)                  /* handle the messages */
  60.     {
  61.            case WM_DESTROY:
  62.            PostQuitMessage(0);        /* send a WM_QUIT to the message queue */
  63.            break;
  64.            default:                   /* for messages that we don't deal with */
  65.            return DefWindowProc(hwnd, message, wParam, lParam);
  66.     }
  67.     return 0;
  68. }

 
 
Lorsque j'ai compilé ça, j'ai vu que ça faisait une interface comme je voulais.
 
C'est donc comme ça que l'on fait les interfaces en C sous Windows ? Est-ce grace au include windows.h ? Comment faire pour ajouter à l'interface des menus "Fichier", "Editer", etc. ?
 
Comment ça se passe pour les interfaces GTK (sous linux) ? Grâce à un include gtk.h (par exemple) ?
 
Merci  :jap:


Message édité par Z-Axis le 28-01-2003 à 21:23:42

---------------
x,y,z
mood
Publicité
Posté le 28-01-2003 à 21:23:20  profilanswer
 

n°295787
gatorette
Posté le 28-01-2003 à 22:11:33  profilanswer
 

... Beaucoup de questions !
 
Je ne connais pas du tout la programmation graphique sous X, mais il faut savoir que sous Windows, (presque) tout est une Fenêtre. Et ces fenêtres réagissent à des événements envoyés par le système d'exploitation que l'on appelle Messages.
 
Sous Windows, les fenêtres sont identifiés par des Handles (de type HWND) que tu crées (avec la fonction CreateWindowEx) en y associant une classe (le type WNDCLASSEX) et un certain nombre de paramètres (taille, position, aspect...).
La classe est la chose la plus importante pour une fenêtre. en effet, en plus de définir quelques aspects "esthétiques", elle va définir le "comportement" de la fenêtre au travers notamment de la procédure (WindowProcedure dans le programme). C'est cette procédure qui va permettre à la fenêtre de réagir aux événements du système d'exploitation.
Le corps du programme se situe dans le while. C'est ici que ton programme va récupérer les messages du système d'exploitation qui lui sont destinés (GetMessage) et les envoyer (DispatchMessage) à la fenêtre concernée (au travers de sa procédure).
Après, c'est à ton programme de réagir au messages que Windows lui envoie. On voit ici que le programme ne réagit qu'au message WM_DESTROY qui indique que la fenêtre va être détruite. Pour tous les autres événements, il utilise la réaction classique (DefWindowProc) définie par Windows.
 
Voila une explication très rapide du fonctionnement des applications graphiques sous Windows. Après, tu trouveras certainement plus d'infos, plus précises et mieux expliquées en faisant quelques recherches (tu peux déjà aller voir chez microsoft).
 
Pour ajouter un menu, regarde un peu les commentaires ("/* No menu */" ). En fait, un menu c'est une fenêtre particulière que tu crées avec la fonction CreateMenu. Ensuite, tu l'enrichi (en le chargeant à partir d'une ressource en général) puis tu l'associe à ta fenêtre principale en le définissant dans la classe ou lors de l'appel à la fonction CreateWindowEx.


Message édité par gatorette le 28-01-2003 à 22:14:51

---------------
each day I don't die is cheating
n°295838
Z-Axis
Orienté troisième dimension
Posté le 28-01-2003 à 22:56:34  profilanswer
 

Je ne demandais pas autant de détails techniques mais tant mieux.
 
Donc si j'ai bien compris, c'est bien grâce au windows.h que l'on va pouvoir programmer une interface de programme, en écrivant des fonctions comme CreateWindowEx pour faire ceci, telle autre fonction pour faire cela et ainsi de suite.
 
En fait ce qui me gênait, c'était le fait que j'avais en tête la programmation d'interface sous Visual il me semble, là ou on est avec une souris et ou on peut intégrer, toujours à la souris, des scroll, des boites de dialogues, etc.
 
Sinon, en ce qui concerne GTK ou QT ? Est-ce à peu près la meme chose que sous windows, genre s'il suffit de rajouter quelque chose comme gtk.h puis d'écrire ces fonctions.


Message édité par Z-Axis le 28-01-2003 à 23:00:13

---------------
x,y,z
n°295866
gatorette
Posté le 28-01-2003 à 23:25:50  profilanswer
 

Z-Axis a écrit :

En fait ce qui me gênait, c'était le fait que j'avais en tête la programmation d'interface sous Visual il me semble, là ou on est avec une souris et ou on peut intégrer, toujours à la souris, des scroll, des boites de dialogues, etc.


 
En fait, il n'y a pas tant de différences que ça avec Visual C++. Ce que tu fais avec Visual C++ dans l'éditeur de ressources (tant que tu n'utilises que les composants standards), ce n'est ni plus ni moins que créer tes ressources :whistle: . Toutes ces ressources sont intégrées dans un fichier texte (*.rc) qui est ajouté au projet. C'est le même fichier texte que tu peux utiliser dans n'importe quel projet (pour charger tes menus, tes boîtes de dialogue...) car c'est le format standard Windows.
Après, tu n'as plus les MFC bien évidemment, mais les MFCs sont très souvent juste une "mise-en-classe" des fonctions de l'API Windows.
Tu peux voir un autre exemple de projet "basique" (avec un menu et une boîte de dialogue) sur le site Microsoft (http://msdn.microsoft.com/library/en-us/winprog/winprog/a_generic_sample_application.asp)


---------------
each day I don't die is cheating
n°295883
Z-Axis
Orienté troisième dimension
Posté le 28-01-2003 à 23:47:18  profilanswer
 

:jap:  
 
Et pour GTK ?  :whistle:  
 
 

Code :
  1. #include <gtk/gtk.h>
  2. /* This is a callback function. The data arguments are ignored
  3. * in this example. More on callbacks below. */
  4. void hello( GtkWidget *widget,
  5.             gpointer   data )
  6. {
  7.     g_print ("Hello World\n" );
  8. }

 
 
Trouvé sur gtk.org :)
 
Je comprends un peu mieux tout ça.
 
Et je comprends aussi pourquoi certains ont du mal à porter leurs progammes UNIX vers une plateforme win32 ; en gros il faut tout reprogrammer ! (du moins l'interface)  :??:


---------------
x,y,z
n°295963
Cherrytree
cn=?
Posté le 29-01-2003 à 07:18:00  profilanswer
 

Z-Axis a écrit :

:jap:  
 
Et pour GTK ?  :whistle:  
 
 

Code :
  1. #include <gtk/gtk.h>
  2. /* This is a callback function. The data arguments are ignored
  3. * in this example. More on callbacks below. */
  4. void hello( GtkWidget *widget,
  5.             gpointer   data )
  6. {
  7.     g_print ("Hello World\n" );
  8. }


Trouvé sur gtk.org :)
 
Je comprends un peu mieux tout ça.
 
Et je comprends aussi pourquoi certains ont du mal à porter leurs progammes UNIX vers une plateforme win32 ; en gros il faut tout reprogrammer ! (du moins l'interface)  :??:  


 
 :jap: La conception d'interface en C/C++ est une corvée. De plus les toolkits les plus utilisés sous Win n'existent pas sous *NIX. En revanche, des toolkits comme Qt peuvent faciliter le portage, car il existe une implémentation pour chaque OS.


Message édité par Cherrytree le 29-01-2003 à 07:18:33

---------------
Le site de ma maman
n°296570
Z-Axis
Orienté troisième dimension
Posté le 29-01-2003 à 19:48:06  profilanswer
 

J'ai encore un souci.
Le GTK est-il considéré comme un langage de programmation :??:
 
 
Puisque si je regarde le code pour afficher Hello World en GTK :

Code :
  1. #include <gtk/gtk.h>
  2.   void hello( GtkWidget *widget,
  3.               gpointer   data )
  4.   {
  5.         g_print ("Hello World\n" );
  6.   }


 
Ca n'a rien a voir avec celui en C :
 

Code :
  1. #include <stdio.h>
  2. main()
  3. {
  4.    printf("Hello World\n";
  5. }

 
 
Je comprends plus grand chose !? Si je veux faire un programme en GTK, je ne programme donc plus en C mais en GTK ? Puisqu'apparremment g_print en GTK est l'équivalent de printf en C  :??:


---------------
x,y,z
n°296616
trictrac
Posté le 29-01-2003 à 20:43:45  profilanswer
 

un programme ecrit CORRECTEMENT en gtk sous linux sera facilement porable sous windows par la suite : exemple, the gimp.
Maintenant, le GTK n'est pas un autre langage, mais c'est une librairie de C ... et pas de C++ comme d'autres .
Certain prefere GTK, d'autres Qt, c'est une question de gout

n°296630
Z-Axis
Orienté troisième dimension
Posté le 29-01-2003 à 21:00:20  profilanswer
 

Oui mais ce que je comprends pas c'est qu'il n'y a aucune correspondance entre le C et le GTK ?
 
Et si GTK n'est pas un langage, alors pourquoi il y a autant de différence pour afficher un Hello World entre GTK et C ?


---------------
x,y,z
n°296703
kjus
Posté le 29-01-2003 à 22:16:33  profilanswer
 

Au contraire, gtk esune librairie écrite en C.
Tu ne peux programmer en utilisant gtk sans connaitre le C..
Si tu veux, la librairie gtk va te permettre d'utiliser des fonctions en plus par rapport au C de bae qui vont te permettre de faire des GUI. La différence entre les deux hello world provient du fait que les deux fonctions ne font pas la meme chose : l'une affiche hello world sur la sortie standart, l'autre dans une fenetre (donc spécifique à GTK)


Message édité par kjus le 29-01-2003 à 22:19:33
mood
Publicité
Posté le 29-01-2003 à 22:16:33  profilanswer
 

n°297525
Z-Axis
Orienté troisième dimension
Posté le 30-01-2003 à 22:10:51  profilanswer
 

Ca devient compliqué  :ouch:


Message édité par Z-Axis le 30-01-2003 à 22:12:51

---------------
x,y,z
n°297556
kjus
Posté le 30-01-2003 à 22:51:12  profilanswer
 

C'est pour ca qu'il faut connaitre le C avant de se lancer dans la création de GUI. Après le C (en ligne de commande), et tout te sembleras plus claire.

n°298125
Z-Axis
Orienté troisième dimension
Posté le 31-01-2003 à 17:09:55  profilanswer
 

ok, merci du conseil  :)


---------------
x,y,z
n°298146
gatorette
Posté le 31-01-2003 à 17:36:03  profilanswer
 

Je ne connais pas de tutorial pour le développement d'interfaces. Et c'est vrai que quand on découvre, c'est assez compliqué.
J'ai appris le fonctionnement de Win32 en utilisant tout d'abord les MFCs (le plus simple est de commencer par des boîtes de dialogue) puis, au travers d'exemples et de tests, j'ai fini par comprendre grossièrement le fonctionnement global et à savoir coder directement mes fenêtres (mais pour des interfaces complexes, j'utilise toujours les MFCs).
J'utilise Visual C++, mais tu dois pouvoir suivre le même chemin avec d'autres outils de développement proposant des librairies simplifiant la conception d'interfaces (C++ Builder, Delphi, Kylix...).


---------------
each day I don't die is cheating
n°298201
Z-Axis
Orienté troisième dimension
Posté le 31-01-2003 à 18:57:34  profilanswer
 

En fait, le côté GTK ou Qt m'intéresserait plus.  ;)
 
 
Sinon, si je programme "simplement" (cad sans interface particulière) sous Windows, la portabilité (ça se dit ?) du programme sous un environnement Linux est tout à fait envisageable sans la moindre re-programmation ?


Message édité par Z-Axis le 31-01-2003 à 19:03:14

---------------
x,y,z
n°298256
kjus
Posté le 31-01-2003 à 20:38:51  profilanswer
 

Je participe à un tuto fr sur gtk :
jcecchi.free.fr
 
Si tu programmes en ainsi-C, tes sources seront portables de windows à linux (pour n'importe quel compilateur qui respecte les normes).
 
L'avantage d'utiliser une librairie pour faire les GUI est justement la portabilité (suffit juste de recompiler). Ainsi gtk et Qt sont portable au moins sur windows / linux..


Message édité par kjus le 31-01-2003 à 21:00:26
n°298275
Z-Axis
Orienté troisième dimension
Posté le 31-01-2003 à 21:44:10  profilanswer
 

Oui c'est pour ça que GTK ou Qt c'est bien  :)  :jap:  
 
Pour le tuto, je te remercie, il va m'etre très utile  :jap:


---------------
x,y,z
n°298599
HelloWorld
Salut tout le monde!
Posté le 01-02-2003 à 01:52:11  profilanswer
 

A un detail près : GTK, sous Windows, c'est merdique.
Y'aurait Qt mais ... la derniere fois que j'ai voulu tester sous Windows, y'aait que la version 2.3 de Qt de dispo (c'est une lib payante qui en est a la version 3.1 et quelque). Ce que j'ai vu de Qt 2.3 sous Windows m'a bcp reffroidi.
Y'a aussi wxWindows comme lib C++ portable.
C'est gratuit, y'a un petit editeur de ressources avec, ca supporte les themes XP, ca a un gout de deja vu, (enfin, si tu connais un peu C++/STL/MFC).
J'ai testé que sous Windows. (je suis en train de m'y mettre en fait, vu que je dois choisir entre Qt et ca pour un assez gros projet C++ Win/Linux/Mac, j'essai de voir si c'est assez ... "serieux" )


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°298740
trictrac
Posté le 01-02-2003 à 12:38:04  profilanswer
 

pourkoi tu dis que GTK c'est nul sous win??
the gimp est pas deguelasse quand mem...
en tout cas je trouve pas

n°298748
kjus
Posté le 01-02-2003 à 12:56:48  profilanswer
 

moi non plus je trouve pas que ca soit nul (normal je l'utilise).
Par contre c'est vrai que sous windows, il n'y a pas d'éditeur d'interface valable, il faut donc tout coder "à la main".
 
Enfin, Z-Axis demande une librairie C : parmis gtk, Qt et wxwindow, seul gtk est une librairie C. LEs deux autres demandent une connaissance du C++.
 

n°298899
HelloWorld
Salut tout le monde!
Posté le 01-02-2003 à 16:10:28  profilanswer
 

La derniere fois que j'ai vu GTK en action sous Windows, ca donnait :
- 12 dll a se trimballer
- une interface lente, tres lente
- une interface qui n'a rien a voir avec celle de Windows : tout a été recode le look & feel comme sous Linux, meme les boite de dialogue ne sont pas celles de Windows. Je suis personnelement farouchement opposé à ce procédé et c'est aussi ce que je reproche a Qt (a par que lui c'est le seul reproche + le fait d'etre payant).
Mon opinion a ete renforcee avec WinXP : les themes ne fonctionnent pas avec une appli GTK. Pour Qt, il parrait que QT 3.0.5 je crois a resolu le probleme, mais je pense qu'ils l'ont contourné (ils on du utiliser les themes pour dessiner leurs controles, mais ca reste toujours leurs propres controles different de ceux de Windows). Mais Qt utilise tout de meme les boites de dialogues standards de Windows, contrairement a GTK.
Seul wxWindows encapsule Win32. Un prog wxWindows est un "vrai" prog Windows.
Enfin y'a la rumeur qui confirme que l'implémentation de GTK sous Windows est merdique.
 
Mais oui c'est en C. Mais il semblait OK pour Qt. Et je trouve qu'il y gagnera plus à investir dans le C++ avec Qt/wxWindows qu'en C avec GTK (avis perso).
 


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°315445
trictrac
Posté le 22-02-2003 à 11:35:17  profilanswer
 

pour moi, l'exemple type d'un prog GTK+ porté sous win est TheGimp .. et je trouve qu'il s'en tire vraiment pas mal ...
Lent, je vois pas pourkoi, maintenant le look&feel, c'est une ketion de gout, c'est sur

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C] Les interfaces des programmes

 

Sujets relatifs
Les programmes installés ??exécution de programmes
je vois pas l'interet des interfaces dans un exo (en fin de topic)Faire communiquer 2 programmes sur une mm machine
Est-ce que les programmes dev sous Powerbuilder...Question sur les interfaces
Programmes sur calculatriceCompression de programmes (upc, etc...)
Vos numéros de versions de vos programmes ?Un code plus compact, utilisation d'interfaces (surement)
Plus de sujets relatifs à : [C] Les interfaces des programmes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR