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

 // 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
	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.

 CPanelApp* pApplet = m_pThis;

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

  case CPL_EXIT:
  return pApplet->OnExit();

  return pApplet->OnGetCount();

  case CPL_INIT:
  return pApplet->OnInit();

  return pApplet->OnInquire(lParam1, (CPLINFO*)lParam2);
  return pApplet->OnNewInquire(lParam1, 

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

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


 return 1;

// Default command handlers

LONG CPanelApp::OnNewInquire(UINT uAppNum, 
 // 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;

 _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'

    ; Explicit exports can go here

Thats all there is too it!


  • Question: How to interface CPIApplet in VB

    Posted by Legacy on 02/11/2002 12:00am

    Originally posted by: EduardoS

    Hello People ...

    I wanna know how to interfaces this code with VB ... I need create an Control Panel Applet in VB but I dont know C ...


  • Use RUNDLL32 to Debug Control Panel Applets

    Posted by Legacy on 01/10/2001 12:00am

    Originally posted by: Ernest L.

    You may want to debug a control panel application
    using this tip:
    Executable for debug session:
    C:\winnt\system32\rundll32.exe (or put your own path)
    Program arguments:
    shell32.dll,Control_RunDLL <cpl application path>

    or bookmark this faqs:

  • See a book "Professioal NT Services' by Kevin Miller

    Posted by Legacy on 03/25/2000 12:00am

    Originally posted by: Andrei Romanov

    Exactly the same code was published in chapter 11 of "Professioal NT Services' by Kevin Miller, WROX, ISBN 1-861001-30-4.

  • Not bad

    Posted by Legacy on 03/01/2000 12:00am

    Originally posted by: Paul Wardle

    Thanks for the code. Works well.

  • Please post an example source code project

    Posted by Legacy on 02/04/2000 12:00am

    Originally posted by: Ed E. Sutton

    A nice article.

    Please post an example project. Examples always get me started much faster.


Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Moving from an on-premises environment to Office 365 does not remove the need to plan for disruptions or reduce the business risk requirements for protecting email services. If anything, some risks increase with a move to the cloud. Read how to ease the transition every business faces if considering or already migrating to cloud email. This white paper discusses: Setting expectations when migrating to Office 365 Understanding the implications of relying solely on Exchange Online security Necessary archiving …

  • Enterprises are increasingly looking to platform as a service (PaaS) to lower their costs and speed their time to market for new applications. Developing, deploying, and managing applications in the cloud eliminates the time and expense of managing a physical infrastructure to support them. PaaS offerings must deliver additional long-term benefits, such as a lower total cost of ownership (TCO), rapid scalability, and ease of integration, all while providing robust security and availability. This report …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date