Finding Display Size of Dialog From Resource

This article explains how to find display size of the dialog from it's resource handle. It will be helpful, if you need to arrange position and size of other windows based upon the dialog size before the dialog gets displayed.

There is no MFC support to find the display size of dialog from it's resource and it becomes even more painful to implement if dialog resides in a DLL and contains some ActiveX controls.

Here is the function to find it :


CRect CalcDialogSize(INT nResourceId, 
                     const char* strDllName=NULL)
{
 CRect rectSize;

 // if the dialog resource resides in a DLL ...
 //	
 HINSTANCE hExeResourceHandle;
 HINSTANCE hModule;

 if(strDllName != NULL)
 {
  hExeResourceHandle = AfxGetResourceHandle();

  hModule= ::LoadLibrary(strDllName);
  ASSERT(hModule);

  AfxSetResourceHandle(hModule);
 }

 HINSTANCE hInst = 
  AfxFindResourceHandle(MAKEINTRESOURCE(nResourceId),
                        RT_DIALOG);

 ASSERT(hInst != NULL);

 HRSRC hRsrc = ::FindResource(hInst, 
                              MAKEINTRESOURCE(nResourceId),
                              RT_DIALOG);
 ASSERT(hRsrc != NULL);

 HGLOBAL hTemplate = ::LoadResource(hInst, hRsrc);
 ASSERT(hTemplate != NULL);

 DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)::LockResource(hTemplate);

 //Load coresponding DLGINIT resource 
 //(if we have any ActiveX components)
 //
 void* lpDlgInit;
 HGLOBAL hDlgInit = NULL;
 CDialog dlg;

 HRSRC hsDlgInit = ::FindResource(hInst, 
                                  MAKEINTRESOURCE(nResourceId),
                                  RT_DLGINIT);
 if (hsDlgInit != NULL)
 {
  // load it
  hDlgInit = ::LoadResource(hInst, hsDlgInit);
  ASSERT(hDlgInit != NULL);

  // lock it
  lpDlgInit = ::LockResource(hDlgInit);
  ASSERT(lpDlgInit != NULL);

  dlg.CreateIndirect(pTemplate, NULL, lpDlgInit);   
 }
 else
 {
  dlg.CreateIndirect(pTemplate, NULL);  
 }
		
 CRect rect;
 dlg.GetClientRect(rectSize);

 dlg.DestroyWindow();

 ::UnlockResource(hTemplate);
 ::FreeResource(hTemplate);
 if (hDlgInit) 
 {
  ::UnlockResource(hDlgInit);   
  ::FreeResource(hDlgInit);
 }	

 if(strDllName != NULL)
 {
  AfxSetResourceHandle(hExeResourceHandle);
  ::FreeLibrary(hModule);
 }

 return rectSize;
}



Comments

  • Little shorter and better method

    Posted by Legacy on 11/17/2002 12:00am

    Originally posted by: Sukhanandan

    void CMyAppApp::CalcDialogSize(UINT nResourceId, SIZE& size)
    {
    HRSRC hRsrc = ::FindResource(m_hInstance, MAKEINTRESOURCE(nResourceId), RT_DIALOG);
    ASSERT(hRsrc != NULL);
    HGLOBAL hTemplate = ::LoadResource(m_hInstance, hRsrc);
    ASSERT(hTemplate != NULL);

    DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)::LockResource(hTemplate);
    CDialogTemplate dlgtemplate(pTemplate);
    dlgtemplate.GetSizeInPixels(&size);
    ::UnlockResource(hTemplate);

    return bResult;
    }

    Reply
  • Nice job but I have a slight problem.

    Posted by Legacy on 10/16/2001 12:00am

    Originally posted by: bphillips

    I'm trying to size a CChildframe, in PreCreateWindow, based on the dialog size. It works fine except for the width and height are slightly off. Any suggestions?
    Thanks

    Reply
  • Very well done

    Posted by Legacy on 08/10/2001 12:00am

    Originally posted by: Hamid Yaseen

    Dear
    You have done very well.

    Thanks

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Enterprise endpoint backup can satisfy data collection and preservation requirements in a more streamlined and cost-effective manner than traditional e-discovery methods. Enterprise IT teams face increasing challenges as the amount of valuable data living on endpoints continues to grow. Due to the exploding volume, mobility and compliance requirements of enterprise data, the need to collect and preserve that data for the purpose of e-discovery becomes more critical--and more difficult. Traditionally, …

  • New IT trends to support worker mobility -- such as VDI and BYOD -- are quickly gaining interest and adoption. But just as with any new trend, there are concerns and pitfalls to avoid. Download this paper to learn the most important considerations to keep in mind for your VDI project.

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date