Usando propriedades de janela
Esta seção explica como executar as tarefas a seguir associadas às propriedades da janela.
- Adicionando uma propriedade Window
- Recuperando uma propriedade window
- Listando propriedades da janela para uma determinada janela
- Excluindo uma propriedade window
Adicionando uma propriedade Window
O exemplo a seguir carrega um ícone e, em seguida, um cursor e aloca memória para um buffer. Em seguida, o exemplo usa a função SetProp para atribuir os identificadores de ícone, cursor e memória resultantes como propriedades de janela para a janela identificada pela variável hwndSubclass definida pelo aplicativo. As propriedades são identificadas pelas cadeias de caracteres 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);
Recuperando uma propriedade window
Uma janela pode criar identificadores para seus dados de propriedade de janela e usar os dados para qualquer finalidade. O exemplo a seguir usa GetProp para obter identificadores para as propriedades da janela identificadas por PROP_ICON, PROP_CURSOR e PROP_BUFFER. Em seguida, o exemplo exibe o conteúdo do buffer de memória, do cursor e do ícone recém-obtidos na área do cliente da janela.
#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);
Listando propriedades da janela para uma determinada janela
No exemplo a seguir, a função EnumPropsEx lista os identificadores de cadeia de caracteres das propriedades da janela para a janela identificada pela variável hwndSubclass definida pelo aplicativo. Essa função depende da função de retorno de chamada definida pelo aplicativo WinPropProc para exibir as cadeias de caracteres na área de cliente da janela.
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;
}
Excluindo uma propriedade window
Quando uma janela é destruída, ela deve destruir todas as propriedades de janela definidas por ela. O exemplo a seguir usa a função EnumPropsEx e a função de retorno de chamada definida pelo aplicativo DelPropProc para destruir as propriedades associadas à janela identificada pela variável hwndSubclass definida pelo aplicativo. A função de retorno de chamada, que usa a função RemoveProp , também é mostrada.
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;
}