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

  • Learn How A Global Entertainment Company Saw a 448% ROI Every business today uses software to manage systems, deliver products, and empower employees to do their jobs. But software inevitably breaks, and when it does, businesses lose money -- in the form of dissatisfied customers, missed SLAs or lost productivity. PagerDuty, an operations performance platform, solves this problem by helping operations engineers and developers more effectively manage and resolve incidents across a company's global operations. …

  • Live Event Date: December 18, 2014 @ 2:00 p.m. ET / 11:00 a.m. PT The Internet of Things (IoT) incorporates physical devices into business processes using predictive analytics. While it relies heavily on existing Internet technologies, it differs by including physical devices, specialized protocols, physical analytics, and a unique partner network. To capture the real business value of IoT, the industry must move beyond customized projects to general patterns and platforms. Check out this upcoming webcast …

Most Popular Programming Stories

More for Developers

RSS Feeds