Verwenden von Fenstereigenschaften
In diesem Abschnitt wird erläutert, wie die folgenden Aufgaben ausgeführt werden, die fenstereigenschaften zugeordnet sind.
- Hinzufügen einer Window-Eigenschaft
- Abrufen einer Window-Eigenschaft
- Auflisten von Fenstereigenschaften für ein bestimmtes Fenster
- Löschen einer Window-Eigenschaft
Hinzufügen einer Window-Eigenschaft
Im folgenden Beispiel wird ein Symbol und dann ein Cursor geladen und arbeitsspeicher für einen Puffer zugeordnet. Im Beispiel wird dann die SetProp-Funktion verwendet, um die resultierenden Symbol-, Cursor- und Speicherhandles als Fenstereigenschaften für das Fenster zuzuweisen, das durch die anwendungsdefinierte hwndSubclass-Variable identifiziert wird. Die Eigenschaften werden durch die Zeichenfolgen PROP_ICON, PROP_CURSOR und PROP_BUFFER identifiziert.
#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);
Abrufen einer Window-Eigenschaft
Ein Fenster kann Handles für seine Fenstereigenschaftendaten erstellen und die Daten für jeden Zweck verwenden. Im folgenden Beispiel wird GetProp verwendet, um Handles für die Fenstereigenschaften abzurufen, die durch PROP_ICON, PROP_CURSOR und PROP_BUFFER identifiziert werden. Im Beispiel wird dann der Inhalt des neu abgerufenen Speicherpuffers, Cursors und Symbols im Clientbereich des Fensters angezeigt.
#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);
Auflisten von Fenstereigenschaften für ein bestimmtes Fenster
Im folgenden Beispiel listet die EnumPropsEx-Funktion die Zeichenfolgenbezeichner der Fenstereigenschaften für das Fenster auf, das durch die anwendungsdefinierte hwndSubclass-Variable identifiziert wird. Diese Funktion basiert auf der anwendungsdefinierten Rückruffunktion WinPropProc, um die Zeichenfolgen im Clientbereich des Fensters anzuzeigen.
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;
}
Löschen einer Window-Eigenschaft
Wenn ein Fenster zerstört wird, muss es alle festgelegten Fenstereigenschaften zerstören. Im folgenden Beispiel werden die EnumPropsEx-Funktion und die anwendungsdefinierte Rückruffunktion DelPropProc verwendet, um die Eigenschaften zu zerstören, die dem Fenster zugeordnet sind, das durch die anwendungsdefinierte hwndSubclass-Variable identifiziert wird. Die Rückruffunktion, die die RemoveProp-Funktion verwendet, wird ebenfalls angezeigt.
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;
}