Utilisation des propriétés de la fenêtre
Cette section explique comment effectuer les tâches suivantes associées aux propriétés de fenêtre.
- Ajout d’une propriété Window
- Récupération d’une propriété Window
- Liste des propriétés de la fenêtre pour une fenêtre donnée
- Suppression d’une propriété Window
Ajout d’une propriété Window
L’exemple suivant charge une icône, puis un curseur et alloue de la mémoire pour une mémoire tampon. L’exemple utilise ensuite la fonction SetProp pour affecter l’icône, le curseur et les poignées de mémoire résultants en tant que propriétés de fenêtre pour la fenêtre identifiée par la variable hwndSubclass définie par l’application. Les propriétés sont identifiées par les chaînes PROP_ICON, PROP_CURSOR et PROP_BUFFER.
#define BUFFER 4096
HINSTANCE hinst; // handle of current instance
HWND hwndSubclass; // handle of a subclassed window
HANDLE hIcon, hCursor;
HGLOBAL hMem;
char *lpMem;
TCHAR tchPath[] = "c:\\winnt\\samples\\winprop.c";
HRESULT hResult;
// Load resources.
hIcon = LoadIcon(hinst, MAKEINTRESOURCE(400));
hCursor = LoadCursor(hinst, MAKEINTRESOURCE(220));
// Allocate and fill a memory buffer.
hMem = GlobalAlloc(GPTR, BUFFER);
lpMem = GlobalLock(hMem);
if (lpMem == NULL)
{
// TODO: write error handler
}
hResult = StringCchCopy(lpMem, STRSAFE_MAX_CCH, tchPath);
if (FAILED(hResult))
{
// TO DO: write error handler if function fails.
}
GlobalUnlock(hMem);
// Set the window properties for hwndSubclass.
SetProp(hwndSubclass, "PROP_ICON", hIcon);
SetProp(hwndSubclass, "PROP_CURSOR", hCursor);
SetProp(hwndSubclass, "PROP_BUFFER", hMem);
Récupération d’une propriété Window
Une fenêtre peut créer des handles dans ses données de propriété de fenêtre et les utiliser à n’importe quel usage. L’exemple suivant utilise GetProp pour obtenir des handles pour les propriétés de fenêtre identifiées par PROP_ICON, PROP_CURSOR et PROP_BUFFER. L’exemple montre ensuite le contenu de la mémoire tampon, du curseur et de l’icône nouvellement obtenus dans la zone cliente de la fenêtre.
#define PATHLENGTH 256
HWND hwndSubclass; // handle of a subclassed window
HANDLE hIconProp, hCursProp;
HGLOBAL hMemProp;
char *lpFilename;
TCHAR tchBuffer[PATHLENGTH];
size_t * nSize;
HDC hdc;
HRESULT hResult;
// Get the window properties, then use the data.
hIconProp = (HICON) GetProp(hwndSubclass, "PROP_ICON");
TextOut(hdc, 10, 40, "PROP_ICON", 9);
DrawIcon(hdc, 90, 40, hIconProp);
hCursProp = (HCURSOR) GetProp(hwndSubclass, "PROP_CURSOR");
TextOut(hdc, 10, 85, "PROP_CURSOR", 9);
DrawIcon(hdc, 110, 85, hCursProp);
hMemProp = (HGLOBAL) GetProp(hwndSubclass, "PROP_BUFFER");
lpFilename = GlobalLock(hMemProp);
hResult = StringCchPrintf(tchBuffer, PATHLENGTH,
"Path to file: %s", lpFilename);
if (FAILED(hResult))
{
// TODO: write error handler if function fails.
}
hResult = StringCchLength(tchBuffer, PATHLENGTH, nSize)
if (FAILED(hResult))
{
// TODO: write error handler if function fails.
}
TextOut(hdc, 10, 10, tchBuffer, *nSize);
Liste des propriétés de la fenêtre pour une fenêtre donnée
Dans l’exemple suivant, la fonction EnumPropsEx répertorie les identificateurs de chaîne des propriétés de la fenêtre pour la fenêtre identifiée par la variable hwndSubclass définie par l’application. Cette fonction s’appuie sur la fonction de rappel définie par l’application WinPropProc pour afficher les chaînes dans la zone cliente de la fenêtre.
EnumPropsEx(hwndSubclass, WinPropProc, NULL);
// WinPropProc is an application-defined callback function
// that lists a window property.
BOOL CALLBACK WinPropProc(
HWND hwndSubclass, // handle of window with property
LPCSTR lpszString, // property string or atom
HANDLE hData) // data handle
{
static int nProp = 1; // property counter
TCHAR tchBuffer[BUFFER]; // expanded-string buffer
size_t * nSize; // size of string in buffer
HDC hdc; // device-context handle
HRESULT hResult;
hdc = GetDC(hwndSubclass);
// Display window property string in client area.
hResult = StringCchPrintf(tchBuffer, BUFFER, "WinProp %d: %s", nProp++, lpszString);
if (FAILED(hResult))
{
// TO DO: write error handler if function fails.
}
hResult = StringCchLength(tchBuffer, BUFFER, nSize);
if (FAILED(hResult))
{
// TO DO: write error handler if function fails.
}
TextOut(hdc, 10, nProp * 20, tchBuffer, *nSize);
ReleaseDC(hwndSubclass, hdc);
return TRUE;
}
Suppression d’une propriété Window
Lorsqu’une fenêtre est détruite, elle doit détruire toutes les propriétés de fenêtre qu’elle a définies. L’exemple suivant utilise la fonction EnumPropsEx et la fonction de rappel définie par l’application DelPropProc pour détruire les propriétés associées à la fenêtre identifiée par la variable hwndSubclass définie par l’application. La fonction de rappel, qui utilise la fonction RemoveProp , s’affiche également.
case WM_DESTROY:
EnumPropsEx(hwndSubclass, DelPropProc, NULL);
PostQuitMessage(0);
break;
// DelPropProc is an application-defined callback function
// that deletes a window property.
BOOL CALLBACK DelPropProc(
HWND hwndSubclass, // handle of window with property
LPCSTR lpszString, // property string or atom
HANDLE hData) // data handle
{
hData = RemoveProp(hwndSubclass, lpszString);
//
// if appropriate, free the handle hData
//
return TRUE;
}