Loading a FormView based on the Screen Resolution

–>

When you generate a formview based application or generally when you are using formview derived class, you will find this piece of code.

CTempView::CTempView()
 : CFormView(CTempView::IDD)
{
 //{{AFX_DATA_INIT(CTempView)
 //}}AFX_DATA_INIT
}

Now depending upon the resolution you want to load the resource i.e. for 1024×768 you want to load CTempView::IDD and for 800×600 you want to load CTempView::IDD1. If you try to write the code for selecting the resource directly in the constructor i.e. something like this

CTempView::CTempView()
 {
    /*logic to find the resolution, bResol will be true if it is 1024x768*
    if(bResol)
        id = CTempView::IDD;
   else
        id = CTempView::IDD1;

  // Call the formview costructor here.
  CFormView(id);

 //{{AFX_DATA_INIT(CTempView)
 //}}AFX_DATA_INIT

}
!-- end the block of source code -->

The Compiler will crib and it will not compile.

The solution is to have a global object which gets constructed before the formview and assign a global variable with the appropriate resource id, so that it can be used in the FormView constructor. The code looks something like this.

static int g_ID;
static struct _stDummy
{
 _stDummy()
 {
  /* logic to find the resolution *
  int x = GetSystemMetrics(SM_CXSCREEN);
  if(x == 1024)
   g_ID = CTempView::IDD;
  else /* for 800x600 and any other resolution*
   g_ID = CTempView::IDD1;
 }
}g_Dummy; /* dummy object *

IMPLEMENT_DYNCREATE(CTempView, CFormView)
CTempView::CTempView() :CFormView(g_ID)
{
 //{{AFX_DATA_INIT(CTempView)
 //}}AFX_DATA_INIT
}
!-- end the block of source code -->

Now the g_Dummy object gets constructed first and your logic for selecting the resource id is done here and the id is stored in g_ID which is later being used in the formview constructor. Now the compiler works happily and so does the code.

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read