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

  • Java developers know that testing code changes can be a huge pain, and waiting for an application to redeploy after a code fix can take an eternity. Wouldn't it be great if you could see your code changes immediately, fine-tune, debug, explore and deploy code without waiting for ages? In this white paper, find out how that's possible with a Java plugin that drastically changes the way you develop, test and run Java applications. Discover the advantages of this plugin, and the changes you can expect to see …

  • Not all enterprise applications are created equal. Sophisticated applications need developer support but other more basic apps do not. With the right tools, everyone is a potential app developer with ideas and a perspective to share. Trends such as low-code development and model driven development are fundamentally changing how and who creates applications. Is your organization ready? Read this report and learn: The seven personas of enterprise app delivery How application ownership is spreading to the …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds