Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utiliser Panel de windows form avec HWND

    2 juillet 2020 à 11:10:45

    Bonjour c'est mon première poste j'espère que j'aurai des réponses :)  je travail sur un projet, je dois créer une interface homme machine en windows form de Visual Studio j'ai besoin d'afficher des images, pour cela j'utilise un Panel, une fois j'appuie sur un Button je lance l'affichage des image, dans le fichier.h j'ai la fonction qui se lance une fois j'appuie sur le button, à l'interieur de ce dernier je lance une fichier.cpp la où je mis le traitement d'image et je veux ajouter l'affichage des image aussi, j'utilise la bibliothèque MIL de Matrox, il ont une fonction "MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, monHandle);" pour l'affichage des résultats dans le troisième paramètre je dois mettre le Handle de mon panel où je veux afficher. pour créer le Handle j'utilise la méthode suivant :

    HWND monHandle;
    
    
    
        monHandle = (HWND)panel1->Handle.ToPointer();
    
        MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, monHandle);
    mais j'ai une erreur, le "panel1" non défini, je sais pas comment le déclarer dans ce fichier.cpp, normalement il est déclaré dans le fichier.h, comment je peux l'utiliser dans le fichier.cpp ?
    fichier.h
    #pragma once
    #include <iostream>
    
    
    namespace test {
    
    	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 MyForm
    	/// </summary>
    	public ref class MyForm : public System::Windows::Forms::Form
    	{
    	public:
    		MyForm(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    			//
    		}
    
    	public:
    		/// <summary>
    		/// Nettoyage des ressources utilisées.
    		/// </summary>
    		~MyForm()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	public: System::Windows::Forms::Panel^ panel1;
    	private: System::Windows::Forms::Button^ button1;
    	private: System::Windows::Forms::Button^ button2;
    	private: System::Windows::Forms::Panel^ panel2;
    	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)
    		{
    			std::cout << "Hello world!" << std::endl;
    			this->panel1 = (gcnew System::Windows::Forms::Panel());
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->button2 = (gcnew System::Windows::Forms::Button());
    			this->panel2 = (gcnew System::Windows::Forms::Panel());
    			this->SuspendLayout();
    			// 
    			// panel1
    			// 
    			this->panel1->AccessibleDescription = L"pan";
    			this->panel1->AccessibleName = L"pan";
    			this->panel1->BackColor = System::Drawing::SystemColors::ControlDark;
    			this->panel1->Location = System::Drawing::Point(385, 83);
    			this->panel1->Name = L"panel1";
    			this->panel1->Size = System::Drawing::Size(384, 273);
    			this->panel1->TabIndex = 0;
    			this->panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MyForm::panel1_Paint);
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(118, 155);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(89, 32);
    			this->button1->TabIndex = 1;
    			this->button1->Text = L"scan code";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
    			// 
    			// button2
    			// 
    			this->button2->Location = System::Drawing::Point(118, 219);
    			this->button2->Name = L"button2";
    			this->button2->Size = System::Drawing::Size(89, 34);
    			this->button2->TabIndex = 2;
    			this->button2->Text = L"test2";
    			this->button2->UseVisualStyleBackColor = true;
    			// 
    			// panel2
    			// 
    			this->panel2->Location = System::Drawing::Point(926, 83);
    			this->panel2->Name = L"panel2";
    			this->panel2->Size = System::Drawing::Size(263, 198);
    			this->panel2->TabIndex = 3;
    			this->panel2->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MyForm::panel2_Paint);
    			// 
    			// MyForm
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(1383, 548);
    			this->Controls->Add(this->panel2);
    			this->Controls->Add(this->button2);
    			this->Controls->Add(this->button1);
    			this->Controls->Add(this->panel1);
    			this->Name = L"MyForm";
    			this->Text = L"MyForm";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	public: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
    
    
    
    
    	}
    	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    
    		int code(void);
    			code();
    
    	}
    	private: System::Void panel2_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
    
    
    
    	}
    };
    }
    
    fichier.cpp
    // This code was generated by MIL CoPilot 10.35.1120
    // on Wednesday, May 20, 2020
    // Compiling and running generated code will require :
    // MIL 10 with Processing Pack 3 and Engineering Fix 632
    
    #include "mil.h"
    #include <iostream>
    #include <windows.h>
    #include <string>
    #include <iostream>
    #include "MyForm.h"
    
    #include <algorithm>
    
    
    using namespace System;
    using namespace std;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    
    
    const MIL_INT32 NbFrames = 4;
    
    // User's processing function hook data object
    MIL_INT MFTYPE ProcessingFunction(MIL_INT HookType, MIL_ID HookId, void* HookDataPtr);
    typedef struct
    {
        MIL_ID Code_Context;
        MIL_ID Code_Result;
        MIL_ID Disp;
        MIL_ID McodeRead_Block_graphicContext;
        MIL_ID McodeRead_Block_graphicList;
    } HookDataStruct;
    
    int code(void)
    {
        MIL_ID MilApplication = M_NULL;
        MIL_ID* GrabBuffers = new MIL_ID[NbFrames];
        MIL_INT Digsizex = 0;
        MIL_INT Digsizey = 0;
        MIL_INT Digsizeband = 0;
        MIL_INT Digtype = 0;
        MIL_ID Codemodel0 = M_NULL;
        MIL_ID MilSystem = M_NULL;
        MIL_ID AIMDPMGrading = M_NULL;
        MIL_ID Code_Context = M_NULL;
        MIL_ID Code_Result = M_NULL;
        MIL_ID Disp = M_NULL;
        MIL_ID McodeRead_Block_graphicContext = M_NULL;
        MIL_ID McodeRead_Block_graphicList = M_NULL;
        HookDataStruct UserHookData;
    
    
    
        /////////////////////////////
    
    
    
    
        /////////////////////////
    
    
    
        MappAlloc(M_NULL, M_DEFAULT, &MilApplication);
        MsysAlloc(M_DEFAULT, MIL_TEXT("M_SYSTEM_HOST"), M_DEFAULT, M_DEFAULT, &MilSystem);
        MdispAlloc(MilSystem, M_DEFAULT, MIL_TEXT("M_DEFAULT"), M_DEFAULT, &Disp);
    
        // Control Block for Disp
        MdispControl(Disp, M_TITLE, MIL_TEXT("Disp"));
    
        MdigAlloc(MilSystem, M_DEFAULT, MIL_TEXT("D:\\STPGroup\\Matrox\\MIL\\Matrox Imaging\\Images\\Full\\AIMDPMGrading"), M_DEFAULT, &AIMDPMGrading);
    
        // Post-Alloc Block for AIMDPMGrading
        MdigInquire(AIMDPMGrading, M_SIZE_X, &Digsizex);
        MdigInquire(AIMDPMGrading, M_SIZE_Y, &Digsizey);
        MdigInquire(AIMDPMGrading, M_SIZE_BAND, &Digsizeband);
        MdigInquire(AIMDPMGrading, M_TYPE, &Digtype);
    
        // MbufAllocColor loop
        for (int t = 0; t < NbFrames; t++)
        {
            GrabBuffers[t] = MbufAllocColor(MilSystem, Digsizeband, Digsizex, Digsizey, Digtype, M_IMAGE + M_PROC + M_GRAB + M_DISP, M_NULL);
        }
    
        MgraAlloc(MilSystem, &McodeRead_Block_graphicContext);
        MgraAllocList(MilSystem, M_DEFAULT, &McodeRead_Block_graphicList);
        McodeAlloc(MilSystem, M_DEFAULT, M_IMPROVED_RECOGNITION, &Code_Context);
    
        // Post-Alloc Block for Code Context
        McodeModel(Code_Context, M_ADD, M_DATAMATRIX, M_NULL, M_DEFAULT, &Codemodel0);
    
        McodeAllocResult(MilSystem, M_DEFAULT, &Code_Result);
    
        // Initialize the user's processing function data structure.
        UserHookData.Code_Context = Code_Context;
        UserHookData.Code_Result = Code_Result;
        UserHookData.Disp = Disp;
        UserHookData.McodeRead_Block_graphicContext = McodeRead_Block_graphicContext;
        UserHookData.McodeRead_Block_graphicList = McodeRead_Block_graphicList;
    
        // MdigProcess operation Block
        MdigProcess(AIMDPMGrading, GrabBuffers, NbFrames, M_START, M_ASYNCHRONOUS + M_REGION_DELETE_AT_EACH_FRAME, ProcessingFunction, &UserHookData);
        MosPrintf(MIL_TEXT("Press enter to stop grabbing\n"));
        MosGetch();
        MdigProcess(AIMDPMGrading, GrabBuffers, NbFrames, M_STOP, M_DEFAULT, ProcessingFunction, &UserHookData);
    
        MosPrintf(MIL_TEXT("Press <ENTER> to continue\n"));
        MosGetch();
    
        // MbufFree loop
        for (int t = 0; t < NbFrames; t++)
        {
            MbufFree(GrabBuffers[t]);
        }
    
        McodeFree(Code_Result);
        McodeFree(Code_Context);
        MgraFree(McodeRead_Block_graphicList);
        MgraFree(McodeRead_Block_graphicContext);
        MdigFree(AIMDPMGrading);
        MdispFree(Disp);
        MsysFree(MilSystem);
        MappFree(MilApplication);
    
        delete[] GrabBuffers;
    
        return 0;
    }
    
    // User's processing function called every time a grab buffer is ready.
    MIL_INT MFTYPE ProcessingFunction(MIL_INT /*HookType*/, MIL_ID HookId, void* HookDataPtr)
    {
        MIL_TEXT_CHAR* String0 = 0;
        MIL_DOUBLE CodeType = 0.0;
        MIL_INT Stringsize9 = 0;
        MIL_DOUBLE Score = 0.0;
        MIL_TEXT_CHAR* EscapeSequence = 0;
        MIL_INT Stringsize10 = 0;
        MIL_DOUBLE EscapeSequenceStringSize = 0.0;
        HookDataStruct* UserHookDataPtr = (HookDataStruct*)HookDataPtr;
        MIL_ID ModifiedBufferId;
    
        // Retrieve the MIL_ID of the grabbed buffer.
        MdigGetHookInfo(HookId, M_MODIFIED_BUFFER + M_BUFFER_ID, &ModifiedBufferId);
        McodeRead(UserHookDataPtr->Code_Context, ModifiedBufferId, UserHookDataPtr->Code_Result);
    
        // Display Block for McodeRead Block
        MgraControl(UserHookDataPtr->McodeRead_Block_graphicContext, M_COLOR, M_COLOR_GREEN);
        McodeDraw(UserHookDataPtr->McodeRead_Block_graphicContext, UserHookDataPtr->Code_Result, UserHookDataPtr->McodeRead_Block_graphicList, M_DRAW_BOX, M_DEFAULT, M_DEFAULT);
        MdispControl(UserHookDataPtr->Disp, M_ASSOCIATED_GRAPHIC_LIST_ID, UserHookDataPtr->McodeRead_Block_graphicList);
        MgraControl(UserHookDataPtr->McodeRead_Block_graphicContext, M_FIXTURE, M_USE_SOURCE_FIRST);
    
        ////////////////////////////////////////////////////////////////////////////////////////
    
        //private: System::Windows::Forms::Panel^ panel1;
        //void InitializeComponent();
    
        //System::Void panel1_Paint(System::Object ^ sender, System::Windows::Forms::PaintEventArgs ^ e);
        //System::Windows::Forms::Panel^ panel1;
        //void panel1();
    
        HWND monHandle;
    
        monHandle = (HWND)panel1->Handle.ToPointer();
        MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, monHandle);
    
        //MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, M_NULL);
    
    
    
        McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_STRING_SIZE + M_TYPE_MIL_INT, &Stringsize9);
        if (Stringsize9 > 1)
        {
            String0 = new MIL_TEXT_CHAR[Stringsize9];
            McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING, String0);
        }
        McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_CODE_TYPE + M_TYPE_MIL_DOUBLE, &CodeType);
        McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_SCORE + M_TYPE_MIL_DOUBLE, &Score);
        McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_ESCAPE_SEQUENCE + M_STRING_SIZE + M_TYPE_MIL_INT, &Stringsize10);
        if (Stringsize10 > 1)
        {
            EscapeSequence = new MIL_TEXT_CHAR[Stringsize10];
            McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_ESCAPE_SEQUENCE, EscapeSequence);
        }
        McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_ESCAPE_SEQUENCE + M_STRING_SIZE + M_TYPE_MIL_DOUBLE, &EscapeSequenceStringSize);
    
        std::cout << "type de code : " << CodeType << std::endl;
        std::cout << "String : " << String0 << std::endl;
        std::cout << "Score : " << Score << std::endl;
        std::cout << "EscapeSequence : " << EscapeSequence << std::endl;
        std::cout << "EscapeSequenceStringSize : " << EscapeSequenceStringSize << std::endl;
    
        //String^ str3 = gcnew String(String0);
        //string ini = System::Convert::ToBase64String(String0);
    
        //std::cout << "Score : " << str3 << std::endl;
    
    
    
        Sleep(2000);
    
    
        MgraClear(UserHookDataPtr->McodeRead_Block_graphicContext, UserHookDataPtr->McodeRead_Block_graphicList);
    
        delete[] String0;
        delete[] EscapeSequence;
        return 0;
    }
    
    
    
    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      2 juillet 2020 à 13:37:10

      Whoua!!!, ce putain de mélange de technologies datant des années 80, avec du C qui tâche venant de la bibliothèque MIL vraisemblablement, et datant des années 2010 avec du C++/CLI.

      Si vous n'êtes pas un minimum expérimenté en C++ et en technologies Windows, c'est plus que casse-gueule.

      Votre message avec toutes ses imprécisions semble montrer que vous manquez de cette expérience.

      La solution est simple mais elle est tellement simple que cela montre, soit que vous êtes encore dans les vapes d'un lundi matin, soit que vous êtes complètement à la rue au niveau technique.

      "panel1" est un champ public de la classe "MyForm", il suffit donc d'avoir accès à l'instance de cette classe. La manière pour y avoir accès simplement est fonction de l'architecture de votre application.

      Visual Studio n'est qu'un IDE donc ne contient rien en tant que tel, "Winform form" est un framework graphique .NET et donc n'a rien à voir avec Visual Studio.

      C'est parce que vous faites du C++/CLI (pas du C++ standard) et que vous avez importé les assemblies .NET de "Winform form" dans votre projet C++/CLI, que vous avez accès aux classes et fonctions de ce framework .NET.

      L'API de MIL semble aussi vieille que Win16 du début des années 80. Vous êtes sûr que vous ne disposez pas d'une librairie plus moderne donc plus efficace et aussi beaucoup plus simple à utiliser ?

      Le fichier cpp est clairement du code généré avec un format bien plus proche du C K&R des années 70 que de la norme C++17 ou C++20. Il y a d'énormes erreurs de conception (des new, non mais allo quoi!!!, et ces magnifiques "nomDeFonction(void){...}",...). Et comme il y a du code dans ce cpp qui n'a rien à faire avec du C K&R, il a très vraisemblablement été "salopé" par vos soins, non ? (mention spéciale au "std::cout" dans une application "Windows form" qui vise le sous-système "windows" exclusivement)

      Généralement, ce type de fichier généré ne doit pas être modifié ou uniquement en suivant scrupuleusement les indications de la documentation et donc en suivant le même "style" de programmation, pour que les cadres de génération et d'intégration dans la chaîne de compilation ne partent pas en sucette. Et là, clairement, c'est pas le cas, c'est pas en C K&R que les modifications ont été faites.

      La ligne 126 du code C++/CLI doit dégagée et vous devez utiliser le .h qui vient avec le fichier .cpp généré par votre "MIL CoPilot 10.35.1120" dans un simple "#include" classique, et en début de fichier, SVP.

      Pour avoir accès à l'instance de la classe "MyForm" dont vous avez besoin, "UserHookDataPtr" devrait avoir la possibilité pour l'utilisateur de cette API datant vraisemblablement de Win16 (1983) de lui passer un pointeur nu bien cracra. Potassez la documentation de MIL qui devrait indiquer comment faire passer des informations spécifiques à la fonction callback.

      Mais sinon, vous êtes vraiment obligé d'utiliser ces antiquités ???

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        2 juillet 2020 à 14:26:28

        Merci pour votre retour !!

        J'ai pas bien compris votre solution en fait pour lier l'affichage (MdispSelecWindow) j'ai besoin de 3eme paramètre le Handle de Panel où je veux afficher et en fait quand j'appuie sut le button je lance le fichier code()

        	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
        
        		int code(void);
        			code();
        
        	}

        donc  je rentre dans la fonction code () dans cette fonction j'ai le traitement pour une lecture de code DataMatrix et en même temps j'aimerai bien afficher les images qui contient les DataMatrix dans le Panel pour cela j'ai créé un panel dans Windows Form, pour le Handle de cette panel, j'ai eu une proposition de déclarer l'affichage comme suivant :

            HWND monHandle;
            monHandle = (HWND)panel1->Handle.ToPointer();
            MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, monHandle);

        j'ai pas bien compris comment ça marche et aussi avec l'erreur de Panel qui n'est pas définit sur ce fichier.cpp. Je vois pas comment le déclarer sachant qu'il est dans le fichier.h 

        	private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
        	}

        il est aussi nommé panel1_Paint, je sais pas lequel il faut utiliser ?

        La discription du 3eme paramètre de la fonction MdispSelecWindow : 

        ClientWindowHandle

        Specifies the window handle of the user-defined window or child window. This window must have a window handle of type HWND or X11. For example, the Windows API functions can create a window with an HWND handle, and third-party functions (like Qt) can create an X11 window handle. If this parameter is set to zero, this function behaves like MdispSelect().

         DisplayHostingObject

        Specifies a System.Windows.Forms.Integration.WindowsFormsHost object that should host the MIL display. This object must have been created in a Windows Presentation Foundation (WPF) application before calling this function. If this parameter is set to null in C# or Nothing in VB .NET, this function behaves like MdispSelect().

         j'ai pas bien compris ce que je dois ajouter pour utiliser le panel comme afficheur

        -
        Edité par Mlagh 2 juillet 2020 à 14:36:44

        • Partager sur Facebook
        • Partager sur Twitter
          2 juillet 2020 à 15:35:11

          Ok, vous êtes un pied tendre, même en C++ standard, si je ne me trompe pas.

          La chose à faire que je vous ai proposé est très simple pour un programmer "expérimenté" en C++, d'un point de vue programmation système.

          C'est juste passer un pointeur sur un objet C++ dans une API C. Un truc très commun en C++ "système".

          Bon, après, je me suis dispersé avec des explications pour me la péter. :-°

          La marche pour comprendre mes explications est un peu sévère si vous n'êtes pas très versé dans la programmation Windows en C++.

          Vos nouvelles explications montrent toujours que vous êtes toujours un peu à la rue techniquement, car vous vous focalisez énormément sur la localisation du code en terme de fichier alors que cela n'a AUCUNE importance pour le compilateur. Ce qui est important, c'est où est le code vis à vis des "structures" du langage (classes, fonctions, blocs, etc...). Sans une maîtrise correcte de ces notions, vous n'arriverez à pas grand-chose en C++.

          Exemple:

          ce code ligne 3 (ex 126):

          int code(void);

          ça fait quoi pour vous ?

          Pour moi, c'est juste truander le compilateur pour qu'il ne puisse pas correctement nous aider à analyser et corriger des erreurs.

          A supprimer et à remplacer par l'utilisation d'un "#include" d'un fichier .h correspondant au fichier .cpp généré.

          Vos nouvelles "explications" sont tout à fait en accord avec mes explications, montrant que vous n'avez pas compris les miennes. :(

          J'avais fait la mauvaise assertion qu'aux vues de la qualité "primitive" du code généré, on été face à une bibliothèque antédiluvienne.

          Assertion encore plus renforcé par le nombre conséquent de grossières erreurs, que j'espère vienne de vos "bricolage" et pas du code généré.

          Mais les extraits de la documentation que vous avez posté mentionne WPF, ce qui ne colle pas, car WPF est sorti vers 2007.

          J'ai donc jeté très rapidement à la documentation pour voir qu'il existe un wrapper .NET à cette bibliothèque.

          https://www.matrox.com/imaging/media/pdf/products/developers_center/HelpFilesX1911/extfile/z_MIL_UG_introduction/UserGuide/introduction/Introduction_to_MIL_and_MILLite.htm

          Faites simple, si vous faites de C++/CLI, utilisez ce wrapper et non la bibliothèque "en dur".

          Cela sera beaucoup plus simple, beaucoup plus maintenable, et évitera pas mal de problème que je sens insurmontable pour votre faible expérience.

          P.S.: le caractère "primitif" du code généré peut très bien être justifié pour des problématiques de compatibilité avec l'ensemble des compilateurs cibles de la librairie.

          -
          Edité par bacelar 2 juillet 2020 à 16:08:46

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            2 juillet 2020 à 17:04:56

            Oui vous avez tout à fait raison c'est mon première vrai projet en C++ (j'ai déjà fait quelques un à la fac) donc 'ingore pas votre réponse mais plutôt je comprend toutes les détails :) 

            en fait sur l'interface graphique que j'ai créé sur windows form une fois j'appuie sur la button start lance ce qu'est dans cette partie du code : 

            	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            
            		int code(void);
            			code();
            
            	}

            pour lancer ce qui déclarer dans la fonction code (le traitement générer par MilCopilot (télécharger les images lire le datamatrix ... Affichage dans le Panel, afficher les résultats )), donc à coté de cette button il y a un panel où je veux afficher les images qu'est dans le fichier MyForm.h

            #pragma once
            
            namespace test {
            
            	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 MyForm
            	/// </summary>
            	public ref class MyForm : public System::Windows::Forms::Form
            	{
            	public:
            		MyForm(void)
            		{
            			InitializeComponent();
            			//
            			//TODO: ajoutez ici le code du constructeur
            			//
            		}
            
            	protected:
            		/// <summary>
            		/// Nettoyage des ressources utilisées.
            		/// </summary>
            		~MyForm()
            		{
            			if (components)
            			{
            				delete components;
            			}
            		}
            	private: System::Windows::Forms::Panel^ panel1;
            	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->panel1 = (gcnew System::Windows::Forms::Panel());
            			this->button1 = (gcnew System::Windows::Forms::Button());
            			this->SuspendLayout();
            			// 
            			// panel1
            			// 
            			this->panel1->AccessibleDescription = L"panel1";
            			this->panel1->AccessibleName = L"panel1";
            			this->panel1->AccessibleRole = System::Windows::Forms::AccessibleRole::None;
            			this->panel1->BackColor = System::Drawing::SystemColors::ControlDark;
            			this->panel1->Location = System::Drawing::Point(358, 71);
            			this->panel1->Name = L"panel1";
            			this->panel1->Size = System::Drawing::Size(437, 266);
            			this->panel1->TabIndex = 0;
            			this->panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MyForm::panel1_Paint);
            			// 
            			// button1
            			// 
            			this->button1->Location = System::Drawing::Point(118, 155);
            			this->button1->Name = L"button1";
            			this->button1->Size = System::Drawing::Size(89, 32);
            			this->button1->TabIndex = 1;
            			this->button1->Text = L"scan code";
            			this->button1->UseVisualStyleBackColor = true;
            			this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
            			// 
            			// MyForm
            			// 
            			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
            			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            			this->ClientSize = System::Drawing::Size(864, 427);
            			this->Controls->Add(this->button1);
            			this->Controls->Add(this->panel1);
            			this->Name = L"MyForm";
            			this->Text = L"MyForm";
            			this->ResumeLayout(false);
            
            		}
            #pragma endregion
            	private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
            	}
            	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            
            		int code(void);
            			code();
            
            	}
            	};
            }
            

            J'ai besoin d'ajouter le Handle de ce panel à la fonction de Mil pour qu'il puisse afficher les images sur ce dernier, le support de la Bibliothème m'a proposé de le déclarer comme suivant : 

                HWND monHandle;
                monHandle = (HWND)panel1->Handle.ToPointer();
                MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, monHandle);

            sauf que le panel1 est non définit, donc je sais pas par quoi je le remplace ou comment le déclarer :/

            j'avoie que je suis bien débutant sur C++ surtt la partie interface windows form si vous avez d'autre proposition ou méthode pour que je puisse créé une interface et commandé le reste de la machine (camera et axes )


            Merci d'avance !!!


            • Partager sur Facebook
            • Partager sur Twitter
              2 juillet 2020 à 17:36:17

              >le support de la Bibliothème

              ???

              J'ai l'impression que le "support" est comme moi, il voit pas comment vous pouvez être bloqué par une tâche aussi triviale (mais qui sent bon le codage pourri lié à l'utilisation d'une API C depuis du C++).

              C'est pas compliqué dans l'absolue mais vous semblez ne pas avoir de solides base en C ni en C++.

              >je suis bien débutant sur C++ surtt la partie interface windows form

              C'est pas sur "Windows Form" qu'est le problème, c'est sur du C++ "système", de base.

              Si vous utilisez leur wrapper (et s'ils n'ont pas celui-ci comme des shadocks) le code n’aura rien à voir ce gloubiboulga imposé par le passage de C++ à C. Il sera beaucoup beaucoup plus simple.

              >si vous avez d'autre proposition ou méthode...

              Vous n'avez pas les bases, des solutions, il y en a des milliers, mais sans les bases, ça reste illusoire.

              Si vous n'êtes dans un contexte .NET, pourquoi utiliser WinForm ?

              C'est les contraintes de votre projet qui doivent guider le choix des technologies, pas un tirage au sort au pif dans une liste de mots clé que notre ami Google vous a vomi à partir d'une question sans "vista".

              "Winform" est l'une des technologies les plus simples à prendre en main, et avec un wrapper .NET à votre librairie, c'est du gâteau.

              Vous proposez une autre solution, et aux vues de vos lacunes, ne fera que repousser, un peu, les problèmes.

              Prenez la peine d'essayer de comprendre nos réponses quitte à poser des questions, il n'y en a pas de bête.

              Je vais être directif, tant que vous ne saurez pas comment accéder à une instance d'objet C++ à partir de fonction callback C, n'essayez pas de faire une IHM en C++.

              Une solution avec le moins de boulot, faire une IHM avec Winforms en C#. Vous pourrez ainsi utiliser les éventuels exemples de la documentation de MIL. Le passage de C# aux C++/CLI sur ces aspects IHM sera très simple, c'est du ligne à ligne, si l'aspect C++ est important pour votre projet.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                3 juillet 2020 à 9:11:09

                Merci pour votre retour, Mon projet m'oblige d'utiliser C++ pour commander les axes pour commander l'imprimante et pour le traitement d'image j'utilise MIL qui me propose des partie de code à l'aide de MilCopilot, tous ca en C++, j'ai besoin aussi de créer une interface homme machine, donc les solutions que j'ai trouver c'est d'utiliser Windows Form de Visual Studio (ce que j'ai trouvé sur internet) je sais pas si il y a d'autre moyen pour créer des interface (HTML par exemple et derrière commander le reste de la machine en C++ ) donc je suis partie sur Windows Form.

                Je vais être directif, tant que vous ne saurez pas comment accéder à une instance d'objet C++ à partir de fonction callback C, n'essayez pas de faire une IHM en C++.

                Est ce que c'est possible de me montrer comment faire (j'avoue que je suis débutant mais j'ai la motivation pour apprendre :) ) je suis bien bloqué avec cette erreurs je vois pas comment faire et j'ai besoin d'afficher les images sur ce Panel.

                "Winform" est l'une des technologies les plus simples à prendre en main, et avec un wrapper .NET à votre librairie, c'est du gâteau.

                J'ai pas bien compris cette solutions si vous pouvez me la détailler un peu plus !!

                Merci beaucoup 

                • Partager sur Facebook
                • Partager sur Twitter
                  3 juillet 2020 à 11:37:52

                  >Windows Form de Visual Studio

                  Vous êtes un troll ?

                  J'ai déjà indiqué explicitement que cela est complètement faux comme dénomination.

                  J'ai l'impression que vous ne faites absolument aucun effort pour comprendre quoi que ce soit.

                   >Mon projet m'oblige d'utiliser C++ pour commander les axes pour commander l'imprimante

                  Rien n'est obligatoire en informatique et un projet entier n'a pas besoin d'avoir qu'un seul langage.

                  Mais bon, vous semblez déjà bien galérer avec un seul langage.

                  Si l'axe majeur de votre application est "commander les axes pour commander l'imprimante" et que les exemples sont en C++, pourquoi pas.

                  Mais c'est assez étrange que cela soit le C++, sur ce type de logiciel proche du matériel, c'est plutôt le C qui fait encore la loi. Et en C, vous n'avez pas ce type de problème avec la librairie MIL, qui fournit une API C, pas C++ (si l'on ne compte pas C++/CLI pour le wrapper .NET).

                  Si vous avez confondu C++ et C, le plus simple, c'est de ne faire que du C et donc de prendre une librairie graphique C => aller sur le forum C et non sur le forum C++.

                  Si c'est bien du C++, "Windows Form" (c'est du .NET et pas du Visual Studio à la con BORDEL) est loin d'être la solution la plus "paisible", surtout quand on ne cherche pas trop à comprendre ce que l'on fait. Il y a littéralement des centaines d'autres framework graphique qui sont bien plus axé C++ que "Windows Form". "Windows Form", c'est du .NET donc langage agnostique mais le langage le plus utiliser est le C#, donc les "meilleurs" exemples sont en C#. C'est pas la fin du monde de passer d'un code C# à un code C++/CLI mais comme vous semblez attendre du tout cuit dans le bec, je considère que vous n'êtes pas près.

                  Vous n'avez pas besoin de .NET, vous n'êtes pas curieux (voir vous êtes flemmard), utilisez des librairies graphiques C++ qui vous demanderont moins d'efforts, en vrac Qt, etc (https://en.cppreference.com/w/cpp/links/libs)

                  Mais bon, faut quand même connaitre un minimum le C++.

                  >pour le traitement d'image

                  Quel traitement d'image vous "oblige" à utiliser MIL qui ne serait pas dans une "vraie" librairie C++ ???

                  Je rappelle que ce bidule n'est pas gratuit, donc on le choisi pas au pif.

                  >j'ai besoin aussi de créer une interface homme machine

                  Et ? Comme indiqué, il y a des dizaines voire des centaines de librairies qui permettent cela.

                  >donc les solutions que j'ai trouver c'est d'utiliser Windows Form

                  C'est donc Google qui fait les choix stratégique pour votre projet ?

                  On commence par évaluer les solutions possible AVANT dans choisir une, bordel.

                  >Est ce que c'est possible de me montrer comment faire

                  Bon, on va faire ça de manière très sale, mais comme vous ne cherchez pas à comprendre basta :

                  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
                      HWND handle = (HWND)panel1->Handle.ToPointer();
                      code(handle);
                  }
                  int code(HWND hwnd)
                  {
                  ....
                      MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, hwnd);
                  ....
                  }




                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    3 juillet 2020 à 13:17:23

                    Bon je commence de comprendre un peu les termes que vous m'expliquez je commence par lire et comprendre ça, ça avance !! Merciii 

                    J'ai essayé la solution que vous m'avez donné mais j'ai une erreur de "hwnd" non défini :euh:

                    Je sais pas comment faire le problème qu'il me reste un mois pour envoyé mon rapport de stage :( donc c chaud de relire et de recommencer dès le début 

                    Merci beaucoup pour vos repenses !! c pas facile la programmation :D

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 juillet 2020 à 13:25:31

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                        3 juillet 2020 à 15:31:50

                        je l'ai deja ajouté :/

                        #include "mil.h"
                        #include <iostream>
                        #include <windows.h>
                        #include <string>
                        #include <iostream>
                        #include "MyForm.h"
                        #include <windef.h>
                        #include <algorithm>
                        
                        
                        using namespace System;
                        using namespace std;
                        
                        
                        const MIL_INT32 NbFrames = 4;
                        
                        // User's processing function hook data object
                        MIL_INT MFTYPE ProcessingFunction(MIL_INT HookType, MIL_ID HookId, void* HookDataPtr);
                        typedef struct
                        {
                            MIL_ID Code_Context;
                            MIL_ID Code_Result;
                            MIL_ID Disp;
                            MIL_ID McodeRead_Block_graphicContext;
                            MIL_ID McodeRead_Block_graphicList;
                        } HookDataStruct;
                        
                        int code(HWND hwnd) 
                        {
                            MIL_ID MilApplication = M_NULL;
                            MIL_ID* GrabBuffers = new MIL_ID[NbFrames];
                            MIL_INT Digsizex = 0;
                            MIL_INT Digsizey = 0;
                            MIL_INT Digsizeband = 0;
                            MIL_INT Digtype = 0;
                            MIL_ID Codemodel0 = M_NULL;
                            MIL_ID MilSystem = M_NULL;
                            MIL_ID AIMDPMGrading = M_NULL;
                            MIL_ID Code_Context = M_NULL;
                            MIL_ID Code_Result = M_NULL;
                            MIL_ID Disp = M_NULL;
                            MIL_ID McodeRead_Block_graphicContext = M_NULL;
                            MIL_ID McodeRead_Block_graphicList = M_NULL;
                            HookDataStruct UserHookData;
                        
                            MappAlloc(M_NULL, M_DEFAULT, &MilApplication);
                            MsysAlloc(M_DEFAULT, MIL_TEXT("M_SYSTEM_HOST"), M_DEFAULT, M_DEFAULT, &MilSystem);
                            MdispAlloc(MilSystem, M_DEFAULT, MIL_TEXT("M_DEFAULT"), M_DEFAULT, &Disp);
                        
                            // Control Block for Disp
                            MdispControl(Disp, M_TITLE, MIL_TEXT("Disp"));
                        
                            MdigAlloc(MilSystem, M_DEFAULT, MIL_TEXT("D:\\STPGroup\\Matrox\\MIL\\Matrox Imaging\\Images\\Full\\AIMDPMGrading"), M_DEFAULT, &AIMDPMGrading);
                        
                            // Post-Alloc Block for AIMDPMGrading
                            MdigInquire(AIMDPMGrading, M_SIZE_X, &Digsizex);
                            MdigInquire(AIMDPMGrading, M_SIZE_Y, &Digsizey);
                            MdigInquire(AIMDPMGrading, M_SIZE_BAND, &Digsizeband);
                            MdigInquire(AIMDPMGrading, M_TYPE, &Digtype);
                        
                            // MbufAllocColor loop
                            for (int t = 0; t < NbFrames; t++)
                            {
                                GrabBuffers[t] = MbufAllocColor(MilSystem, Digsizeband, Digsizex, Digsizey, Digtype, M_IMAGE + M_PROC + M_GRAB + M_DISP, M_NULL);
                            }
                        
                            MgraAlloc(MilSystem, &McodeRead_Block_graphicContext);
                            MgraAllocList(MilSystem, M_DEFAULT, &McodeRead_Block_graphicList);
                            McodeAlloc(MilSystem, M_DEFAULT, M_IMPROVED_RECOGNITION, &Code_Context);
                        
                            // Post-Alloc Block for Code Context
                            McodeModel(Code_Context, M_ADD, M_DATAMATRIX, M_NULL, M_DEFAULT, &Codemodel0);
                        
                            McodeAllocResult(MilSystem, M_DEFAULT, &Code_Result);
                        
                            // Initialize the user's processing function data structure.
                            UserHookData.Code_Context = Code_Context;
                            UserHookData.Code_Result = Code_Result;
                            UserHookData.Disp = Disp;
                            UserHookData.McodeRead_Block_graphicContext = McodeRead_Block_graphicContext;
                            UserHookData.McodeRead_Block_graphicList = McodeRead_Block_graphicList;
                        
                            // MdigProcess operation Block
                            MdigProcess(AIMDPMGrading, GrabBuffers, NbFrames, M_START, M_ASYNCHRONOUS + M_REGION_DELETE_AT_EACH_FRAME, ProcessingFunction, &UserHookData);
                            MosPrintf(MIL_TEXT("Press enter to stop grabbing\n"));
                            MosGetch();
                            MdigProcess(AIMDPMGrading, GrabBuffers, NbFrames, M_STOP, M_DEFAULT, ProcessingFunction, &UserHookData);
                        
                            MosPrintf(MIL_TEXT("Press <ENTER> to continue\n"));
                            MosGetch();
                        
                            // MbufFree loop
                            for (int t = 0; t < NbFrames; t++)
                            {
                                MbufFree(GrabBuffers[t]);
                            }
                        
                            McodeFree(Code_Result);
                            McodeFree(Code_Context);
                            MgraFree(McodeRead_Block_graphicList);
                            MgraFree(McodeRead_Block_graphicContext);
                            MdigFree(AIMDPMGrading);
                            MdispFree(Disp);
                            MsysFree(MilSystem);
                            MappFree(MilApplication);
                        
                            delete[] GrabBuffers;
                        
                            return 0;
                        }
                        
                        // User's processing function called every time a grab buffer is ready.
                        MIL_INT MFTYPE ProcessingFunction(MIL_INT /*HookType*/, MIL_ID HookId, void* HookDataPtr)
                        {
                            MIL_TEXT_CHAR* String0 = 0;
                            MIL_DOUBLE CodeType = 0.0;
                            MIL_INT Stringsize9 = 0;
                            MIL_DOUBLE Score = 0.0;
                            MIL_TEXT_CHAR* EscapeSequence = 0;
                            MIL_INT Stringsize10 = 0;
                            MIL_DOUBLE EscapeSequenceStringSize = 0.0;
                            HookDataStruct* UserHookDataPtr = (HookDataStruct*)HookDataPtr;
                            MIL_ID ModifiedBufferId;
                            // Retrieve the MIL_ID of the grabbed buffer.
                            MdigGetHookInfo(HookId, M_MODIFIED_BUFFER + M_BUFFER_ID, &ModifiedBufferId);
                            McodeRead(UserHookDataPtr->Code_Context, ModifiedBufferId, UserHookDataPtr->Code_Result);
                        
                            // Display Block for McodeRead Block
                            MgraControl(UserHookDataPtr->McodeRead_Block_graphicContext, M_COLOR, M_COLOR_GREEN);
                            McodeDraw(UserHookDataPtr->McodeRead_Block_graphicContext, UserHookDataPtr->Code_Result, UserHookDataPtr->McodeRead_Block_graphicList, M_DRAW_BOX, M_DEFAULT, M_DEFAULT);
                            MdispControl(UserHookDataPtr->Disp, M_ASSOCIATED_GRAPHIC_LIST_ID, UserHookDataPtr->McodeRead_Block_graphicList);
                            MgraControl(UserHookDataPtr->McodeRead_Block_graphicContext, M_FIXTURE, M_USE_SOURCE_FIRST);
                        
                            ////////////////////////////////////////////////////////////////////////////////////////
                        
                        
                        
                        
                            //HWND hwnd;
                            //monHandle = (HWND)panel1->Handle.ToPointer();
                            MdispSelectWindow(UserHookDataPtr->Disp, ModifiedBufferId, hwnd);
                        
                        
                        
                            McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_STRING_SIZE + M_TYPE_MIL_INT, &Stringsize9);
                            if (Stringsize9 > 1)
                            {
                                String0 = new MIL_TEXT_CHAR[Stringsize9];
                                McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING, String0);
                            }
                            McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_CODE_TYPE + M_TYPE_MIL_DOUBLE, &CodeType);
                            McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_SCORE + M_TYPE_MIL_DOUBLE, &Score);
                            McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_ESCAPE_SEQUENCE + M_STRING_SIZE + M_TYPE_MIL_INT, &Stringsize10);
                            if (Stringsize10 > 1)
                            {
                                EscapeSequence = new MIL_TEXT_CHAR[Stringsize10];
                                McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_ESCAPE_SEQUENCE, EscapeSequence);
                            }
                            McodeGetResultSingle(UserHookDataPtr->Code_Result, 0, M_STRING + M_ESCAPE_SEQUENCE + M_STRING_SIZE + M_TYPE_MIL_DOUBLE, &EscapeSequenceStringSize);
                        
                            std::cout << "type de code : " << CodeType << std::endl;
                            std::cout << "String : " << String0 << std::endl;
                            std::cout << "Score : " << Score << std::endl;
                            std::cout << "EscapeSequence : " << EscapeSequence << std::endl;
                            std::cout << "EscapeSequenceStringSize : " << EscapeSequenceStringSize << std::endl;
                        
                            //String^ str3 = gcnew String(String0);
                            //string ini = System::Convert::ToBase64String(String0);
                        
                            //std::cout << "Score : " << str3 << std::endl;
                        
                        
                        
                            Sleep(2000);
                        
                        
                            MgraClear(UserHookDataPtr->McodeRead_Block_graphicContext, UserHookDataPtr->McodeRead_Block_graphicList);
                        
                            delete[] String0;
                            delete[] EscapeSequence;
                            return 0;
                        }
                        
                        
                        
                        #pragma once
                        
                        namespace test {
                        
                        	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 MyForm
                        	/// </summary>
                        	public ref class MyForm : public System::Windows::Forms::Form
                        	{
                        	public:
                        		MyForm(void)
                        		{
                        			InitializeComponent();
                        			//
                        			//TODO: ajoutez ici le code du constructeur
                        			//
                        		}
                        
                        	protected:
                        		/// <summary>
                        		/// Nettoyage des ressources utilisées.
                        		/// </summary>
                        		~MyForm()
                        		{
                        			if (components)
                        			{
                        				delete components;
                        			}
                        		}
                        	private: System::Windows::Forms::Panel^ panel1;
                        	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->panel1 = (gcnew System::Windows::Forms::Panel());
                        			this->button1 = (gcnew System::Windows::Forms::Button());
                        			this->SuspendLayout();
                        			// 
                        			// panel1
                        			// 
                        			this->panel1->AccessibleDescription = L"pan";
                        			this->panel1->AccessibleName = L"pan";
                        			this->panel1->BackColor = System::Drawing::SystemColors::ControlDark;
                        			this->panel1->Location = System::Drawing::Point(384, 83);
                        			this->panel1->Name = L"panel1";
                        			this->panel1->Size = System::Drawing::Size(384, 273);
                        			this->panel1->TabIndex = 0;
                        			this->panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &MyForm::panel1_Paint);
                        			// 
                        			// button1
                        			// 
                        			this->button1->Location = System::Drawing::Point(118, 155);
                        			this->button1->Name = L"button1";
                        			this->button1->Size = System::Drawing::Size(89, 32);
                        			this->button1->TabIndex = 1;
                        			this->button1->Text = L"scan code";
                        			this->button1->UseVisualStyleBackColor = true;
                        			this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
                        			// 
                        			// MyForm
                        			// 
                        			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
                        			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                        			this->ClientSize = System::Drawing::Size(864, 427);
                        			this->Controls->Add(this->button1);
                        			this->Controls->Add(this->panel1);
                        			this->Name = L"MyForm";
                        			this->Text = L"MyForm";
                        			this->ResumeLayout(false);
                        
                        		}
                        #pragma endregion
                        	private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
                        	}
                        	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
                        
                        		HWND handle = (HWND)panel1->Handle.ToPointer();
                        		code(handle);
                        
                        	}
                        
                        	};
                        }
                        

                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 juillet 2020 à 16:03:32

                          Je vois pas l'image.

                          Dans le .h, l'include, bordel, lisez les messages d'erreurs, révisez vos cours de C ou de C++, c'est la base de la base.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                          Utiliser Panel de windows form avec HWND

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown