IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Object "ligne" windows form


Sujet :

C++/CLI

  1. #1
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut Object "ligne" windows form
    Bonjour � tous,

    Je cherche comment cr�er dans un windows form un control graphique "ligne" comme il y a en VB. Je trouve �a bizarre qu'il n'y en ai pas!!
    Je voudrais pouvoir manipuler les coordonn�es des lignes, si je suis oblig� de les dessins puis les effacer � chaque fois...

    Merci d'avance

  2. #2
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    Avec Visual Studio ?
    CStatic ?

  3. #3
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    Oui j'utilise visual studio et System::Windows::Forms::...
    mon but est de relier par un trait 2 picturebox et lorsque je deplace une picturebox, le trait suive.

    Merci de ta r�ponse, je vais regarder du cot� de Cstatic.

    EDIT::Lorsque j'essaye d'inclure "afxwin.h" pour utiliser la class Cstatic, il me jette. De vagues souvenirs me disent qu'il ne peut etre inclus que lorsque l'on utilise les MFC.. nan? (je dis peux etre une connerie...).

  4. #4
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    Oui c'est un composant MFC, mais je dois avouer que je n'avais pas compris ton premier post. Je croyais que tu parlais d'un ligne de texte, pas d'un trait

    Dans ton cas ne suffirait-il pas d'appeler les fonctions MoveToEx puis LineTo au bon moment ?

  5. #5
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    je n'ai jamais utilis� ces fonctions. Je vais chercher comment les utiliser.
    Merci de ton aide

  6. #6
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    D'apr�s ce que j'ai trouv�:
    MovetoEx correspond aux coordonn�es du point de depart du trait,
    LineTo correspond aux coordonn�es du point d'arriv� du trait.
    Le probl�me est que lorsque je vais bouger ma picturebox, ca va faire un eventail de trait, car il va redessiner des traits � chaque mouvement nan?

  7. #7
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    Non pas si tu dessines au bon moment.
    En ce qui me concerne je fais ce genre de dessin apr�s r�ception du message WM_ERASEBKGND, juste apr�s avoir effac� le contenu de la fen�tre (comportement normal de ta fen�tre) : �a permet que ce trait soit derri�re tout le reste.
    Tu vois ce que je veux dire ou je te parle chinois l� ?

  8. #8
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    Oui c'est presque du chinois... d�sol�.

    1�re question : dans ma windows form, comment g�r� le message WM_ERASEBKGND?

    2�me: qu'entends tu par "juste apr�s avoir effac� le contenu de la fen�tre"?

    Cette m�thode pourrai fonctionner si j'avais, par exemple, 3 picturebox reli�e entre elles par des traits au lieu de 2?

    Merci encore pour ton aide, �a fait pas mal de temps que je suis bloqu� la dessus!

  9. #9
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    Poste ton code stp, je vais voir ce que je peux faire.

  10. #10
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    #pragma once
    #include "Struct.h"
    #include "windows.h"
    #include <string>
    using namespace std;
     
    namespace ftuy 
    {	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
     
     
    	/// <summary>
    	/// Description résumée de Form1
    	///
    	/// AVERTISSEMENT*: si vous modifiez le nom de cette classe, vous devrez modifier la
    	///          propriété 'Nom du fichier de ressources' de l'outil de compilation de ressource managée
    	///          pour tous les fichiers .resx dont dépend cette classe. Dans le cas contraire,
    	///          les concepteurs ne pourront pas interagir correctement avec les ressources
    	///          localisées associées à ce formulaire.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{	public:
    			Form1()
    			{	InitializeComponent();
     
    				//picturebox1
    				System::Windows::Forms::PictureBox^  Picture;
    				Picture = (gcnew System::Windows::Forms::PictureBox());
    				(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(Picture))->BeginInit();
     
    				Picture->Name="ordi_1";
    				Picture->Location = System::Drawing::Point(0, 20);
    				Picture->TabIndex = 0;
    				Picture->ImageLocation="C:\\Users\\tmnc0605\\Dossier_Conf\\LogoMoto.bmp";
    				Controls->Add(Picture);
    				(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(Picture))->EndInit();
    				Picture->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Picture_MouseDown);
    				Picture->MouseMove += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Picture_MouseMove);
    				Picture->MouseUp += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Picture_MouseUp);
     
    				//picturebox2
    				System::Windows::Forms::PictureBox^  Picture2;
    				Picture2 = (gcnew System::Windows::Forms::PictureBox());
    				(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(Picture2))->BeginInit();
     
    				Picture2->Name="ordi_2";
    				Picture2->Location = System::Drawing::Point(0, 100);
    				Picture2->TabIndex = 1;
    				Picture2->ImageLocation="C:\\Users\\tmnc0605\\Dossier_Conf\\LogoMoto.bmp";
    				Controls->Add(Picture2);
    				(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(Picture))->EndInit();
    				Picture2->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Picture_MouseDown);
    				Picture2->MouseMove += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Picture_MouseMove);
    				Picture2->MouseUp += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Picture_MouseUp);
     
    			}
     
     
    		private: System::Void Picture_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) 
    		{	PictureBox^ Cible = (PictureBox^)sender;
    			if(click)
    			{	Cible->Left+=(e->X)-(x_souris);
    				Cible->Top+=(e->Y)-(y_souris);
    				Cible->Location = System::Drawing::Point(Cible->Left, Cible->Top);
    			}
    		}
    		private: System::Void Picture_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) 
    		{	PictureBox^ Cible = (PictureBox^)sender;
    			click=true;
    			x_souris = e->X;
    			y_souris = e->Y;
    		}
    		private: System::Void Picture_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) 
    		{	click=false;
    			x_souris = 0;
    			y_souris = 0;
    		}
     
    		protected:
    			/// <summary>
    			/// Nettoyage des ressources utilisées.
    			/// </summary>
    			~Form1()
    			{	if (components)
    				{	delete components;
    				}
    			}
    				 //System::Windows::Forms::ListBox^  listbox;
     
    		private:
    			/// <summary>
    			/// Variable nécessaire au concepteur.
    			/// </summary>
    			System::ComponentModel::Container ^components;
    			bool click;
    			int x_souris;
    			int y_souris;
     
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
    		/// le contenu de cette méthode avec l'éditeur de code.
    		/// </summary>
    		void InitializeComponent(void)
    		{	this->SuspendLayout();
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 262);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
     
    		}
    		#pragma endregion				
    	};
    }
    R�capitulatif:
    Donc je voudrais tracer un trait entre les 2 picturebox et que lorsque j'en d�place une avec la souris: le trait suive.
    A noter que le nombre de picturebox sera plus elev� � terme.
    L� j'ai simplifi� au maximum pour que ce soit plus clair.
    Merci du temps que tu me consacre.

  11. #11
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    Essaye de surcharger WndProc (pompe � message) pour intercepter le message dont je t'ai parl� plus haut.

  12. #12
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    Ok, � premi�re vu, winproc() n'apparait pas dans mon code, je vais voir comment faire ce que tu me dis.
    Par contre un petit probl�me tout b�te, depuis ce matin j'essaye de tracer une ligne toute bete sans succ�s...

  13. #13
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    ( Je n'ai jamais fait de C++/CLI donc je t '�cris peut-�tre n'importe quoi )
    Dans l'id�e �a donnerai un truc comme �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    virtual void WndProc(Message% m) override
    {
        switch (m.Msg)
        {
            case WM_ERASEBKGND: this.WmEraseBkgnd(m);
                                                break;
            default: Form::WndProc(m);
                                  break;
        }
    }
     
    private void WmEraseBkgnd(Message% m)
    {
        Form::WndProc(m);
     
        //dessiner ta ligne
        //...
    }
    Concernant le trac� de ta ligne il te faut un HDC valide.

  14. #14
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    Merci
    J'ai toujours eu un peu de mal avec les hdc et hwnd,
    voici ce que j'ai fais, il n'aime pas le Form1::hwnd

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    void WmEraseBkgnd(Message m)
    {
        Form::WndProc(m);
        hdc=GetDC(Form1::hwnd);
        MoveToEx(hdc, 0, 0, NULL);
        LineTo(hdc, 50, 50);
    }
    une autre petite question:
    ce message "ecrasebkgr" sert � ecraser le bkgr... mais si j'ai plusieurs traits de trac�s? ils seront tous ecras�s?

  15. #15
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    Comme indiqu� dans la doc que je t'avais pr�c�demment link� sur WM_ERASEBKGND :
    Parameters
    wParam A handle to the device context.
    lParam This parameter is not used.
    => ton HDC est � r�cup�rer en wParam de ton message.

    Concernant le message en lui m�me, c'est le syst�me qui s'occupera de l'envoyer � ta fen�tre � chaque fois qu'elle devra �tre redessin�e. Le comportement de base � la r�ception de ce message est l'effacement de ta fen�tre. Ainsi en tra�ant ton trait juste apr�s l'effacement tu t'assures qu'il sera toujours dessin� "derri�re" les autres composants graphiques.

    C'est plus clair maintenant ?

    PS : pense � utiliser les balises [CODE] ... [/CODE] quand tu postes du code sur le forum !

  16. #16
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    J'ai essay� comme �a, mais j'ai 1 erreur de jeton non resolu et 1 symbole externe non r�solu par m�thodes.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    MoveToEx(static_cast<HDC>(m.WParam.ToPointer()), 0, 0, NULL);
    LineTo(static_cast<HDC>(m.WParam.ToPointer()), 50, 50);
    ReleaseDC(hwnd, static_cast<HDC>(m.WParam.ToPointer()));
    Concernant le message en lui m�me, c'est le syst�me qui s'occupera de l'envoyer � ta fen�tre � chaque fois qu'elle devra �tre redessin�e. Le comportement de base � la r�ception de ce message est l'effacement de ta fen�tre. Ainsi en tra�ant ton trait juste apr�s l'effacement tu t'assures qu'il sera toujours dessin� "derri�re" les autres composants graphiques.
    Comment le syst�me saura qu'il faut redessiner? En admettant ce que tu viens de dire: il faudrait donc que je retrace toutes mes lignes apr�s l'effacement de ma fenetre!?

  17. #17
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    devrait suffire je pense, pas besoin d'aller cherche midi � 14h
    Tu devrais donc avoir quelque chose du genre :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    HDC dc = (HDC)(m.WParam);
    MoveToEx(dc, 0, 0, NULL);
    LineTo(dc, 50, 50);
    en �vitant le ReleaseDC compl�tement hors propos, car tu n'es pas sens� avoir envie de lib�rer un Device Context que tu n'as pas instanci� tout m�me

    Concernant le message en lui m�me, c'est le syst�me qui s'occupera de l'envoyer � ta fen�tre � chaque fois qu'elle devra �tre redessin�e. Le comportement de base � la r�ception de ce message est l'effacement de ta fen�tre. Ainsi en tra�ant ton trait juste apr�s l'effacement tu t'assures qu'il sera toujours dessin� "derri�re" les autres composants graphiques.
    Comment le syst�me saura qu'il faut redessiner? En admettant ce que tu viens de dire: il faudrait donc que je retrace toutes mes lignes apr�s l'effacement de ma fenetre!?
    heureusement que le syst�me fait �norm�ment de choses pour toi, sinon tu pleurerais par tous les orifices de ton petit corps ch�tif

  18. #18
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    Il n'accepte pas la convertion entre syst�m::intptr et HDC.
    C'est pour �a que je suis partis sur compliqu�!!

  19. #19
    Membre �prouv�
    Avatar de TheGzD
    Homme Profil pro
    Ing�nieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Ing�nieur/ Docteur en Informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par d�faut
    Essaye avec le static_cast alors, mais c'est d�j� une sorte de pointeur donc je pense qu'il faut mieux que tu �vites l'appel � ToPointer().
    Ou tu cast en int avant de te d�brouiller pour recaster en HDC.

  20. #20
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    54
    D�tails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 54
    Par d�faut
    Salut GzD,

    Je suis toujours bloqu� sur le casting... J'ai essay� beaucoup de synthaxe hier, mais le compilo me jette toujours!! En regardant sur le net, j'ai l'impression que personne n'y arrive!!

    En tous cas, merci beaucoup pour ton aide.

Discussions similaires

  1. R�ponses: 11
    Dernier message: 06/05/2009, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo