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