Finding Display Size of Dialog From Resource | CodeGuru

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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Dec 6, 2000
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

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;
}
CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.