창 속성 사용
이 섹션에서는 창 속성과 연결된 다음 작업을 수행하는 방법을 설명합니다.
Window 속성 추가
다음 예제에서는 아이콘을 로드한 다음 커서를 로드하고 버퍼에 대한 메모리를 할당합니다. 그런 다음 SetProp 함수를 사용하여 결과 아이콘, 커서 및 메모리 핸들을 애플리케이션 정의 hwndSubclass 변수로 식별된 창의 창 속성으로 할당합니다. 속성은 PROP_ICON, PROP_CURSOR 및 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);
Window 속성 검색
창은 창 속성 데이터에 대한 핸들을 만들고 어떤 용도로든 데이터를 사용할 수 있습니다. 다음 예제에서는 GetProp 을 사용하여 PROP_ICON, PROP_CURSOR 및 PROP_BUFFER 식별된 창 속성에 대한 핸들을 가져옵니다. 그런 다음, 창의 클라이언트 영역에 새로 가져온 메모리 버퍼, 커서 및 아이콘의 내용을 표시하는 예제입니다.
#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);
지정된 창에 대한 창 속성 나열
다음 예제에서 EnumPropsEx 함수는 애플리케이션 정의 hwndSubclass 변수로 식별된 창에 대한 창 속성의 문자열 식별자를 나열합니다. 이 함수는 애플리케이션 정의 콜백 함수 WinPropProc을 사용하여 창의 클라이언트 영역에 문자열을 표시합니다.
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;
}
Window 속성 삭제
창이 제거되면 설정된 모든 창 속성을 삭제해야 합니다. 다음 예제에서는 EnumPropsEx 함수 및 애플리케이션 정의 콜백 함수 DelPropProc을 사용하여 애플리케이션 정의 hwndSubclass 변수로 식별된 창과 연결된 속성을 삭제합니다. 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;
}