TN001 : Enregistrement de classe de fenêtre

Cette note décrit les routines MFC qui s'inscrivent les es WNDCLASSspéciales requis par Microsoft Windows. Attributs spécifiques de WNDCLASS utilisé par les MFC et Windows sont discutés.

Le problème

Les attributs d'un objet de CWnd , comme un HWND dans Windows, sont stockés dans deux endroits : l'objet window et WNDCLASS. WNDCLASS est différent d'une classe C++. Le nom de WNDCLASS est transmis aux fonctions de création de fenêtre générale telles que CWnd::Create et CFrameWnd::Create dans le paramètre lpszClassName.

Cette WNDCLASS doivent être enregistrés par l'intermédiaire de l'un des quatre moyens:

WNDCLASSes et MFC

La structure WNDCLASS est constitué de divers champs qui décrivent une classe de fenêtre. Voici les champs et comment ils sont utilisés dans une application MFC.

Style Style de fenêtre : voir ci-dessous
LpfnWndProc fenêtre proc, doit être AfxWndProc
CbClsExtra non utilisé (devrait être zéro)
CbWndExtra non utilisé (devrait être zéro)
HInstance automatiquement remplie de AfxGetInstanceHandle
HIcon icône de fenêtres frames, voir ci-dessous
LpCursorName curseur pour quand la souris est au-dessus de la fenêtre, voir ci-dessous
HbrBackground couleur d'arrière-plan, voir ci-dessous
LpszMenuName non utilisé (doit être NULL)
LpszClassName nom de la classe, voir ci-dessous

A WNDCLASSes

Dans les versions précédentes de MFC (antérieures à 4.0 de MFC), il y avait un certain nombre de classes de fenêtre prédéfinis fournis. Ces classes de fenêtre sont ne sont plus fournis par défaut en raison de problèmes techniques liés au versioning (plusieurs versions des MFC chargées dans l'espace d'une seule adresse) ainsi que les préoccupations concernant le fait que les applications MFC et les contrôles OLE peuvent utiliser la DLL MFC.

La référence suivante est fournie pour aider à migrer le code qui utilise ces fournis précédemment WNDCLASSes. Les applications doivent utiliser AfxRegisterWndClass (avec les paramètres appropriés) à la place de ces classes.

L'exemple suivant montre les classes et leurs attributs:

Si l'application fournit une ressource ayant l'ID de ressource spécifié ID (par exemple, AFX_IDI_STD_FRAME), MFC utilise cette ressource. Sinon, la ressource par défaut est utilisée. Pour l'icône, l'icône de l'application standard est utilisé et pour le curseur, le curseur flèche standard est utilisé.

Il y a deux icônes qui prennent en charge les applications MDI avec des types de document unique (une icône de l'application principale, l'autre icône de document/MDIChild emblématique windows). Pour plusieurs types de documents avec des icônes différentes, vous devez enregistrer supplémentaires WNDCLASSes ou utilisez la fonction CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame enregistrera automatiquement une WNDCLASS en utilisant les attributs standards de « AfxFrameOrView » mais à l'aide de l'ID d'icône que vous spécifiez comme premier paramètre de cas.

Les valeurs de couleur d'arrière-plan et le curseur de la MDIFrameWnd ne sont pas utilisées depuis la zone cliente de la MDIFrameWnd est complètement couverte par la fenêtre « MDICLIENT ». Microsoft n'encourage pas sous-classement de fenêtre « MDICLIENT » donc utiliser les couleurs standards et les types de curseur lorsque cela est possible.

Sous-classement de contrôles

Si vous sous-classe ou superclasse un Windows contrôle (par exemple, CButton) puis votre classe automatiquement obtient les attributs WNDCLASS dans l'implémentation Windows de ce contrôle.

La fonction AfxRegisterWndClass

MFC fournit une routine d'assistance pour l'enregistrement d'une classe de fenêtre. Étant donné un ensemble d'attributs (style de classe de fenêtre, curseur, brosse fond et icône), un nom synthétique est généré, et la classe de fenêtre qui en résulte est enregistrée. Par exemple,

const char * AfxRegisterWndClass (UINT nClassStyle, LPCURSORNAME lpCursorName, HBRUSH hbrBackground, HICON hIcon)

Cette fonction renvoie une chaîne temporaire du nom de la classe de fenêtre inscrits générés. Voir la Référence de bibliothèque de classe pour plus de détails.

La chaîne retournée est un pointeur temporaire vers un tampon de chaîne statique qui est valide jusqu'à ce que le prochain appel à AfxRegisterWndClass. Si vous souhaitez garder cette chaîne autour, stockez-le dans une variable de CString . Par exemple,

CStrin&g strWndClass = AfxRegisterWndClass (CS_DBLCLK,...) ;
...
PWnd CWnd * = nouveau CWnd ;
pWnd-gt ;Créer (strWndClass,...) ;

AfxRegisterWndClass lèvera un CResourceException si la classe de fenêtre n'a pas à s'inscrire (en raison de mauvais paramètres, ou de mémoire de Windows).

Le RegisterClass et fonctions AfxRegisterClass

Si vous voulez faire quelque chose de plus sophistiqué que ce que prévoit AfxRegisterWndClass , vous pouvez appeler l' API Windows RegisterClass ou la fonction MFC AfxRegisterClass. Le CWnd, CFrameWnd et fonctions decréation de CMDIChildWndprennent un nom de chaîne lpszClassName pour la classe de fenêtre comme premier paramètre. N'importe quel nom de classe de fenêtre peut être utilisé indépendamment de la façon dont il a été enregistré .

Il est important d'utiliser AfxRegisterClass (ou AfxRegisterWndClass) dans une DLL sur Win32. Win32 ne pas automatiquement annuler l'inscription classes enregistrés par une DLL, donc cela doit être fait en explicitement lorsque la DLL est terminée. À l'aide de AfxRegisterClass au lieu de RegisterClass , cela se fait automatiquement pour vous. AfxRegisterClass conserve une liste des classes uniques enregistrés par votre DLL et de se désinscrire automatiquement puis quand la DLL se termine. Lorsque vous utilisez RegisterClass dans une DLL, vous devez assurer que toutes les classes sont déposées lorsque la DLL est terminée (dans votre fonction DllMain ). L'omission de le faire peut entraîner RegisterClass échouer de façon inattendue lorsque votre DLL est utilisé par une autre application cliente.

&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie

Index