我需要确定资源文件中定义的对话框客户区的大小。获取资源文件中定义的对话框大小
GetClientRect将设计大小剪裁为桌面大小。我需要按照屏幕单位设计的尺寸。我发现this它声称从对话框资源检索大小,但不幸的是它使用MFC。
我打开对话框并有HWND,它是ID。如何在不使用MFC的情况下以屏幕单位获得设计尺寸?
我需要确定资源文件中定义的对话框客户区的大小。获取资源文件中定义的对话框大小
GetClientRect将设计大小剪裁为桌面大小。我需要按照屏幕单位设计的尺寸。我发现this它声称从对话框资源检索大小,但不幸的是它使用MFC。
我打开对话框并有HWND,它是ID。如何在不使用MFC的情况下以屏幕单位获得设计尺寸?
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;
}
谢谢!我使用pezcode的提示或多或少掺杂了这一点,但从对话单元到屏幕单元的转换仍然是一个问题,清理代码非常有用。如果对话框大于桌面,您的准确方法是否会返回裁剪大小? – 2012-02-27 02:16:25
我使用MapDialogRect将对话框单位转换为屏幕单位,结果非常好。 – 2012-02-27 02:17:26
MapDialogRect非常适合将对话框单位转换为屏幕单位。就我而言,我有HWND这个对话框,所以很简单。在hellkni9ht的代码中,可以用“精确的计算方法”代替GetWindowRect。 – 2012-02-27 13:59:18
链接的代码与使用对话框的资源ID调用CreateDialog等效,然后调用GetClientRect。您可能不得不求助于实际解析资源中的模板。 – pezcode 2012-02-27 00:14:52
@pezcode:因此,我使用FindResource,LoadResource和LockResource来获取指向以DLGTEMPLATE开头的对话框资源的指针,并从那里获取cx和cy或对话框单元中的大小。然后使用GetDialogBaseUnits转换为屏幕单位?资源在整个过程中是否被锁定?我应该避免多次锁定吗? – 2012-02-27 00:54:34
经典的XY问题。假设你发现,你将如何处理这些信息? – 2012-02-27 01:25:40