Partager via


TN001 : Inscription de classe de fenêtre

Cette remarque décrit les routines MFC qui stockent WNDCLASSspécial es requis par Microsoft Windows.Les attributs spécifiques d' WNDCLASS utilisés par les MFC et les fenêtres sont traités.

Le problème

Les attributs d'un objet de CWnd , comme un handle d' HWND dans windows, sont stockés dans deux emplacements : l'objet window et l' WNDCLASS.Le nom d' WNDCLASS est passé aux fonctions générales de création de fenêtre telles que CWnd::Create et CFrameWnd::Create dans le paramètre d' lpszClassName .

Cet WNDCLASS doit être enregistré via un des quatre manières :

  • Implicitement en utilisant MFC a fourni WNDCLASS.

  • Implicitement par sous-classement d'un contrôle Windows (ou un autre contrôle).

  • Explicitement en appelant MFC AfxRegisterWndClass ou AfxRegisterClass.

  • Explicitement en appelant la routine RegisterClasswindows.

Champs de WNDCLASS

La structure d' WNDCLASS se compose des différents champs qui décrivent une classe de fenêtre.Le tableau suivant indique les champs et spécifie la façon dont ils sont utilisés dans une application MFC :

Champ

Description

lpfnWndProc

le proc. de la fenêtre, doit être AfxWndProc

cbClsExtra

non utilisé (doit être égal à zéro)

cbWndExtra

non utilisé (doit être égal à zéro)

hInstance

rempli automatiquement avec AfxGetInstanceHandle

hIcon

l'icône pour les fenêtres frame, consultez ci-dessous

hCursor

le curseur lorsque la souris est positionnée sur fenêtre, consultez ci-dessous

hbrBackground

la couleur d'arrière-plan, consultez ci-dessous

lpszMenuName

non utilisé (doit être NULL)

lpszClassName

le nom de la classe, consultez ci-dessous

WNDCLASSes fourni

Versions antérieures de MFC (avant MFC 4,0), si plusieurs classes de fenêtres prédéfinies.Ces classes de fenêtres ne sont par défaut plus fournies.Les applications doivent utiliser AfxRegisterWndClass avec les paramètres appropriés.

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

Deux icônes prennent en charge les applications MDI avec des types de document unique : une icône pour l'application principale, l'autre icône du document iconique/fenêtres de MDIChild.Pour plusieurs types de document par des icônes différentes, vous devez enregistrer WNDCLASSsupplémentaire es ou utiliser la fonction de CFrameWnd::LoadFrame .

CFrameWnd::LoadFrame stockera WNDCLASS à l'aide de l'ID d'icône que vous spécifiez que le premier paramètre et les attributs suivants standard :

  • style de classe : CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW ;

  • icône AFX_IDI_STD_FRAME

  • curseur de flèche

  • Couleur d'arrière-plan de COLOR_WINDOW

Les valeurs de la couleur d'arrière-plan et le curseur pour CMDIFrameWnd ne sont pas utilisés comme la zone cliente d' CMDIFrameWnd est complètement couverte par la fenêtre MDICLIENT .Microsoft n'assure pas le sous-classement la fenêtre MDICLIENT donc utilisez les couleurs et les types de curseur standard si possible.

Sous-classement et contrôles de Surclassement

Si vous sous-classe ou surclassez un contrôle Windows (par exemple, CButton) ensuite votre classe obtient automatiquement les attributs d' WNDCLASS fournis dans l'implémentation des fenêtres de ce contrôle.

La fonction d'AfxRegisterWndClass

MFC fournit une fonction d'assistance pour enregistrer une classe de fenêtre.Soit un ensemble d'attributs (style, curseur, pinceau d'arrière-plan, et icône de la classe de fenêtre), un nom synthétique est généré, et la classe de fenêtre obtenue est enregistrée.Par exemple :

const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);

Cette fonction retourne une chaîne temporaire du nom de classe de fenêtre enregistré généré.Pour plus d'informations sur cette fonction, consultez l' AfxRegisterWndClass.

La chaîne retournée est un pointeur temporaire dans une mémoire tampon de chaîne statique.Il n'est pas valide jusqu'à l'appel suivant à AfxRegisterWndClass.Si vous souhaitez conserver cette chaîne se déplacer, stockez -la dans une variable de CString , comme dans cet exemple :

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...

AfxRegisterWndClass lèvera CResourceException si la classe de fenêtre ne inscrite pas (à cause de paramètres incorrect, ou hors de mémoire windows).

Les fonctions de RegisterClass et d'AfxRegisterClass

Si vous souhaitez faire n'importe quoi plus sophistiqué que le AfxRegisterWndClass le fournit, vous pouvez appeler l'API Windows RegisterClass ou la fonction AfxRegisterClassMFC.CWnd, les fonctions de CFrameWnd et de CMDIChildWndCreate portent le nom de chaîne d' lpszClassName pour la classe de fenêtre comme premier paramètre.Vous pouvez utiliser tout nom de classe de fenêtre enregistré, indépendamment de la méthode que vous l'avez enregistré.

Il est important d'utiliser AfxRegisterClass (ou AfxRegisterWndClass) dans une DLL sur Win32.Win32 n'annule pas l'enregistrement automatiquement des classes enregistrées par une DLL, vous devez explicitement annuler l'enregistrement des classes quand la DLL est terminé.À l'aide de AfxRegisterClass au lieu d' RegisterClass celle-ci est gérée automatiquement pour vous.AfxRegisterClass gère une liste des classes uniques stockées par la DLL et les annule l'enregistrement automatiquement quand la DLL se termine.Lorsque vous utilisez RegisterClass dans une DLL, vous devez vérifier que toutes les classes sont annulées l'enregistrement quand la DLL est terminé (dans la fonction de DllMain ).Le manque de cela peut provoquer l'échec RegisterClass de façon inattendue lorsque les autres tests d'application cliente pour utiliser la DLL.

Voir aussi

Autres ressources

Notes techniques de nombres

Notes techniques de catégorie