0

これは私が今していることです!!!

//picture box
pct->Click += gcnew EventHandler(this,&fornow::Form1::Display);

private: System::Void Display(System::Object^ sender, System::EventArgs^ e){
    PictureBox^ pb = safe_cast<PictureBox^>(sender);
    pictureBox1->Image = pb->Image;
}

どうやら、C++/Cli でデリゲートを使用できないようです。この種のコーディングは初めてです !! それで、クリックした後にイベントハンドラメソッドにさらにいくつかの引数を送信する方法を誰か教えてください。そうすれば、そこのコードでそれを使用できます!!!

System::String があるように、このように送信できれば、次のように書くことができます

private: System::Void Display(System::Object^ sender, System::EventArgs^ e, System::String^  s){
    Mat img = imread(s);
    imshow("",img);  
    waitKey(0);
}

/clr でコンパイルし、試用版と 2010 Visual C++ を使用しています。

このコードは、buttonclick イベント ハンドラーに存在します... コードのその部分を追加しました ...

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    // array<System::String^>^ files = 
    //     System::IO::Directory::GetFiles(textBox1->Text,"*.*",
    //     System::IO::SearchOption::AllDirectories);


    pin_ptr<const wchar_t> wch = PtrToStringChars(textBox1->Text);
    wchar_t wch1[260];
    wcscpy(wch1,wch);
    list<basic_string<wchar_t>> dir;
    list<string> s;
    retrieve *r = new retrieve();


    dir = r->print(wch1,dir);

    for(list<basic_string<wchar_t>>::iterator itr = dir.begin(); itr != dir.end();itr++)
    {
        cout<<std::string(itr->begin(),itr->end())<<endl;
        s.push_back(std::string(itr->begin(),itr->end()));
    }

    filter *f = new filter();  
    s=f->filter1(s); // fills s with paths (strings)
    flowLayoutPanel1->Controls->Clear();

    for(list<string>::iterator i=s.begin();i!=s.end();i++)
    {
        std::string sn = std::string(i->begin(),i->end());
        System::String^ s = gcnew System::String(sn.c_str());

        PictureBox^ pct = gcnew PictureBox();
        if(checkBox1->Checked==true)
            pct->Image = Image::FromFile(s)->GetThumbnailImage(50,50,nullptr,System::IntPtr::Zero);
        if(checkBox1->Checked==false)
            pct->Image = Image::FromFile(s);

        pct->Size = System::Drawing::Size(100,100);
        flowLayoutPanel1->Controls->Add(pct);
        pct->Click += gcnew EventHandler(this,&fornow::Form1::Display);
        Mat img = imread(sn);
        imshow(sn,img);
        waitKey(0);
    }

申し訳ありませんが、この種のコーディングは本当に初めてです..どんな提案も役に立ちますありがとう!!!

4

2 に答える 2

1

クリック イベントに追加のパラメーターを追加することはできません。可能であれば、UI はどこから文字列を取得すると思いますか?

ラムダに関するコメントを考えると、あなたが探しているのは、クリックされた画像に応じてわずかに異なるイベント ハンドラーを持つことだと思います。あれは正しいですか?C# では次のようになります。

// If you were writing C#, is this what you'd do?
pct1.Click += (s,e) => imshow(imread("one.jpg"));
pct2.Click += (s,e) => imshow(imread("two.jpg"));

C++/CLI には厳密に同等のものはありません。ただし、ラムダが何をしているのかを考えると、C++/CLI でそれを行うことができます。ラムダは同じクラスの通常のメソッドに変換され、C++/CLI でそれを行うことができます。

pct1->Click += gcnew EventHandler(this,&fornow::Form1::Display1);
pct2->Click += gcnew EventHandler(this,&fornow::Form1::Display2);

void Display1(Object^ sender, EventArgs^ e)
{
    Display(safe_cast<PictureBox^>(sender), "one.jpg");
}

void Display2(Object^ sender, EventArgs^ e)
{
    Display(safe_cast<PictureBox^>(sender), "two.jpg");
}

void Display(PictureBox^ pb, String^ file)
    Mat img = imread(file);
    imshow(pb, img);  
    waitKey(0);
}

または、どの画像がクリックされたか (送信者) を調べて作業を行う単一のイベント ハンドラーを使用することもできます。

pct1->Click += gcnew EventHandler(this,&fornow::Form1::Display);
pct2->Click += gcnew EventHandler(this,&fornow::Form1::Display);

void Display(Object^ sender, EventArgs^ e)
{
    PictureBox^ pb = safe_cast<PictureBox^>(sender)
    String^ file;

    if(pb == this->pct1) file = "one.jpg";
    else if(pb == this->pct2) file = "two.jpg";
    else return;

    Mat img = imread(file);
    imshow(pb, img);  
    waitKey(0);
}
于 2013-03-28T21:01:33.437 に答える
1

パラメーターを EventArgs から派生した ref クラスにパックすると、このように EventHandler のジェネリック バージョンを使用できます。

public ref class MyEventArgs:EventArgs
{
public:
    property String^ Parameter1;
}

public ref class MyClass
{
public:
    event EventHandler<MyEventArgs^> ^ MyEvent;
    void RaiseMyEvent(Object^ sender, String^ parameter1)
    {           
        MyEventArgs^ args=gcnew MyEventArgs();
        args->Parameter1=parameter1;
        MyEvent(sender, args);
    }
};

イベントハンドラーメソッドには署名があります

void MyEventHandler(Object^ sender, MyEventArgs^ args)

また、args パラメータのプロパティを介して RaiseMyEvent に渡された値にアクセスできます。

于 2013-03-28T21:17:28.650 に答える