C++輔導(dǎo):用VC6.0制作控制面板應(yīng)用程序

字號(hào):

一、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鍵下,供文件傳輸程序讀取。