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!