SIZE GetDialogSize(INT nResourceId, BOOL bApproximateCalcMethod = FALSE, LPCTSTR strDllName = NULL)
{
SIZE dlgSize = {0};
HINSTANCE hModule = 0;
if(strDllName != NULL)
hModule= ::LoadLibrary(strDllName);
else
hModule = ::GetModuleHandle(NULL);
HRSRC hRsrc = ::FindResource(hModule, MAKEINTRESOURCE(nResourceId), RT_DIALOG);
HGLOBAL hTemplate = ::LoadResource(hModule, hRsrc);
DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)::LockResource(hTemplate);
if (bApproximateCalcMethod) // the approximate method of calculating
{
LONG dlgBaseUnits = GetDialogBaseUnits();
int baseunitX = LOWORD(dlgBaseUnits), baseunitY = HIWORD(dlgBaseUnits);
dlgSize.cx = MulDiv(pTemplate->cx, baseunitX, 4);
dlgSize.cy = MulDiv(pTemplate->cy, baseunitY, 8);
}
else // the accurate method of calculation
{
HWND hDlg = ::CreateDialogIndirect(0, pTemplate, NULL, DialogProc);
RECT rc = {0};
::GetWindowRect(hDlg, &rc);
::DestroyWindow(hDlg);
dlgSize.cx = rc.right - rc.left;
dlgSize.cy = rc.bottom - rc.top;
}
UnlockResource(hTemplate);
::FreeResource(hTemplate);
if(strDllName != NULL)
::FreeLibrary(hModule);
return dlgSize;
}
대화 코드는 대화 상자의 리소스 ID로 CreateDialog를 호출 한 다음 GetClientRect를 호출하는 것과 같습니다. 리소스에서 실제로 템플릿을 구문 분석해야 할 것입니다. – pezcode
@pezcode : 그래서 FindResource, LoadResource 및 LockResource를 사용하여 DLGTEMPLATE로 시작하는 대화 상자 리소스에 대한 포인터를 가져오고 거기에서 cx 및 cy 또는 대화 상자 단위의 크기를 얻습니다. 그런 다음 GetDialogBaseUnits를 사용하여 화면 단위로 변환 하시겠습니까? 프로세스 수명 동안 리소스가 잠긴 상태입니까? 여러 번 잠그지 않아야합니까? –
클래식 XY 질문입니다. 그 정보로 정확히 무엇을 할 것인가를 알아 냈다고 가정 해 봅시다. –