Windows 获取资源文件中定义的对话框大小
我需要确定资源文件中定义的对话框客户端区域的大小 GetClientRect按桌面大小剪裁设计大小。我需要屏幕单位设计的尺寸。我发现它声称从对话框资源中检索大小,但遗憾的是它使用MFCWindows 获取资源文件中定义的对话框大小,windows,api,dialog,Windows,Api,Dialog,我需要确定资源文件中定义的对话框客户端区域的大小 GetClientRect按桌面大小剪裁设计大小。我需要屏幕单位设计的尺寸。我发现它声称从对话框资源中检索大小,但遗憾的是它使用MFC 我打开了对话框,并有它的HWND和ID。如何在不使用MFC的情况下以屏幕单位获取dsign大小?您链接的代码相当于使用对话框的资源ID调用CreateDialog,然后调用GetClientRect。您可能需要实际解析参考资料中的模板。@pezcode:因此,我使用FindResource、LoadResourc
我打开了对话框,并有它的HWND和ID。如何在不使用MFC的情况下以屏幕单位获取dsign大小?您链接的代码相当于使用对话框的资源ID调用CreateDialog,然后调用GetClientRect。您可能需要实际解析参考资料中的模板。@pezcode:因此,我使用FindResource、LoadResource和LockResource获取指向对话框资源的指针,该指针以DLGTEMPLATE开头,然后从中获取cx和cy或对话框单位的大小。然后使用GetDialogBaseUnits转换为屏幕单位?资源是否在进程生命周期内保持锁定状态?我应该避免多次锁定吗?经典的XY问题。假设你发现了,你将如何处理这些信息?@HansPassant:我有一些比标准800x600更大的对话框,不能在小屏幕上正常显示。我添加了滚动条,但需要设计尺寸,以便正确操作滚动条。我有这个或多或少的工作,但有一些问题,从对话基本单位转换为屏幕单位。听起来像是我的问题。但是我不能整理你的答案。谢谢!我使用pezcode的提示或多或少地解决了这个问题,但是从对话框单元到屏幕单元的转换仍然是个问题,清理代码非常有用。如果对话框比桌面大,您的精确方法不会返回剪裁的大小吗?我使用MapDialogRect将对话框单位转换为屏幕单位的效果非常好。MapDialogRect非常适合我将对话框单位转换为屏幕单位。在我的例子中,我有HWND对话框,所以这是直接的。在hellkni9ht的代码中,它可以替代“精确计算方法”中的GetWindowRect。DLGTEMPLATE对我来说是未定义的。为什么?
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;
}