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 编译它,我使用试用版 vs 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

将参数打包到从 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 回答
1

您不能向点击事件添加其他参数。如果可以,您希望 UI 从哪里获取字符串?

鉴于您对 lambdas 的评论,我认为您正在寻找的是有一个稍微不同的事件处理程序,具体取决于单击的图片。那是对的吗?在 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 中没有严格的等价物。但是,如果您考虑 lambdas 在做什么,您可以在 C++/CLI 中执行此操作。lambda 被转换为同一类的常规方法,您可以在 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 回答