2010-12-14 78 views
1

J'ai créé une classe de contrôle MFC, dérivée de CWnd.Comment diviser une classe de contrôle en une implémentation par rapport à une interface publique?

Le contrôle est écrit à partir de rien et n'utilise aucun contrôle enfant. Cette classe unique implémente toute la logique de contrôle, y compris la maintenance d'état, la peinture, la réponse aux événements, etc.

De plus, j'ai besoin d'une interface plus "publique" pour être utilisée par le code qui utilise le contrôle. Idéalement, il semble que ce serait une classe plus simple avec une interface beaucoup plus simple. Cependant, avoir deux classes MFC associées à la même fenêtre semble causer toutes sortes de problèmes, ou n'est même pas possible.

Je ne suis pas vraiment sûr de la meilleure façon d'aborder cela. Je suis intéressé par des réflexions sur la meilleure façon de fournir une classe d'interface simple à un contrôle comme celui-ci.

Notez que le contrôle n'est pas précompilé dans une bibliothèque ou quoi que ce soit. Il sera compilé dans le cadre de l'application.

Répondre

1

Vous pourriez essayer de diviser la classe en deux, la classe d'implémentation la plus compliquée étant un enfant de la classe publique.

Habituellement, je suggère de créer une classe d'interface virtuelle pure distincte et d'utiliser l'héritage multiple pour la connecter au MFC, mais je suppose que vous voudrez utiliser les méthodes CWnd standard sur l'interface.

+0

J'aime un peu le son de ça. Je pourrais créer une classe quelque chose comme CControl qui pourrait être utilisé pour l'interface avec le contrôle, et puis quelque chose comme CControlInternal qui dérive de CControl qui ajoute la fonctionnalité de base. Les deux pourraient référencer la même fenêtre très bien. –

1

Les interfaces MFC sont simples car elles n'implémentent pas réellement la classe, elles enveloppent simplement l'API publique (C & WM) pour faciliter le codage en C++.

Par exemple vous pouvez sendMessage hwnd WM_SetText au champ d'édition, ou utiliser CEdit(hwnd).setText() pour faire la même chose.

2 Classes est la solution, je pense, Vous pouvez faire de la classe d'interface le parent de l'implémentation, ou peut-être opter pour un modèle PIMPL pour rejoindre l'interface avec l'implémentation.

+0

À droite, les classes de fenêtre MFC n'implémentent pas la classe, mais dans mon cas ils le feraient - c'est le problème. Je pense que l'approche par classe/sous-classe fonctionnerait probablement bien. Merci. –