Control Panel Applet using MFC

Environment: Wnidows NT4 SP5, Visual C++ 6 SP2

Ever wanted to make a Control Panel Applet using MFC but couldent get it to
work?
Simlpy folow these steps:

1. Make a MFC DLL using the project wizard.

2. In the CWinApp header file define the folowing members:

//////////////////////////////////////////////////////
// PanelApp.h

class CPanelApp : public CWinApp
{
public:
 CPanelApp();

 // Static data
 static CPanelApp* m_pThis;

 // Static member functions (callbacks)
 static LONG APIENTRY CPlApplet(HWND hWnd,
  UINT uMsg, LONG lParam1, LONG lParam2);

 LONG OnDblclk(HWND hWnd, UINT uAppNum, LONG lData);
 LONG OnExit();
 LONG OnGetCount();
 LONG OnInit();
 LONG OnInquire(UINT uAppNum, CPLINFO* pInfo);
 LONG OnNewInquire(UINT uAppNum, NEWCPLINFO* pInfo);
 LONG OnStop(UINT uAppNum, LONG lData);
};

2. In the CWinApp source file add the folowing code:

//////////////////////////////////////////////////////
// PanelApp.cpp


// Static data initialization
CPanelApp* CPanelApp::m_pThis = NULL;

// CPanelApp construction
CPanelApp::CPanelApp()
{
	m_pThis = this;
}

// Callback members
LONG APIENTRY CPanelApp::CPlApplet(HWND hWnd, UINT uMsg,
 LONG lParam1, LONG lParam2)
{
 // Avoids state problems in MFC extensions using 
 // shared MFC libs.
 AFX_MANAGE_STATE(AfxGetStaticModuleState());

 CPanelApp* pApplet = m_pThis;
 ASSERT(pApplet);

 switch (uMsg)
 {
  case CPL_DBLCLK:
  return pApplet->OnDblclk(hWnd, lParam1, lParam2);

  case CPL_EXIT:
  return pApplet->OnExit();

  case CPL_GETCOUNT:
  return pApplet->OnGetCount();

  case CPL_INIT:
  return pApplet->OnInit();

  case CPL_INQUIRE:
  return pApplet->OnInquire(lParam1, (CPLINFO*)lParam2);

  case CPL_NEWINQUIRE:
  return pApplet->OnNewInquire(lParam1,
   (NEWCPLINFO*)lParam2);

  case CPL_STOP:
  return pApplet->OnStop(lParam1, lParam2);

  case CPL_STARTWPARMS:
  return pApplet->OnDblclk(hWnd, lParam1, lParam2);

  default:
  break;
 }

 return 1;
}

// Default command handlers

LONG CPanelApp::OnNewInquire(UINT uAppNum,
 NEWCPLINFO* pInfo)
{
 // Fill in the data
 pInfo->dwSize		  = sizeof(NEWCPLINFO);
 pInfo->dwFlags		  = 0;
 pInfo->dwHelpContext = 0;
 pInfo->lData		  = 0;
 pInfo->hIcon		  = LoadIcon(IDI_MAINFRM);

 CString sCplName, sCplInfo;
 sCplName.LoadString(IDS_CPL_NAME);
 sCplInfo.LoadString(IDS_CPL_INFOSTRING);

 _tcscpy(pInfo->szName, sCplName);
 _tcscpy(pInfo->szInfo, sCplInfo);
 _tcscpy(pInfo->szHelpFile, _T(""));

 return 0;
}

LONG CPanelApp::OnInquire(UINT uAppNum, CPLINFO* pInfo)
{
 pInfo->idIcon	= IDI_MAINFRM;
 pInfo->idName	= IDS_CPL_NAME;
 pInfo->idInfo	= IDS_CPL_INFOSTRING;
 pInfo->lData	= 0;

 return 0;
}

LONG CPanelApp::OnDblclk(HWND hWnd, UINT uAppNum,
 LONG lData)
{
 // Insert your Control Panel Applet dialog (property 
 // sheet) code here

 return 0;
}

LONG CPanelApp::OnExit()
{
 return 0; // OK
}

LONG CPanelApp::OnGetCount()
{
 return 1; // only one applet
}

LONG CPanelApp::OnInit()
{
 return 1; // OK
}

LONG CPanelApp::OnStop(UINT uAppNum, LONG lData)
{
 return 1; // not handled
}

3. Finaly add the folowing to the projects *.def file

; Panel.def : Declares the module parameters for the DLL.

LIBRARY      "Panel"
DESCRIPTION  'Panel Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here

	CPlApplet

Thats all there is too it!

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read