一、Windows的控制面板應用程序
在Windows的系統(tǒng)目錄下可以找到控制面板應用程序,它們是一些擴展名為cpl的dll,通常用來提供配置服務,如配置網(wǎng)絡硬件和軟件用的ncpa.cpl,配置桌面用的desk.cpl等,它們的父窗口都是桌面。運行這類程序的方法很多:雙擊控制面板中的圖標、雙擊系統(tǒng)目錄下的cpl文件,或者使用如下DOS命令:
rundll32 shell32.dll,Control—RunDLL [@n]或者control [@n]
其中@n用于指定運行哪一個小程序(一個cpl文件中可包含多個小程序),若不帶此參數(shù)則相當于@0,即運行第一個小程序。例如:
Rundll32 shell32.dll,Control—RunDLL main.cpl @n
若不帶@n參數(shù),則運行鼠標設置;@1則運行鍵盤設置;@2則運行打印機設置;@3則顯示系統(tǒng)字體。Control—RunDLL是shell32.dll中定義的一個函數(shù),大小寫敏感,用于啟動控制面板。
通過控制面板應用程序來提供配置服務是一種很好的方法,那么如何設計這種應用程序呢?下面以Visual C++6.0為例進行介紹。
二、開發(fā)控制面板應用程序
若希望一個文件傳輸程序啟動后自動連接到某一個站點,就需要為其提供一些缺省值,如:服務器名、用戶名、口令等。下面就開發(fā)一個控制面板應用程序來提供這些缺省值,具體步驟為:
1.創(chuàng)建一個“MFC AppWizard (dll)”類型的項目,命名為:MyCplApp,選擇“Regular DLL With MFC statically linked”,使它的運行不依賴于其它任何dll。
2.選擇Project選單下的Settings項或按Alt+F7,在Link頁中將輸出文件名改為:
\\Mycplapp.cpl,在Debug頁中將“Executable for debug session”改為:\\Control.exe,以便直接用控制面板運行。對于Win9x,為System,對于WinNT,為System32。
3.從MSDN Library Visual Studio 6.0光盤的Samples目錄中找到Ctrlpan.cpp 和Ctrlpan.h 文件,并把它們加到項目中。
4.創(chuàng)建如圖1所示對話框,代號為:IDD—MYDIALOG,用Class Wizard創(chuàng)建一個CMyDialog類。為每個控件創(chuàng)建成員變量,如“FTP服務器”對應的成員變量定義為:CString m—strServer。
5.引入或新建一個ICON,代號為:IDI—MYICON,用于控制面板中顯示。
6.從CControlPanel類(在Ctrlpan.h中定義)繼承一個新類CMyPanel,修改MyPanel.h文件:
#include ″Ctrlpan.h″
class CMyPanel : public CControlPanel
{ public:
virtual LONG OnInquire(UINT uAppNum, NEWCPLINFO* pInfo);
virtual LONG OnDblclk(HWND hwndCPl, UINT uAppNum, LONG lData);
};//兩個虛擬函數(shù)由讀者加入
7.在MyPanel.cpp中實現(xiàn)MyPanel.h中定義的兩個虛擬函數(shù):
LONG CMyPanel::OnInquire(UINT uAppNum, NEWCPLINFO* pInfo)
{ //此函數(shù)在控制面板打開時被調(diào)用,用于獲取資源信息,即填充pInfo結(jié)構(gòu)
pInfo->dwSize = sizeof(NEWCPLINFO);
//指定結(jié)構(gòu)長度
pInfo->dwFlags = 0;//此成員忽略
pInfo->dwHelpContext = 0; //此成員忽略
pInfo->lData = 0;
//小程序傳遞給應用程序的LONG類型的值
pInfo->hIcon= ::LoadIcon(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDI—MYICON));
//加載圖標
strcpy(pInfo->szName, ″FTP設置″);
//設置名稱
strcpy(pInfo->szInfo, ″設置FTP缺省信息″);//設置描述
strcpy(pInfo->szHelpFile, ″ ″);
//此成員忽略
return 0; //不發(fā)送CPL—INQUIRE消息
}
LONG CMyPanel::OnDblclk(HWND hwndCPl, UINT uAppNum, LONG lData)
{ //雙擊控制面板中的圖標時,此函數(shù)被調(diào)用,用于讀取或保存設置信息。
CMyDialog dlg(CWnd::FromHandle(hwndCPl)); //用父窗口句柄初始化對話框
HKEY hcpl;//主鍵,用于讀寫注冊表
if (RegOpenKeyEx(HKEY—CURRENT—USER,″Control Panel\\FTPSet″,0,
KEY—QUERY—VALUE, &hcpl) == ERROR—SUCCESS)
{ DWORD dwType = 1;
//字符串類型REG—SZ
DWORD dwSize;//字符串長度
RegQueryValueEx(hcpl,″FTPServer″,NULL,&dwType,
(BYTE*)(LPCTSTR)dlg.m—strServer,&dwSize);
RegCloseKey(hcpl);
}//查詢注冊表,讀取以前的設置信息,上面僅以m—strServer為例。
RegCloseKey(hcpl);
if(dlg.DoModal()!=IDOK) return 0;
//執(zhí)行對話框,若用戶點擊“取消”則返回
DWORD dwDisp;
//用于接收創(chuàng)建主鍵的返回值
if (RegCreateKeyEx(HKEY—CURRENT—USER,″Control Panel\\FTPSet″,0,″ ″,
REG—OPTION—NON—VOLATILE, KEY—WRITE, NULL,
&hcpl, &dwDisp) == ERROR—SUCCESS)
{ RegSetValueEx(hcpl,″FTPServer″,0,REG—SZ,(BYTE*)(LPCTSTR)dlg.m—strServer, dlg.m—strServer.GetLength());
RegCloseKey(hcpl);
//將對話框中設置保存到注冊表
}return 0;
}
8.修改應用程序頭文件MyCplApp.h,加入下面黑體部分代碼:
#include ″MyPanel.h″
#include ″MyDialog.h″
class CMyCplAppApp : public CWinApp
{ public:
CMyCplAppApp();
DECLARE—MESSAGE—MAP()
CMyPanel m—Control;
};
9.修改模塊定義文件MyCplApp.DEF,輸出CPlApplet函數(shù):
LIBRARY MYCPLAPP
DESCRIPTION ′FTP設置′
EXPORTS
CPlApplet
10.編譯運行
按Ctrl+F5編譯運行后,控制面板會打開,里面多了一個圖標,雙擊它就彈出MyDialog對話框,輸入配置信息后,點擊“確定”退出。所有這些信息就保存到注冊表的HKEY—CURRENT—USER\Control Panel\FTPSet鍵下,供文件傳輸程序讀取。
在Windows的系統(tǒng)目錄下可以找到控制面板應用程序,它們是一些擴展名為cpl的dll,通常用來提供配置服務,如配置網(wǎng)絡硬件和軟件用的ncpa.cpl,配置桌面用的desk.cpl等,它們的父窗口都是桌面。運行這類程序的方法很多:雙擊控制面板中的圖標、雙擊系統(tǒng)目錄下的cpl文件,或者使用如下DOS命令:
rundll32 shell32.dll,Control—RunDLL [@n]或者control [@n]
其中@n用于指定運行哪一個小程序(一個cpl文件中可包含多個小程序),若不帶此參數(shù)則相當于@0,即運行第一個小程序。例如:
Rundll32 shell32.dll,Control—RunDLL main.cpl @n
若不帶@n參數(shù),則運行鼠標設置;@1則運行鍵盤設置;@2則運行打印機設置;@3則顯示系統(tǒng)字體。Control—RunDLL是shell32.dll中定義的一個函數(shù),大小寫敏感,用于啟動控制面板。
通過控制面板應用程序來提供配置服務是一種很好的方法,那么如何設計這種應用程序呢?下面以Visual C++6.0為例進行介紹。
二、開發(fā)控制面板應用程序
若希望一個文件傳輸程序啟動后自動連接到某一個站點,就需要為其提供一些缺省值,如:服務器名、用戶名、口令等。下面就開發(fā)一個控制面板應用程序來提供這些缺省值,具體步驟為:
1.創(chuàng)建一個“MFC AppWizard (dll)”類型的項目,命名為:MyCplApp,選擇“Regular DLL With MFC statically linked”,使它的運行不依賴于其它任何dll。
2.選擇Project選單下的Settings項或按Alt+F7,在Link頁中將輸出文件名改為:
\\Mycplapp.cpl,在Debug頁中將“Executable for debug session”改為:\\Control.exe,以便直接用控制面板運行。對于Win9x,為System,對于WinNT,為System32。
3.從MSDN Library Visual Studio 6.0光盤的Samples目錄中找到Ctrlpan.cpp 和Ctrlpan.h 文件,并把它們加到項目中。
4.創(chuàng)建如圖1所示對話框,代號為:IDD—MYDIALOG,用Class Wizard創(chuàng)建一個CMyDialog類。為每個控件創(chuàng)建成員變量,如“FTP服務器”對應的成員變量定義為:CString m—strServer。
5.引入或新建一個ICON,代號為:IDI—MYICON,用于控制面板中顯示。
6.從CControlPanel類(在Ctrlpan.h中定義)繼承一個新類CMyPanel,修改MyPanel.h文件:
#include ″Ctrlpan.h″
class CMyPanel : public CControlPanel
{ public:
virtual LONG OnInquire(UINT uAppNum, NEWCPLINFO* pInfo);
virtual LONG OnDblclk(HWND hwndCPl, UINT uAppNum, LONG lData);
};//兩個虛擬函數(shù)由讀者加入
7.在MyPanel.cpp中實現(xiàn)MyPanel.h中定義的兩個虛擬函數(shù):
LONG CMyPanel::OnInquire(UINT uAppNum, NEWCPLINFO* pInfo)
{ //此函數(shù)在控制面板打開時被調(diào)用,用于獲取資源信息,即填充pInfo結(jié)構(gòu)
pInfo->dwSize = sizeof(NEWCPLINFO);
//指定結(jié)構(gòu)長度
pInfo->dwFlags = 0;//此成員忽略
pInfo->dwHelpContext = 0; //此成員忽略
pInfo->lData = 0;
//小程序傳遞給應用程序的LONG類型的值
pInfo->hIcon= ::LoadIcon(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDI—MYICON));
//加載圖標
strcpy(pInfo->szName, ″FTP設置″);
//設置名稱
strcpy(pInfo->szInfo, ″設置FTP缺省信息″);//設置描述
strcpy(pInfo->szHelpFile, ″ ″);
//此成員忽略
return 0; //不發(fā)送CPL—INQUIRE消息
}
LONG CMyPanel::OnDblclk(HWND hwndCPl, UINT uAppNum, LONG lData)
{ //雙擊控制面板中的圖標時,此函數(shù)被調(diào)用,用于讀取或保存設置信息。
CMyDialog dlg(CWnd::FromHandle(hwndCPl)); //用父窗口句柄初始化對話框
HKEY hcpl;//主鍵,用于讀寫注冊表
if (RegOpenKeyEx(HKEY—CURRENT—USER,″Control Panel\\FTPSet″,0,
KEY—QUERY—VALUE, &hcpl) == ERROR—SUCCESS)
{ DWORD dwType = 1;
//字符串類型REG—SZ
DWORD dwSize;//字符串長度
RegQueryValueEx(hcpl,″FTPServer″,NULL,&dwType,
(BYTE*)(LPCTSTR)dlg.m—strServer,&dwSize);
RegCloseKey(hcpl);
}//查詢注冊表,讀取以前的設置信息,上面僅以m—strServer為例。
RegCloseKey(hcpl);
if(dlg.DoModal()!=IDOK) return 0;
//執(zhí)行對話框,若用戶點擊“取消”則返回
DWORD dwDisp;
//用于接收創(chuàng)建主鍵的返回值
if (RegCreateKeyEx(HKEY—CURRENT—USER,″Control Panel\\FTPSet″,0,″ ″,
REG—OPTION—NON—VOLATILE, KEY—WRITE, NULL,
&hcpl, &dwDisp) == ERROR—SUCCESS)
{ RegSetValueEx(hcpl,″FTPServer″,0,REG—SZ,(BYTE*)(LPCTSTR)dlg.m—strServer, dlg.m—strServer.GetLength());
RegCloseKey(hcpl);
//將對話框中設置保存到注冊表
}return 0;
}
8.修改應用程序頭文件MyCplApp.h,加入下面黑體部分代碼:
#include ″MyPanel.h″
#include ″MyDialog.h″
class CMyCplAppApp : public CWinApp
{ public:
CMyCplAppApp();
DECLARE—MESSAGE—MAP()
CMyPanel m—Control;
};
9.修改模塊定義文件MyCplApp.DEF,輸出CPlApplet函數(shù):
LIBRARY MYCPLAPP
DESCRIPTION ′FTP設置′
EXPORTS
CPlApplet
10.編譯運行
按Ctrl+F5編譯運行后,控制面板會打開,里面多了一個圖標,雙擊它就彈出MyDialog對話框,輸入配置信息后,點擊“確定”退出。所有這些信息就保存到注冊表的HKEY—CURRENT—USER\Control Panel\FTPSet鍵下,供文件傳輸程序讀取。

