Partage
  • Partager sur Facebook
  • Partager sur Twitter

Interface Graphique C++ Visual Studio

6 novembre 2014 à 11:25:51

Bonjour tout le monde,

Je souhaite développer une interface graphique en C++. J'ai à ma disposition Visual Studio 2010.

Le hic, c'est que je ne sais pas du tout par où commencer et pour couronner le tout, je suis débutant en la matière.

C'est la raison pour laquelle je ne posterai pas de code pour le moment.

Le but de cette interface serait de créer un fichier à la suite de choix fait par l'utilisateur.

Une idée pour commencer?

D'avance, merci pour vos réponses et le temps que vous m'accorderez!

Babas

  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2014 à 11:51:06

Qu'est ce que tu veux faire exactement ? Afficher la fenêtre standard "Charger un fichier" ?

Un exemple :

http://fvirtman.free.fr/recueil/04_01_02_getopenfilename.c.php

  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

6 novembre 2014 à 12:14:51

Je ne peux pas ouvrir ta page (sécurité de l'entreprise).

Le but de cette interface est de proposer à l'utilisateur plusieurs choix et en fonction des choix, générer un fichier.

En gros, le choix de l'utilisateur doit paramétrer une action qui sera lancer après.

  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2014 à 12:20:16

Donc tu veux dessiner une fenetre avec des paramètres à rentrer ?

Sinon, je te poste le bout de code que je t'ai mis en lien :

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void convert_multiple(TCHAR* buf)
{
    int i;
    for(i=0;;i++)
    {
        if (buf[i]=='\0')
        {
            buf[i] = '\n';
            if (buf[i+1]=='\0')
                break;
        }
    }
}

int main()
{
    int res;
    OPENFILENAME ofn;
    TCHAR tmp[1024] ;
    tmp[0]= '\0' ;
    ZeroMemory ( &ofn , sizeof ( OPENFILENAMEW ) );
    ofn.lStructSize = sizeof ( OPENFILENAMEW );
    ofn.lpstrFile = tmp;
    ofn.nMaxFile = 1024;
    ofn.lpstrTitle = _T("Le titre");
    ofn.lpstrFilter = _T("Tous (*.*)\0*.*\0Textes (*.txt)\0*.TXT\0");
    ofn.Flags = OFN_LONGNAMES | OFN_EXPLORER; // | OFN_ALLOWMULTISELECT  ;
    res = GetOpenFileName(&ofn); 
    //int res = GetSaveFileName(&ofn); 
    printf("Code de sortie : %d\n",res);
    //convert_multiple(ofn.lpstrFile);
    _tprintf(_T("Buffer de sortie : %s\n"),ofn.lpstrFile);
    return 0;
}



  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

6 novembre 2014 à 12:48:24

babas33 a écrit:

Je ne peux pas ouvrir ta page (sécurité de l'entreprise).

Le but de cette interface est de proposer à l'utilisateur plusieurs choix et en fonction des choix, générer un fichier.

En gros, le choix de l'utilisateur doit paramétrer une action qui sera lancer après.

C'est pas très précis tout cela ! Pour les choix tu as les listes, les listes déroulantes, les cases à cocher, les radio bouton, ....
Si tu as visual studio, tu peux faire cela avec .net (C# ou visual basic .net ou C++ managé) ou alors avec MFC.

Ici tu est sur le forum C, donc on peut te proposer API Win32.

  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2014 à 13:07:19

Ah oui ça c'est vrai. Je me suis trompé de forum ^^

En tout cas, merci d'avoir pris la peine de répondre, je vais posté sur le bon forum!

  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2014 à 13:21:13

+1 pour le (c#) .net si le but est avant tout la conception d'un utilitaire plus que l'apprentissage d'un langage.

  • Partager sur Facebook
  • Partager sur Twitter
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
6 novembre 2014 à 13:23:28

Sujet déplacé dans la section C++ ;)
  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 10:50:25

Bonjour,

J'ai créé une interace avec Visual Studio en utilisant Windows Forms.

J'ai fait des coches et j'aimerai, quand je coche la case, récupérer son nom.

Comment puis-je procéder?

D'avance, merci.

Babas

  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 11:04:26

Pour récuperer la velur d'une case qui est coché, il faut d'abord vérifier l'état de la case (si elle est cochée) puis récuperer sa propriété Text. De manière simple, cela donne ceci par exemple lors du cliaue sur un bouton, je récupère la valeur de ma case à cocher chkChoix1 si elle est bien cochée:

private:
    System::Void btnValider_Click(System::Object ^
sender, System::EventArgs ^e)
{
    if (chkChoix1->Checked)
    {
        String ^valeur = chkChoix->Text;
    }
}
  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 11:19:48

Merci. ça fonctionne comme je veux mais je ne comprend pas pourquoi un "S" a String et string tout simplement?
  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 11:23:26

Autre question.

Comment je peux récupérer la valeur de "^valeur" dans une autre fonction?

  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 11:35:57

Pour répondre à ta première question: comme dit plus haut, c'est du C++/CLI donc qui utilise les classes du framework .NET. La propriété Text de la classe Checkbox renvoie un String ^ et non un std::string, ce sont deux classes différentes.

Pour ta deuxième question : il suffit de changer la portée d valeur au sein de la classe, dans mon exemple elle est locale à la méthode. Pour y acceder sur plusieurs méthodes il suffit de déclarer cette variable en tant qu'attribut (variable membre privée, locale à la classe cette fois-ci). Déclares cet attribut en dehors des méthodes dans la classe Form1 :

ref class Form1 : public Form
{
    // du code

    private:
        String ^ valeur;
    // du code
};

-
Edité par Blue Sh4rk 7 novembre 2014 à 11:36:25

  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 11:49:27

Bon, j'ai un beau message à la compilation :

error C2679: '<<' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'System::String ^' (ou il n'existe pas de conversion acceptable)

Pour être plus précis, je veux que mon programme enregistre la valeur que j'ai coché et qu'ensuite cette valeur soit écrite dans un fichier.
Voici mon code :

private: System::Void checkBoxA0_CheckedChanged(System::Object^  sender, System::EventArgs^  e) 
{
  if (checkBoxA0->Checked) 
  { 
     String ^paramFormat = checkBoxA0->Text; 
  } 
}

private: System::Void buttonTerminer_Click(System::Object^  sender, System::EventArgs^  e) 
{
  truc();
  Application::Exit();
}

void truc(void)
{
  ofstream Fic_Param("C:\\DevCpp\\Essai\\test.txt", ios::app);
  if(Fic_Param != NULL)
  {
    Fic_Param << paramFormat << endl;
    Fic_Param.close();
  }
}

Mais visiblement, je m'y prends mal ^^

  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 12:07:23

String n'est pas std::string, l'opérateur "<<" n'existe pas pour ces types de paramètre.

Il faut, par exemple, convertir votre String^ en std::string, mais c'est une mauvaise idée car les chaines .NET sont en UNICODE et que votre flux C++ STL ne supporte que l'ASCII.

De plus, faire apparaître des chaines de caractère venant de l'IHM dans un fichier est une grosse erreur de conception. Vous ne pourrez plus changer facilement votre IHM et vous ne pourrez plus la localiser pour plusieurs langues.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
7 novembre 2014 à 12:18:59

Le but de mon IHM est de créer un fichier paramètre. Je ne vois pas en quoi c'est une grosse erreur de conception.

  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 12:28:52

Trop de dépendance entre les couches.

Le fait que vous devez transcoder de l'UNICODE de l'IHM vers de l'ASCII de votre sauvegarde en est un exemple flagrant.

Votre nom de paramètre sont fixes, donc associes vos checkbox avec cette constante et non avec le nom affiché.

http://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.tag(v=vs.110).aspx

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
7 novembre 2014 à 12:33:09

Tu es partis pour utiliser du .Net, autant tout faire en .Net :

void Truc()
{
    String ^ fileName = "Chemin\\vers\\ton\\fichier.txt";
    System::IO::StreamWriter ^outfile = gcnew System::IO::StreamWriter(filename, true); // true pour ajouter à la suite sans tout effacer
    try
    {
        // write pour écrire dans le flux
        // pour ajouter un retour ligne, utilises WriteLine
        outfile->Write(paramFormat);
    }
    finally
    {
        delete outfile;
    }
}
  • Partager sur Facebook
  • Partager sur Twitter
7 novembre 2014 à 13:47:10

Attention à l'encodage des caractères ainsi créés.
  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
3 décembre 2018 à 14:50:43

bonjour je m’appelle sytrogof je voudrais savoir comment créer une interface graphique d'une application.
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2018 à 15:50:49

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. Me contacter par MP si besoin.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)