//========================================================================
//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.csdn.net/norains/archive/2006/02/25/609216.aspx
WinCE 控制面板和驱动通信:http://blog.csdn.net/norains/archive/2006/02/25/609217.aspx
详解WINCE的控制面板:http://blog.csdn.net/norains/archive/2006/09/07/1189143.aspx
// DisplayOutput.cpp : Defines the entry point for the DLL application.
//
///
#include " stdafx.h "
#include " D:/ProgramFiles/WINCE500/PUBLIC/COMMON/OAK/INC/Cpl.h "
#include " resource.h "
#include " Maindlg.h "
// ---------------------------------------------------------------------
// Macro define
#define CPL_TITLE TEXT("简单例程")
#define CPL_INFO TEXT("这是一个很简单例程的信息")
// Returns the number of characters in an expression.
#define LENGTHOF(exp) ((sizeof((exp)))/sizeof((*(exp))))
// --------------------------------------------------------------------------------
// Global data
HMODULE g_hModule = NULL; // Handle to the DLL.
// --------------------------------------------------------------------------------
// Description:
// Main entry point for the Control Panel DLL.
// --------------------------------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
g_hModule = (HMODULE) hModule;
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// --------------------------------------------------------------------------------------------
// Description:
// The entry point to the Control Panel application.
// -------------------------------------------------------------------------------------------
extern " C " LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
{
switch (message)
{
case CPL_INIT:
// Perform global initializations, especially memory
// allocations, here.
// Return 1 for success or 0 for failure.
// Control Panel does not load if failure is returned.
return 1;
case CPL_GETCOUNT:
// The number of actions supported by this Control
// Panel application.
return 1;
case CPL_NEWINQUIRE:
// This message is sent once for each dialog box, as
// determined by the value returned from CPL_GETCOUNT.
// lParam1 is the 0-based index of the dialog box.
// lParam2 is a pointer to the NEWCPLINFO structure.
{
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;
// The large icon for this application. Do not free this
// HICON; it is freed by the Control Panel infrastructure.
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(""));
return 0;
}
return 1; // Nonzero value means CPlApplet failed.
}
case CPL_DBLCLK:
{
// The user has double-clicked the icon for the
// dialog box in lParam1 (zero-based).
HWND hWnd = FindWindow(NULL,WND_TITLE);
if(hWnd != NULL)
{
SetForegroundWindow(hWnd);
return 1;
}
CMainDlg *pWnd = CMainDlg::GetInstance();
if(pWnd != NULL)
{
pWnd->ShowWindow(g_hModule,TRUE);
}
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1; // CPlApplet failed.
}
case CPL_STOP:
// Called once for each dialog box. Used for cleanup.
case CPL_EXIT:
// Called only once for the application. Used for cleanup.
default:
return 0;
}
return 1; // CPlApplet failed.
} // CPlApplet
//
// MainDlg.h: interface for the CMainDlg class.
//
//
#ifndef MAINDLG_H
#define MAINDLG_H
// ---------------------------------------------------------------------
// Macro define
#define WND_TITLE TEXT("Hello World")
// ---------------------------------------------------------------------
class CMainDlg
{
public:
static CMainDlg * GetInstance();
BOOL ShowWindow(HINSTANCE hInst,BOOL bShow);
virtual ~CMainDlg();
protected:
void OnDestroy(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam);
static BOOL WinProc(HWND hWnd, UINT wMsg, WPARAM wParam,LPARAM lParam);
static CMainDlg *m_pInstance;
HWND m_hWnd;
HINSTANCE m_hInst;
private:
CMainDlg();
} ;
#endif // #ifndef MAINDLG_H
///
// MainDlg.cpp: implementation of the CMainDlg class.
//
//
#include " stdafx.h "
#include " MainDlg.h "
#include " resource.h "
// ---------------------------------------------------------------------
// Initialize the data
CMainDlg * CMainDlg::m_pInstance = NULL;
// -----------------------------------------------------------------------
//
// Construction/Destruction
//
CMainDlg::CMainDlg()
{
m_hWnd = NULL;
m_hInst = NULL;
}
CMainDlg:: ~ CMainDlg()
{
if(m_pInstance != NULL)
{
delete m_pInstance;
m_pInstance = NULL;
}
}
// ---------------------------------------------------------------------
// Description:
// Show the dialog
// ---------------------------------------------------------------------
BOOL CMainDlg::ShowWindow(HINSTANCE hInst, BOOL bShow)
{
m_hInst = hInst;
m_hWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),NULL,WinProc);
if(m_hWnd == NULL)
{
return FALSE;
}
if(bShow == TRUE)
{
::ShowWindow(m_hWnd,SW_SHOW);
}
else
{
::ShowWindow(m_hWnd,SW_HIDE);
}
SetForegroundWindow(m_hWnd);
return TRUE;
}
// ---------------------------------------------------------------------
// Description:
// The window process
// ---------------------------------------------------------------------
BOOL CMainDlg::WinProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch(wMsg)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL:
DestroyWindow(hWnd);
return TRUE;
}
}
case WM_DESTROY:
m_pInstance->OnDestroy(hWnd,wMsg,wParam,lParam);
return TRUE;
}
return FALSE;
}
// ---------------------------------------------------------------------
// Description:
// Get the instance
// ---------------------------------------------------------------------
CMainDlg * CMainDlg::GetInstance()
{
if(m_pInstance == NULL)
{
m_pInstance = new CMainDlg();
}
return m_pInstance;
}
// ---------------------------------------------------------------------
// Description:
// On the message WM_DESTROY
// ---------------------------------------------------------------------
void CMainDlg::OnDestroy(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
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.csdn.net/norains/archive/2006/02/25/609216.aspx
WinCE 控制面板和驱动通信:http://blog.csdn.net/norains/archive/2006/02/25/609217.aspx
详解WINCE的控制面板:http://blog.csdn.net/norains/archive/2006/09/07/1189143.aspx
// DisplayOutput.cpp : Defines the entry point for the DLL application.
//
///
#include " stdafx.h "
#include " D:/ProgramFiles/WINCE500/PUBLIC/COMMON/OAK/INC/Cpl.h "
#include " resource.h "
#include " Maindlg.h "
// ---------------------------------------------------------------------
// Macro define
#define CPL_TITLE TEXT("简单例程")
#define CPL_INFO TEXT("这是一个很简单例程的信息")
// Returns the number of characters in an expression.
#define LENGTHOF(exp) ((sizeof((exp)))/sizeof((*(exp))))
// --------------------------------------------------------------------------------
// Global data
HMODULE g_hModule = NULL; // Handle to the DLL.
// --------------------------------------------------------------------------------
// Description:
// Main entry point for the Control Panel DLL.
// --------------------------------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
g_hModule = (HMODULE) hModule;
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// --------------------------------------------------------------------------------------------
// Description:
// The entry point to the Control Panel application.
// -------------------------------------------------------------------------------------------
extern " C " LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
{
switch (message)
{
case CPL_INIT:
// Perform global initializations, especially memory
// allocations, here.
// Return 1 for success or 0 for failure.
// Control Panel does not load if failure is returned.
return 1;
case CPL_GETCOUNT:
// The number of actions supported by this Control
// Panel application.
return 1;
case CPL_NEWINQUIRE:
// This message is sent once for each dialog box, as
// determined by the value returned from CPL_GETCOUNT.
// lParam1 is the 0-based index of the dialog box.
// lParam2 is a pointer to the NEWCPLINFO structure.
{
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;
// The large icon for this application. Do not free this
// HICON; it is freed by the Control Panel infrastructure.
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(""));
return 0;
}
return 1; // Nonzero value means CPlApplet failed.
}
case CPL_DBLCLK:
{
// The user has double-clicked the icon for the
// dialog box in lParam1 (zero-based).
HWND hWnd = FindWindow(NULL,WND_TITLE);
if(hWnd != NULL)
{
SetForegroundWindow(hWnd);
return 1;
}
CMainDlg *pWnd = CMainDlg::GetInstance();
if(pWnd != NULL)
{
pWnd->ShowWindow(g_hModule,TRUE);
}
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1; // CPlApplet failed.
}
case CPL_STOP:
// Called once for each dialog box. Used for cleanup.
case CPL_EXIT:
// Called only once for the application. Used for cleanup.
default:
return 0;
}
return 1; // CPlApplet failed.
} // CPlApplet
//
// MainDlg.h: interface for the CMainDlg class.
//
//
#ifndef MAINDLG_H
#define MAINDLG_H
// ---------------------------------------------------------------------
// Macro define
#define WND_TITLE TEXT("Hello World")
// ---------------------------------------------------------------------
class CMainDlg
{
public:
static CMainDlg * GetInstance();
BOOL ShowWindow(HINSTANCE hInst,BOOL bShow);
virtual ~CMainDlg();
protected:
void OnDestroy(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam);
static BOOL WinProc(HWND hWnd, UINT wMsg, WPARAM wParam,LPARAM lParam);
static CMainDlg *m_pInstance;
HWND m_hWnd;
HINSTANCE m_hInst;
private:
CMainDlg();
} ;
#endif // #ifndef MAINDLG_H
///
// MainDlg.cpp: implementation of the CMainDlg class.
//
//
#include " stdafx.h "
#include " MainDlg.h "
#include " resource.h "
// ---------------------------------------------------------------------
// Initialize the data
CMainDlg * CMainDlg::m_pInstance = NULL;
// -----------------------------------------------------------------------
//
// Construction/Destruction
//
CMainDlg::CMainDlg()
{
m_hWnd = NULL;
m_hInst = NULL;
}
CMainDlg:: ~ CMainDlg()
{
if(m_pInstance != NULL)
{
delete m_pInstance;
m_pInstance = NULL;
}
}
// ---------------------------------------------------------------------
// Description:
// Show the dialog
// ---------------------------------------------------------------------
BOOL CMainDlg::ShowWindow(HINSTANCE hInst, BOOL bShow)
{
m_hInst = hInst;
m_hWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),NULL,WinProc);
if(m_hWnd == NULL)
{
return FALSE;
}
if(bShow == TRUE)
{
::ShowWindow(m_hWnd,SW_SHOW);
}
else
{
::ShowWindow(m_hWnd,SW_HIDE);
}
SetForegroundWindow(m_hWnd);
return TRUE;
}
// ---------------------------------------------------------------------
// Description:
// The window process
// ---------------------------------------------------------------------
BOOL CMainDlg::WinProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch(wMsg)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL:
DestroyWindow(hWnd);
return TRUE;
}
}
case WM_DESTROY:
m_pInstance->OnDestroy(hWnd,wMsg,wParam,lParam);
return TRUE;
}
return FALSE;
}
// ---------------------------------------------------------------------
// Description:
// Get the instance
// ---------------------------------------------------------------------
CMainDlg * CMainDlg::GetInstance()
{
if(m_pInstance == NULL)
{
m_pInstance = new CMainDlg();
}
return m_pInstance;
}
// ---------------------------------------------------------------------
// Description:
// On the message WM_DESTROY
// ---------------------------------------------------------------------
void CMainDlg::OnDestroy(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0x0);
}