2010-09-06 3 views
0

séparée J'ai besoin des conseils sur la meilleure s'il vous plaît moyen de parvenir à un résultat particulier ...C# membre de forme Accès classe

Mon scénario ...

J'ai une classe Form1, qui est ma principale Former avec une boîte d'image dessus.

J'ai une deuxième classe appelée caméra qui utilise un gestionnaire d'événements saisit une image (bitmap) de ma webcam. Je veux ensuite passer ce cadre à la boîte d'image dans le formulaire principal de la meilleure façon.

Au moment sous la forme principale j'ai le code:

public static void setPB(Bitmap image) 
{ 

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

} 

puis dans la classe de l'appareil J'utilise

Form1.setPB (currentFrame);

Cela fonctionne très bien, mais je ne savais pas si c'était la meilleure pratique de programmation? Est-il possible d'utiliser des événements personnalisés?

Merci à l'avance pour toute aide

Tom

Répondre

0

Je voudrais créer une méthode sur la classe Camera, qui prend l'image et retourne un objet Bitmap.

Ainsi, dans le OnLoad ou dans le OnClick d'un bouton, appeler cette méthode et définir la valeur de retour au PictureBox ...

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

Quelque chose comme ça :)

Edit: Si la classe de la caméra est un composant en fonction des événements (événement Camera.NewFrame), essayez:

(dans le constructeur):

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

(gestionnaire d'événements)

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

Merci pour la réponse, malheureusement, j'ai besoin de la zone d'image pour afficher un flux en direct. J'utilisais initialement une minuterie dans le formulaire principal pour saisir l'image, mais le minuteur et le nouveau gestionnaire d'événements de trame étaient désynchronisés, ce qui rendait difficile la mise au rebut des images bitmap correctement. – TomP89

+0

Dans ce cas, ne pouvez-vous vous abonner à l'événement depuis votre formulaire? Je vais mettre à jour ma réponse ... – Bertvan

+0

ce serait idéal, je n'étais pas au courant de cette fonctionnalité. Seriez-vous capable de me donner un exemple de code? – TomP89

0

j'utiliser des événements si j'étais à votre place.

+0

Seriez-vous en mesure de me diriger dans la bonne direction sur la façon de mettre en œuvre s'il vous plaît? Merci – TomP89

0

Oui, je dirais que c'est parfaitement bien. Vous disposez d'une classe d'appareil photo chargée de gérer l'entrée de la caméra et d'un accesseur public pour un membre privé de votre formulaire. Je ne changerais pas un peu.

De cette façon, vous séparez les différentes responsabilités pour les fonctionnalités dans différentes classes. Ne gérez pas les événements de caméra dans la classe Form, mais faites comme vous le faites.

0

Certainement, les événements sont le bon choix. Vous pouvez implémenter le modèle de conception d'observateur en les utilisant. Votre implémentation actuelle n'est pas recommandée, car elle force le couplage entre la caméra et la classe Form.

+0

Salut, Seriez-vous en mesure d'élaborer s'il vous plaît, si vous avez des liens ce serait génial. Merci pour votre aide – TomP89

+0

Ici vous êtes: http://msdn.microsoft.com/en-us/library/ee817669.aspx –

+0

Microsoft appelle Observer avec des événements un modèle d'événement, bon à savoir. –

0

Qu'est-ce qui détermine l'événement qui fait que la classe Camera capture l'image? Ceci est important.

Vous n'avez même pas besoin du sélecteur PictureBox dans le formulaire si l'événement est déclenché par le formulaire lui-même.

BTW, je suis avec Jorge Córdoba, un setter et un événement grab sont tout ce dont vous avez besoin. Rasoir Occam.

+0

Donc .. j'utilise Aforge framework (aforgenet.com) qui a son propre gestionnaire d'événement personnalisé qui saisit les cadres. – TomP89

Questions connexes