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

Visual C++ Discussion :

GetPixel sous Visual C++ 2005 Express


Sujet :

Visual C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut GetPixel sous Visual C++ 2005 Express
    Bonjour,

    Je commence à m'arracher les cheveux sur un truc sans doute très bête, alors j'ai décidé de vous demander votre aide. J'ai en effet parcouru pas mal de forums à la recherche d'une réponse, mais sans succès.

    J'ai créé sous DEV C++ un petit programme qui lit le pixel à l'écran, et suivant la couleur du pixel en question, réalise une certaine action (pas la peine d'entrer dans les détails). Mon programme étant compliqué, je me suis décidé à passer sous Visual C++ afin de ne plus devoir gérer les LRESULT CALLBACK et autre WinAPI qui me causaient des soucis.

    Le problème c'est qu'après reconversion pour rendre mon code compatible avec Visual, j'obtiens une erreur dont je ne sais que faire. J'ai isolé le problème et créer un programme minimal qui reproduit cette erreur. Il s'agit d'une fenêtre avec un bouton, et quand on clique sur le bouton, le programme est censé lire le pixel (100,100).

    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
     
    #pragma once
     
    #include <windows.h>
     
     
    unsigned Rouge;
     
    COLORREF Couleur;
     
    namespace GetPixel2 {
     
    	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(void)
    		{
    			InitializeComponent();
    			//
    			//TODO : ajoutez ici le code du constructeur
    			//
    		}
     
    	protected:
    		/// <summary>
    		/// Nettoyage des ressources utilisées.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
     
    	private:
    		/// <summary>
    		/// Variable nécessaire au concepteur.
    		/// </summary>
    		System::ComponentModel::Container ^components;
     
    #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->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(113, 92);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"button1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(292, 266);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
     
    		}
    #pragma endregion
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
     
    			HDC hdcScreen = GetDC(NULL);
    			Couleur = GetPixel(hdcScreen,100,100);
    			Rouge = GetRValue(Couleur);
     
     
    			 }
    	};
    }
    L'erreur donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Édition des liens en cours...
    GetPixel2.obj : error LNK2028: jeton non résolu (0A00000E) "extern "C" unsigned long __stdcall GetPixel(struct HDC__ *,int,int)" (?GetPixel@@$$J212YGKPAUHDC__@@HH@Z) référencé dans la fonction "private: void __clrcall GetPixel2::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@GetPixel2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
    GetPixel2.obj : error LNK2028: jeton non résolu (0A00000F) "extern "C" struct HDC__ * __stdcall GetDC(struct HWND__ *)" (?GetDC@@$$J14YGPAUHDC__@@PAUHWND__@@@Z) référencé dans la fonction "private: void __clrcall GetPixel2::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@GetPixel2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
    GetPixel2.obj : error LNK2019: symbole externe non résolu "extern "C" unsigned long __stdcall GetPixel(struct HDC__ *,int,int)" (?GetPixel@@$$J212YGKPAUHDC__@@HH@Z) référencé dans la fonction "private: void __clrcall GetPixel2::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@GetPixel2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
    GetPixel2.obj : error LNK2019: symbole externe non résolu "extern "C" struct HDC__ * __stdcall GetDC(struct HWND__ *)" (?GetDC@@$$J14YGPAUHDC__@@PAUHWND__@@@Z) référencé dans la fonction "private: void __clrcall GetPixel2::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@GetPixel2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
    C:\Documents and Settings\Ludovic\Mes documents\Visual Studio 2005\Projects\GetPixel2\Debug\GetPixel2.exe : fatal error LNK1120: 4 externes non résolus
    Je ne suis pas très au point, mais je ne comprends pas où est le problème. Mes librairies sont correctement chargées (enfin j'espère) alors pourquoi y'a-t'il un problème de linkage ? Est-ce que j'utilise mal GetPixel et GetDC (problème de private ou autre lié à la classe) ? Mais pourquoi alors GetRValue ne pose pas de problème ? Pourtant cela marchait ainsi sous DEV C++, sans problème...

    Merci beaucoup de votre aide.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu lies bien avec la bonne bibliothèque ?

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    si tu utilises les winforms, pourquoi tu n'utilises pas l'objet Graphics du framework .net plutot ?
    avec des choses du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.Drawing.Graphics.FromHwnd(Windows.Forms.Control.Handle)
    System.Drawing.Printing.PrintPageEventArgs.Graphics
    System.Windows.Forms.PaintEventArgs.Graphics

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Miles >> La bibli c'est user32 ou ole32 ? Elles sont toutes les deux dans le dossier des options de Visual. Suivant même les conseils de microsoft, j'ai édité le fichier "corewin_express.vsprops" pour y insérer une bonne liste de bibli susceptibles d'être utilisées :
    ernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib user32.lib.

    nico-pyright(c) >> Je suis débutant en Visual, et je ne connaissais pas l'objet graphics dont tu parles. Je vais aller fouiller le Net à ce propos.

    Merci à vous deux. Si j'ai résolu mon problème, je viendrai vous en rendre compte.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je suis allé voir ce qu'on peut trouver sur les objets graphics. Et voilà à quoi ça peut ressembler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    System::Drawing::Bitmap ^BitmapAMOI;	
    System::Drawing::Graphics ^GraphiqueAMOI;
     
    GraphiqueAMOI = System::Drawing::Graphics::FromHwnd(IntPtr(0));
     
    Color Couleur = BitmapAMOI->GetPixel(100,1000);
    Le code n'est pas fonctionnel car il manque une ligne. Il faudrait enregistrer dans le bitmap ce qui se trouve actuellement dans le Graphics, sinon le bitmap est évidemment vide. Mais je n'ai pas trouvé comment effectuer une telle conversion.

    D'ailleurs d'après ce que je lis sur les forums, on a plutôt tendance à faire l'inverse (Passer de bitmap à graphics pour pouvoir dessinner). Mais alors n'y-a-t'il pas une méthode GetPixel liée à Graphics ? Ou un moyen de faire autrement ?

    Merci d'avance.

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    regarde du coté de Graphics.CopyFromScreen

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je suis allé voir, et ça ne résoud pas mon problème.

    Graphics.CopyFromScreen permet de créer un objet Graphics qui va contenir l'écran ou une partie de l'écran. Cela fait en gros la même chose que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System::Drawing::Graphics::FromHwnd(IntPtr(0));
    Le problème, c'est qu'une fois le graphique créé, on peut seulement écrire dessus, faire des rectangles, des cercles... Moi ce que j'aimerais faire, c'est lire un certain pixel sur ce Graphics...

    Y'a donc deux possibilités :
    - Soit trouver un moyen de lire directement sur le Graphics,
    - Soit enregistrer ce Graphics dans un Bitmap, puis lire le pixel sur le Bitmap.

    Mais je ne trouve aucun code valable. Et même sur la msdn, je trouve rien (<<-- Y'a peut-être quelque chose, mais alors je cherche pas correctement ou pas au bon endroit...).

    Merci encore pour votre aide.

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    regarde ici, il y a un exemple dont tu peux t'inspirer, à traduire en C++ http://msdn2.microsoft.com/en-us/library/fw1kt6f9.aspx

Discussions similaires

  1. Perte partielle de l'autocomplétion sous Visual C++ 2005 Express
    Par Niko_de_bordo dans le forum Visual C++
    Réponses: 1
    Dernier message: 27/04/2010, 15h59
  2. Probléme de deboguage sous Visual c++ 2005 Express
    Par eya02 dans le forum Windows
    Réponses: 2
    Dernier message: 07/12/2009, 18h50
  3. application sous Visual basic 2005 express
    Par elmo93 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/01/2008, 09h55
  4. Debutant besoin d'aide sous visual cpp 2005 express
    Par Jhulk dans le forum Débuter
    Réponses: 2
    Dernier message: 19/10/2007, 23h10
  5. Erreurs de links sous Visual C++ 2005 Express
    Par Spartan03 dans le forum wxWidgets
    Réponses: 6
    Dernier message: 13/11/2006, 18h27

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