0

有两个带有两个不同图像的图片框。

如果我单击一个图片框,其中的图像应该被清除。

更糟糕的是,两个图片框只有一个公共事件处理程序。我如何知道是哪个图片框生成了该事件?我会欣赏 C++-CLI 中的源代码

我需要知道在函数内部写什么:

private: System::Void sqaure_Click(System::Object^  sender, System::EventArgs^  e) {

}

编辑:问题是当我尝试将发件人转换为 picurebox 时,它会给出一个错误,指出无法转换类型。

4

6 回答 6

4

你演的怎么样?在大多数情况下,我会使用:

PictureBox ^pb = safe_cast<PictureBox^>(sender);
if(pb != null) {
    // logic goes here
}

(请注意,在 Josh 指出我的参考缺陷之后,我已经更正了上面的代码。谢谢!)

如果它可以转换,动态转换将为您提供正确的对象类型,如果不能转换,则为 null(它相当于 C# 中的“as”)

如果这确实给了您一个空引用,那么您的发件人可能不是您认为的那样?

于 2008-11-28T15:04:41.727 回答
0

您可以使用发件人对象。将其投射到图片框控件并将其与两个可用的图片框进行比较。

我的 Visual C++ 有点生疏,现在无法提供代码。

于 2008-11-27T14:47:47.937 回答
0

kgiannakakis,问题是当我尝试将发件人转换为 picurebox 时,它给出了一个错误,指出无法转换类型。

于 2008-11-27T14:50:46.087 回答
0

您确定发件人对象实际上是您假设的类型吗?

于 2008-11-27T15:14:44.760 回答
0

如果您正在尝试 Toji 提供的代码,那么您就有问题了 - 试试这个:

PictureBox ^pb = safe_cast<PictureBox^>(sender);

与不需要任何语法来表示托管堆对象的 C# 不同,C++\CLI 区分堆栈对象 ( PictureBox pb)、指向堆对象的指针 ( PictureBox *pb) 和托管堆对象的句柄 ( PictureBox ^pb)。这三者不是一回事,并且有不同的生命周期和用途。

于 2008-11-28T17:39:35.547 回答
0

你想怎么投?我通常会使用dynamic_castor safe_cast

PictureBox ^ pb = dynamic_cast<PictureBox^>(sender);
if (pb != nullptr)
{
...
}

或者

try
{
    PictureBox ^ pb = safe_cast<PictureBox^>(sender);
    ...
}
catch(InvalidCastException ^ exp)
{
    // Handle a cast that went awry
}

从那里开始应该很简单......

于 2008-12-12T05:58:52.067 回答