一个简单的带消息循环的控制面板选项例程

本文提供了一个在Windows CE控制面板中创建对话框的简单示例,并详细展示了如何通过消息循环来实现控制面板应用的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//========================================================================
//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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值