Partager via


TN001 : inscription de classe Windows

Cette note décrit les routines MFC qui inscrivent les WNDCLASSspéciaux nécessaires par Microsoft Windows. Des attributs spécifiques WNDCLASS utilisés par MFC et Windows sont abordés.

Le problème

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

Cela WNDCLASS doit être enregistré par l’un des quatre moyens suivants :

Champs WNDCLASS

La WNDCLASS structure se compose de différents champs qui décrivent une classe de fenêtre. Le tableau suivant montre les champs et spécifie comment ils sont utilisés dans une application MFC :

Champ Description
lpfnWndProc processus de fenêtre, doit être un AfxWndProc
cbClsExtra non utilisé (doit être égal à zéro)
cbWndExtra non utilisé (doit être égal à zéro)
hInstance automatiquement rempli avec AfxGetInstanceHandle
hIcon icône pour les fenêtres frame, voir ci-dessous
hCursor curseur pour le moment où la souris est sur la fenêtre, voir ci-dessous
hbrBackground couleur d’arrière-plan, voir ci-dessous
lpszMenuName non utilisé (doit être NULL)
lpszClassName nom de classe, voir ci-dessous

WNDCLASSes fourni

Les versions antérieures de MFC (avant MFC 4.0), fournissaient plusieurs classes Window prédéfinies. Ces classes Window ne sont plus fournies par défaut. Les applications doivent utiliser AfxRegisterWndClass avec les paramètres appropriés.

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

Deux icônes prennent en charge les applications MDI avec des types de documents uniques : une icône pour l’application principale, l’autre icône pour les fenêtres iconiques document/MDIChild. Pour plusieurs types de documents avec différentes icônes, vous devez inscrire des es supplémentaires WNDCLASSou utiliser la fonction CFrameWnd ::LoadFrame .

CFrameWnd::LoadFrame s’inscrit à WNDCLASS l’aide de l’ID d’icône que vous spécifiez comme premier paramètre et les attributs standard suivants :

  • style de classe : CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • icône AFX_IDI_STD_FRAME

  • curseur de flèche

  • couleur d’arrière-plan COLOR_WINDOW

Les valeurs pour la couleur d’arrière-plan et le curseur du CMDIFrameWnd ne sont pas utilisées, car la zone cliente du CMDIFrameWnd modèle est entièrement couverte par la fenêtre MDICLIENT . Microsoft n’encourage pas la sous-classe de la fenêtre MDICLIENT afin d’utiliser les couleurs standard et les types de curseurs lorsque cela est possible.

Sous-classes et contrôles de superclassement

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

Fonction AfxRegisterWndClass

MFC fournit une fonction d’assistance pour l’inscription d’une classe de fenêtre. Étant donné un ensemble d’attributs (style de classe de fenêtre, curseur, pinceau d’arrière-plan et icône), un nom synthétique est généré et la classe de fenêtre résultante est inscrite. Par exemple :

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

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

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

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);

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

...

AfxRegisterWndClass lève une exception CResourceException si la classe de fenêtre n’a pas pu s’inscrire (en raison de paramètres incorrects ou de mémoire insuffisante de Windows).

Fonctions RegisterClass et AfxRegisterClass

Si vous souhaitez faire quelque chose de plus sophistiqué que ce qui AfxRegisterWndClass fournit, vous pouvez appeler l’API RegisterClass Windows ou la fonction AfxRegisterClassMFC . Les CWndfonctions CFrameWnd et CMDIChildWndCreate prennent un nom de chaîne lpszClassName pour la classe de fenêtre comme premier paramètre. Vous pouvez utiliser n’importe quel nom de classe de fenêtre inscrit, quelle que soit la méthode que vous avez utilisée pour l’inscrire.

Il est important d’utiliser AfxRegisterClass (ou AfxRegisterWndClass) dans une DLL sur Win32. Win32 ne annule pas automatiquement l’inscription des classes inscrites par une DLL. Vous devez donc annuler explicitement l’inscription des classes lorsque la DLL est arrêtée. En utilisant AfxRegisterClass au lieu de RegisterClass cela est géré automatiquement pour vous. AfxRegisterClass conserve une liste de classes uniques inscrites par votre DLL et les désinscrit automatiquement lorsque la DLL se termine. Lorsque vous utilisez RegisterClass une DLL, vous devez vous assurer que toutes les classes ne sont pas inscrites lorsque la DLL est arrêtée (dans votre fonction DllMain ). L’échec de cette opération peut entraîner RegisterClass un échec inattendu lorsqu’une autre application cliente tente d’utiliser votre DLL.

Voir aussi

Notes techniques par numéro
Notes techniques par catégorie