2010-09-06 59 views
0

成员,我需要一些建议,请在达到特定结果的最佳方式......C#访问形式从单独的类

我的情景......

我有一个Form1类,这是我的主要形成一个图片框。

我有第二个类叫摄像头,使用事件处理程序从我的摄像头抓取帧(位图)。

然后我想以最好的方式将这个帧传递给主窗体中的图片框。

在主窗体的那一刻我的代码:

public static void setPB(Bitmap image) 
{ 

var form = Form.ActiveForm as Form1; 
form.pbWebCamDisplay = image; 

} 

然后在相机类我用

Form1.setPB(设置currentFrame);

这工作正常,但我不确定这是否是最好的编程习惯?是否可以使用自定义事件?

预先感谢任何帮助

汤姆

回答

0

我会在Camera类上创建一个方法,它会拍摄图片并返回一个Bitmap对象。

所以在onload或在按钮的OnClick,调用方法和返回值设置为图片框...

var picture = new Camera().TakePicture(); 
myPictureBox.Image = picture; 

类似的东西:)

编辑:如果Camera类是事件驱动组件(Camera.NewFrame事件),尝试:

(构造函数):

var camera = new Camera(); 
camera.OnNewFrame += new OnNewFrameEventHandler(MyEventHandler); 

(事件处理程序)

public void MyEnventHandler(EventArgs comingFromComponent) 
{ 
    var image = comingFromComponent.Frame; // (hopefully this is the case :)) 
    myPictureBox.Image = image; 
} 
+0

感谢您的回复,不幸的是我需要图片框来显示实时流。我最初在主窗体中使用计时器来获取图像,但是,计时器和新帧事件处理程序不同步,因此难以正确处理位图。 – TomP89 2010-09-06 10:40:38

+0

在这种情况下,你不能只在表单中订阅事件吗?我会更新我的答案... – Bertvan 2010-09-06 10:55:22

+0

这将是理想的,我不知道这一功能。你能否给我一些示例代码。 – TomP89 2010-09-06 10:58:20

0

我会用事件,如果我处在你的位置。

+0

你能指出我在正确的方向如何实施这个请吗?谢谢 – TomP89 2010-09-06 10:38:06

0

是的,我会说是非常好的。您有一个摄像头班负责处理摄像头输入,并为您的表单的私人成员提供公共设置器。我不会改变一点。

通过这种方式,您可以将功能的不同职责分为不同的类。不要在Form类中处理相机事件,而应该像在做一样。

0

当然,事件是正确的选择。您可以使用它们实现观察者设计模式。 您目前的实施不是最佳实践 - 它会强制Camera和Form类之间的紧密耦合。

+0

嗨,如果您有任何好的链接,请您详细说明。感谢您的帮助 – TomP89 2010-09-08 16:39:07

+0

您现在的位置:http://msdn.microsoft.com/en-us/library/ee817669.aspx – 2010-09-09 07:07:54

+0

微软呼叫观察者的事件事件模式,很高兴知道。 – 2010-09-09 07:08:51

0

是什么驱使使Camera类抓取图片的事件? 这很重要。

如果窗体本身触发事件,则甚至不需要窗体中的PictureBox设置器。

顺便说一句,我与豪尔赫科尔多瓦,二传手和抢事件都是你需要的。 奥卡姆剃须刀。

+0

所以..我使用Aforge框架(aforgenet.com),它拥有自己的自定义事件处理程序,它抓取框架。 – TomP89 2010-09-06 10:38:53