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 :
Implicitement à l’aide d’un MFC fourni
WNDCLASS
.Implicitement en subclassant un contrôle Windows (ou un autre contrôle).
Explicitement en appelant MFC AfxRegisterWndClass ou AfxRegisterClass.
Explicitement en appelant la routine Windows RegisterClass.
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 WNDCLASS
ou 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 AfxRegisterClass
MFC . Les CWnd
fonctions 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.