2012-02-27 44 views
2

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

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

我打开对话框并有HWND,它是ID。如何在不使用MFC的情况下以屏幕单位获得设计尺寸?

+0

链接的代码与使用对话框的资源ID调用CreateDialog等效,然后调用GetClientRect。您可能不得不求助于实际解析资源中的模板。 – pezcode 2012-02-27 00:14:52

+0

@pezcode:因此,我使用FindResource,LoadResource和LockResource来获取指向以DLGTEMPLATE开头的对话框资源的指针,并从那里获取cx和cy或对话框单元中的大小。然后使用GetDialogBaseUnits转换为屏幕单位?资源在整个过程中是否被锁定?我应该避免多次锁定吗? – 2012-02-27 00:54:34

+0

经典的XY问题。假设你发现,你将如何处理这些信息? – 2012-02-27 01:25:40

回答

1
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; 
} 
+0

谢谢!我使用pezcode的提示或多或少掺杂了这一点,但从对话单元到屏幕单元的转换仍然是一个问题,清理代码非常有用。如果对话框大于桌面,您的准确方法是否会返回裁剪大小? – 2012-02-27 02:16:25

+0

我使用MapDialogRect将对话框单位转换为屏幕单位,结果非常好。 – 2012-02-27 02:17:26

+0

MapDialogRect非常适合将对话框单位转换为屏幕单位。就我而言,我有HWND这个对话框,所以很简单。在hellkni9ht的代码中,可以用“精确的计算方法”代替GetWindowRect。 – 2012-02-27 13:59:18

相关问题