2010-02-12 6 views
3

Nous mettons en page les boîtes de dialogue en utilisant l'éditeur de ressources. Donc dis que j'ai un RichEditCtrl appelé IDC_RICH. Et je veux le lier à une instance d'une classe personnalisée CMyRichEditCtrl : CRichEditCtrl, sans perdre la possibilité de définir des propriétés dans l'éditeur de ressources.Quelle est la manière correcte de créer une sous-classe d'un contrôle MFC?

Quelle est la bonne façon? Vous pouvez certainement obtenir des fonctionnalités en créant une variable liée à DDX et en changeant le type en CMyRichEditCtrl. Mais dans certains cas, je vois des gens appelant le code comme:

m_Rich.SubclassDlgItem(IDC_RICH, this)); 

Quelle est la différence?

EDIT: Un problème que je vois est que lorsque je substitue des méthodes Create (Ex), ils ne sont pas appelés. C'est un peu comme si le contrôle était déjà créé au moment où mon objet est lié à l'identifiant de la ressource, pehaps?

Répondre

4

Les fenêtres que vous mettez sur une boîte de dialogue avec l'éditeur de ressources créées à l'aide CreateWindow (Ex) avec le premier argument mis en tot il nom de la classe qui est spécifié dans le fichier .rc. Le mécanisme DDX_ a ensuite associé cette fenêtre instanciée au membre de la classe de dialogue dans DoDataExchange(). MFC est un calque sur Win32 mais le développement MFC ne vous protège pas complètement de Win32. C'est plus comme un tas de classes et de méthodes qui enlèvent une partie de la corvée de MFC et fournissent une certaine forme d'orienté objet. Les méthodes de l'objet MFC ne sont pas celles qui effectuent le travail réel, et une grande partie de l'infrastructure fait les choses sous le capot et n'informe pas la 'couche supérieure' (à savoir, les objets MFC) sauf si cela est explicitement connecté. Create() est une telle méthode qui est seulement là si vous voulez créer manuellement un contrôle, il n'est pas appelé par MFC lorsque l'objet est créé. (c'est une généralisation parce que c'est parfois le cas, mais cela sort du cadre de cette discussion).

+0

Par nom de classe vous signifie la classe Window, pas la classe C++? Si je crée un contrôle personnalisé avec son propre nom de classe Window, me permettra-t-il encore de modifier les propriétés de base dans l'éditeur de ressources? Ou juste apparaître comme une grosse boîte grise? –

+0

Oui, classe de fenêtre, le premier paramètre à CreateWindow(). Vous ne pouvez pas placer de contrôle personnalisé dans l'éditeur de ressources sans en coder le support explicite. C'est à cela que sert l'entrée 'Contrôle personnalisé' dans VS Toolbox. Vous pouvez définir quelques propriétés, comme activé et légende, mais c'est très basique. (Par « contrôle personnalisé » Je veux dire « dérivé de CWnd », et non pas d'un autre contrôle, si vous faites cela, vous pouvez définir les propriétés dans l'éditeur de ressources, parce que l'éditeur de ressources ne connaîtra pas le nouveau contrôle ou la classe de la fenêtre de ce contrôle prénom). – Roel

6

DDX_Control() fait SubclassWindow() sous le capot. SubclassDlgItem est un raccourci pour SubclassWindow (GetDlgITem()). Habituellement (généralisation générale ici) les gens utilisant SubclassWindow sont ceux qui ont pris cette habitude avant que DDX_Control ait existé (avant 1995 ou alors?) Et n'est jamais vraiment passé en mode MFC, ou les gens qui copient et collent leurs programmes ensemble des extraits de blog gauche et droite. Donc, utilisez DDX_Control() pour plus de clarté, bien que techniquement cela ne fasse pas de différence si vous utilisez SubclassDlgItem().

0

1> Pour les contrôles que vous avez sur une boîte de dialogue avec l'éditeur de ressources, utilisé DDX_Control:

class CMyDlg : public CDialogEx 
{ 

protected: 
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

public: 
    CRichEditCtrl m_Rich; 
}; 

void CMyDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialogEx::DoDataExchange(pDX); 
    DDX_Control(pDX, IDC_RICHEDIT1, m_Rich); 
} 

2> Pour les contrôles qui créent manuellement:

CRichEditCtrl m_Rich; m_Rich.Create(...); m_Rich.SubclassDlgItem(IDC_RICH, this));

Questions connexes