//========================================================================
//TITLE:
// 一个简单的带消息循环的控制面板选项例程
//AUTHOR:
// norains
//DATE:
// Thursday 16-May-2007
//Environment:
// EVC4.0 + Standard SDK 4.2
// EVC4.0 + Standard SDK 5.0
//========================================================================
普通的应用程序可以在WinMain()中进行消息循环,当然CPL也可以,不过不是在DllMain(),而是在CPlApplet接收CPL_DBLCLK时.本文给出了一个很简单的在控制面板创建对话框的例子.
关于控制面板的功能和架构在我的其它文章里已经有介绍,这里就不再陈诉,而直接罗列代码.对本章所列代码有所不明白的朋友可以参考以下这几篇文章:
WinCE 控制面板的创建:http://blog.youkuaiyun.com/norains/archive/2006/02/25/609216.aspx
WinCE 控制面板和驱动通信:http://blog.youkuaiyun.com/norains/archive/2006/02/25/609217.aspx
详解WINCE的控制面板:http://blog.youkuaiyun.com/norains/archive/2006/09/07/1189143.aspx


/**/////////////////////////////////////////////////////////////////////////
//DisplayOutput.cpp:DefinestheentrypointfortheDLLapplication.
//

/**////////////////////////////////////////////////////////////////////////

#include"stdafx.h"
#include"D:/ProgramFiles/WINCE500/PUBLIC/COMMON/OAK/INC/Cpl.h"
#include"resource.h"
#include"Maindlg.h"
//---------------------------------------------------------------------
//Macrodefine

#defineCPL_TITLETEXT("简单例程")
#defineCPL_INFOTEXT("这是一个很简单例程的信息")

//Returnsthenumberofcharactersinanexpression.
#defineLENGTHOF(exp)((sizeof((exp)))/sizeof((*(exp))))

//--------------------------------------------------------------------------------
//Globaldata
HMODULEg_hModule=NULL;//HandletotheDLL.


//--------------------------------------------------------------------------------
//Description:
//MainentrypointfortheControlPanelDLL.
//--------------------------------------------------------------------------------------------
BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved)

...{
switch(ul_reason_for_call)

...{
caseDLL_PROCESS_ATTACH:

...{
g_hModule=(HMODULE)hModule;
break;
}
caseDLL_THREAD_ATTACH:
caseDLL_THREAD_DETACH:
caseDLL_PROCESS_DETACH:
break;
}

returnTRUE;
}




//--------------------------------------------------------------------------------------------
//Description:
//TheentrypointtotheControlPanelapplication.
//-------------------------------------------------------------------------------------------
extern"C"LONGCALLBACKCPlApplet(HWNDhwndCPL,UINTmessage,LPARAMlParam1,LPARAMlParam2)

...{


switch(message)

...{
caseCPL_INIT:
//Performglobalinitializations,especiallymemory
//allocations,here.
//Return1forsuccessor0forfailure.
//ControlPaneldoesnotloadiffailureisreturned.
return1;

caseCPL_GETCOUNT:
//ThenumberofactionssupportedbythisControl
//Panelapplication.
return1;

caseCPL_NEWINQUIRE:
//Thismessageissentonceforeachdialogbox,as
//determinedbythevaluereturnedfromCPL_GETCOUNT.
//lParam1isthe0-basedindexofthedialogbox.
//lParam2isapointertotheNEWCPLINFOstructure.

...{
ASSERT(0==lParam1);
ASSERT(lParam2);


NEWCPLINFO*lpNewCplInfo=(NEWCPLINFO*)lParam2;
if(lpNewCplInfo)

...{
lpNewCplInfo->dwSize=sizeof(NEWCPLINFO);
lpNewCplInfo->dwFlags=0;//Ignored
lpNewCplInfo->dwHelpContext=0;//Ignored
lpNewCplInfo->lData=IDI_ICON;

//Thelargeiconforthisapplication.Donotfreethis
//HICON;itisfreedbytheControlPanelinfrastructure.
lpNewCplInfo->hIcon=LoadIcon(g_hModule,MAKEINTRESOURCE(IDI_ICON));
if(_tcslen(CPL_TITLE)<LENGTHOF(lpNewCplInfo->szName))

...{
_tcscpy(lpNewCplInfo->szName,CPL_TITLE);
}
if(_tcslen(CPL_INFO)<LENGTHOF(lpNewCplInfo->szInfo))

...{
_tcscpy(lpNewCplInfo->szInfo,CPL_INFO);
}
_tcscpy(lpNewCplInfo->szHelpFile,_T(""));


return0;
}
return1;//NonzerovaluemeansCPlAppletfailed.

}

caseCPL_DBLCLK:

...{
//Theuserhasdouble-clickedtheiconforthe
//dialogboxinlParam1(zero-based).
HWNDhWnd=FindWindow(NULL,WND_TITLE);
if(hWnd!=NULL)

...{
SetForegroundWindow(hWnd);
return1;
}

CMainDlg*pWnd=CMainDlg::GetInstance();
if(pWnd!=NULL)

...{
pWnd->ShowWindow(g_hModule,TRUE);
}


MSGmsg;
while(GetMessage(&msg,NULL,0,0))

...{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return1;//CPlAppletfailed.
}

caseCPL_STOP:
//Calledonceforeachdialogbox.Usedforcleanup.
caseCPL_EXIT:
//Calledonlyoncefortheapplication.Usedforcleanup.
default:
return0;
}



return1;//CPlAppletfailed.
}//CPlApplet


/**///////////////////////////////////////////////////////////////////////
//MainDlg.h:interfacefortheCMainDlgclass.
//

/**///////////////////////////////////////////////////////////////////////
#ifndefMAINDLG_H
#defineMAINDLG_H


//---------------------------------------------------------------------
//Macrodefine
#defineWND_TITLETEXT("HelloWorld")
//---------------------------------------------------------------------

classCMainDlg

...{
public:
staticCMainDlg*GetInstance();
BOOLShowWindow(HINSTANCEhInst,BOOLbShow);
virtual~CMainDlg();

protected:
voidOnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
staticBOOLWinProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam);
staticCMainDlg*m_pInstance;
HWNDm_hWnd;
HINSTANCEm_hInst;

private:
CMainDlg();
};

#endif//#ifndefMAINDLG_H



/**////////////////////////////////////////////////////////////////////////
//MainDlg.cpp:implementationoftheCMainDlgclass.
//

/**///////////////////////////////////////////////////////////////////////

#include"stdafx.h"
#include"MainDlg.h"
#include"resource.h"


//---------------------------------------------------------------------
//Initializethedata
CMainDlg*CMainDlg::m_pInstance=NULL;
//-----------------------------------------------------------------------

/**///////////////////////////////////////////////////////////////////////
//Construction/Destruction

/**///////////////////////////////////////////////////////////////////////

CMainDlg::CMainDlg()

...{
m_hWnd=NULL;
m_hInst=NULL;
}

CMainDlg::~CMainDlg()

...{
if(m_pInstance!=NULL)

...{
deletem_pInstance;
m_pInstance=NULL;
}
}


//---------------------------------------------------------------------
//Description:
//Showthedialog
//---------------------------------------------------------------------
BOOLCMainDlg::ShowWindow(HINSTANCEhInst,BOOLbShow)

...{
m_hInst=hInst;
m_hWnd=CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),NULL,WinProc);



if(m_hWnd==NULL)

...{
returnFALSE;
}

if(bShow==TRUE)

...{
::ShowWindow(m_hWnd,SW_SHOW);
}
else

...{
::ShowWindow(m_hWnd,SW_HIDE);
}
SetForegroundWindow(m_hWnd);


returnTRUE;
}



//---------------------------------------------------------------------
//Description:
//Thewindowprocess
//---------------------------------------------------------------------
BOOLCMainDlg::WinProc(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)

...{
switch(wMsg)

...{
caseWM_COMMAND:

...{
switch(LOWORD(wParam))

...{
caseIDCANCEL:
DestroyWindow(hWnd);
returnTRUE;
}
}
caseWM_DESTROY:
m_pInstance->OnDestroy(hWnd,wMsg,wParam,lParam);
returnTRUE;
}
returnFALSE;
}



//---------------------------------------------------------------------
//Description:
//Gettheinstance
//---------------------------------------------------------------------
CMainDlg*CMainDlg::GetInstance()

...{
if(m_pInstance==NULL)

...{
m_pInstance=newCMainDlg();
}

returnm_pInstance;
}




//---------------------------------------------------------------------
//Description:
//OnthemessageWM_DESTROY
//---------------------------------------------------------------------
voidCMainDlg::OnDestroy(HWNDhWnd,UINTwMsg,WPARAMwParam,LPARAMlParam)

...{
PostQuitMessage(0x0);
}
//TITLE:
// 一个简单的带消息循环的控制面板选项例程
//AUTHOR:
// norains
//DATE:
// Thursday 16-May-2007
//Environment:
// EVC4.0 + Standard SDK 4.2
// EVC4.0 + Standard SDK 5.0
//========================================================================
普通的应用程序可以在WinMain()中进行消息循环,当然CPL也可以,不过不是在DllMain(),而是在CPlApplet接收CPL_DBLCLK时.本文给出了一个很简单的在控制面板创建对话框的例子.
关于控制面板的功能和架构在我的其它文章里已经有介绍,这里就不再陈诉,而直接罗列代码.对本章所列代码有所不明白的朋友可以参考以下这几篇文章:
WinCE 控制面板的创建:http://blog.youkuaiyun.com/norains/archive/2006/02/25/609216.aspx
WinCE 控制面板和驱动通信:http://blog.youkuaiyun.com/norains/archive/2006/02/25/609217.aspx
详解WINCE的控制面板:http://blog.youkuaiyun.com/norains/archive/2006/09/07/1189143.aspx
















































































































































































































































































































































