前不久,Inprise公司(原Borland公司)正式公布了Delphi 5.0版,其開發向導中支持了“控制面板程序(CPL)”框架的生成,利用它可以快速、方便地開發CPL程序。那麼是否能在現有的Borland C++ Builder 中開發CPL程序呢?
CPL程序是動態鏈接庫(DLL)的一種變形,只不過擴展名為.cpl、入口函數為CPlApplet()而不是DllEntryPoint()罷了(並不是不要DllEntryPoint(),不然不能編譯)。我們只需在BCB4.0中選擇“File|New...”打開開發向導,選擇“DLL”生成一個DLL框架,並在其中加入一個函數CPlApplet()就可以了。為了快速地說明問題,筆者先給出一個最簡單的例子程序,然後再來解說。
#include <vcl.h>
#include <cpl.h>
#include <cplext.h>
#pragma hdrstop
USERES("my.res");//這是我加入的資源文件,其中有一個圖標
extern"C" __declspec(dllexport) long CALLBACK __stdcall CPlApplet(HWND hwndCPL,UINT uMsg,LPARAM lParam1,LPARAM lParam2);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
long CALLBACK __declspec(dllexport) __stdcall CPlApplet(HWND hwndCPL,UINT uMsg,LPARAM lParam1,LPARAM lParam2)
{
LPNEWCPLINFO mycpl;//LPNEWCPLINFO結構可在CPL.H頭文件中查看
long result=0;
switch (uMsg)//判斷傳來的信息
{
case CPL_INIT:// 第一個信息,在控制面板調入時產生
result=1;
break;
case CPL_GETCOUNT://第二個信息,在控制面板調入時產生
result=1;
break;
case CPL_INQUIRE://第三個信息,當控制面板查詢時產生
result=0;
break;
case CPL_NEWINQUIRE://第三個信息,當控制面板查詢時產生
mycpl=LPNEWCPLINFO (lParam2);// 將lParam2中的指針傳給mycpl
mycpl->dwSize=sizeof(NEWCPLINFO);
mycpl->dwFlags=0;//標志變量 一般設為0
mycpl->dwHelpContext=0;//幫助句柄一般設為0
mycpl->lData=0;
mycpl->hIcon=(HICON)LoadIcon(HInstance,"MyIcon");
mycpl->szHelpFile[0]='\0';//幫助文件
StrCopy(mycpl->szName,"BCB控制面板演示程序");//在圖標下顯示的說明文字
StrCopy(mycpl->szInfo,"用BCB開發自己的控制面板程序");// 在控制面板狀態欄中顯示的說明信息
result=0;
break;
case CPL_DBLCLK://當圖標被雙擊時
ShowMessage("這是一個CPL試驗程序");
result=0;
break;
case CPL_STOP://當用戶關閉自已的程序時產生
result=1;
break;
case CPL_EXIT:// 當控制面板關閉時產生,系統使用FreeLibrary()釋放
result=0;
break;
default:
break;
}
return result;
}
程序解說
CPL程序的運行流程是基於發送到程序的一系列消息。
當用戶打開“控制面板”的時候,系統將遍歷System目錄下的所有CPL程序,並給它們傳送CPL—INT消息。這時,CPL程序就可以做一些初始化工作,然後返回非零值,如果返零,程序將被終止。如果CPL—INT消息處理完成後,CPL程序將接收到CPL—GETCOUNT消息,此時程序必須返回對話框的數目,一般為1。然後,程序又將收到CPL—NEWINQUIRE消息,此時系統需要CPL程序提供有關信息,如圖標、說明文字、幫助文件等,程序必須填充lParam2這個指針指向的信息結構,然後返回0。到這裡,控制面板就完成了初始化,顯示出各個圖標。如果用戶雙擊了某個圖標後,這個圖標所代表的CPL程序將接收到一個CPL—DBCLICK消息。這時,CPL程序可以顯示出對話界面,進行有關操作。當用戶完成操作、關閉程序時,必須返回0。當用戶關閉“控制面板”,此時CPL程序將接收到CPL—STOP消息,這時就要釋放內存資源,做好善後工作,然後返回1。 最後CPL程序將接收到最後一個消息CPL—EXIT,系統將刪除各個窗口,並使用FreeLibrary()函數將CPL程序從系統中刪除,完成整個流程。一般情況下,我們只需要對CPL—NEWINQUIRE和CPL—DBCLICK這兩個消息進行處理,其它的消息只要返回默認值就夠了。
大家只要編譯這個CPL項目,並將結果拷貝到Windows\System目錄下,然後打開“控制面板”就可以看到成果了。雙擊圖標,程序將彈出一個信息框:“這是一個CPL試驗程序!"。這樣一個CPL程序就完成了。
如果你想加入更多的功能,只需將CPL—DBCLICK消息進行處理,比如可以顯示一個窗口進行交互操作。具體的方法與在DLL中加入窗口的方法相同,因為CPL程序本身就是基於DLL框架制作出來的。下圖是筆者做的一個交互窗口:最後,告訴讀者一點技巧:想要編譯器輸出.cpl文件,可在Project|Options...|Application|output settings中將輸出擴展名dll改為cpl就行了。將CPL程序拷入Windows\System\目錄下後不必打開“控制面板”,直接雙擊文件就可以打開這個程序了。而在其它目錄下是沒有作用的。
以上程序,經老妖試驗在Win2000+sp2+CB6下成功。