Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 获取资源文件中定义的对话框大小_Windows_Api_Dialog - Fatal编程技术网

Windows 获取资源文件中定义的对话框大小

Windows 获取资源文件中定义的对话框大小,windows,api,dialog,Windows,Api,Dialog,我需要确定资源文件中定义的对话框客户端区域的大小 GetClientRect按桌面大小剪裁设计大小。我需要屏幕单位设计的尺寸。我发现它声称从对话框资源中检索大小,但遗憾的是它使用MFC 我打开了对话框,并有它的HWND和ID。如何在不使用MFC的情况下以屏幕单位获取dsign大小?您链接的代码相当于使用对话框的资源ID调用CreateDialog,然后调用GetClientRect。您可能需要实际解析参考资料中的模板。@pezcode:因此,我使用FindResource、LoadResourc

我需要确定资源文件中定义的对话框客户端区域的大小

GetClientRect按桌面大小剪裁设计大小。我需要屏幕单位设计的尺寸。我发现它声称从对话框资源中检索大小,但遗憾的是它使用MFC


我打开了对话框,并有它的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;
}