Uso delle proprietà della finestra
In questa sezione viene illustrato come eseguire le attività seguenti associate alle proprietà della finestra.
- Aggiunta di una proprietà Window
- Recupero di una proprietà Window
- Elenco delle proprietà della finestra per una determinata finestra
- Eliminazione di una proprietà Window
Aggiunta di una proprietà Window
L'esempio seguente carica un'icona e quindi un cursore e alloca la memoria per un buffer. Nell'esempio viene quindi usata la funzione SetProp per assegnare l'icona, il cursore e gli handle di memoria risultanti come proprietà della finestra identificata dalla variabile hwndSubclass definita dall'applicazione. Le proprietà sono identificate dalle stringhe PROP_ICON, PROP_CURSOR e 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);
Recupero di una proprietà Window
Una finestra può creare handle per i dati delle proprietà della finestra e usare i dati per qualsiasi scopo. Nell'esempio seguente viene utilizzato GetProp per ottenere handle per le proprietà della finestra identificate da PROP_ICON, PROP_CURSOR e PROP_BUFFER. Nell'esempio vengono quindi visualizzati i contenuti del buffer di memoria, del cursore e dell'icona appena ottenuti nell'area client della finestra.
#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);
Elenco delle proprietà della finestra per una determinata finestra
Nell'esempio seguente la funzione EnumPropsEx elenca gli identificatori stringa delle proprietà della finestra identificate dalla variabile hwndSubclass definita dall'applicazione. Questa funzione si basa sulla funzione di callback definita dall'applicazione WinPropProc per visualizzare le stringhe nell'area client della finestra.
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;
}
Eliminazione di una proprietà Window
Quando una finestra viene eliminata definitivamente, deve eliminare tutte le proprietà della finestra impostate. Nell'esempio seguente viene utilizzata la funzione EnumPropsEx e la funzione di callback definita dall'applicazione DelPropProc per eliminare definitivamente le proprietà associate alla finestra identificata dalla variabile hwndSubclass definita dall'applicazione. Viene visualizzata anche la funzione di callback, che usa la funzione RemoveProp .
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;
}