如何在控制面板中添加自己的控制面板程序呢?首先來了解以下控制面板程序的原理。一個控制面板程序就是一個動態連接庫(DLL)。在庫文件中必須建立一個名稱為CPLApplet的輸出回調函數,在函數中加入對Windows調用的響應代碼,編輯成動態連接庫文件。庫文件將庫文件的擴展名改為CPL,然後將文件拷貝到 Windows\System子目錄下,系統在啟動時會自動搜索擴展名為Cpl的文件。搜索到文件之後,系統會裝入文件並調用CPLApplet函數,這時函數中的代碼就開始工作,執行彈出系統設置窗口等操作。
是不是很復雜,你必須對於系統調用DLL的工作原理和回調函數有比較深刻的了解才能編寫控制面板程序,而且必須無法在編程軟件的集成窗口中調試,而必須先編譯好以後拷貝到 Windows\System 目錄下觀察運行效果,然後再對源程序除錯,再編譯。
幸好在Delphi5中提供了方便建立控制面板程序的方式。在Delphi5的菜單中選File | New ,在New Items窗口中會看到有一個 Control Panel Application 選項,點擊這個選項,然後再按OK鍵,就可以建立一個基本的控制面板程序。在這個程序的工程文件包中包含兩個文件,一個是工程文件 Project1.dpr。按Ctrl+F12打開VIEw Units窗口打開Project1,可以看到代碼的第一行是library Project1; ,另外在代碼中還有一行:exports CPlApplet; ,這說明程序已經自動建立了輸出回調函數。
另一個文件是控制面板程序控制文件(姑且這麼稱呼它)Unit1.pas。這個程序代碼中建立了一個TAppletModule類,這個類就是控制面板程序控制類。同時程序還會建立一個調試、控制窗口AppletModule1。在窗口左邊的列表框中有一項 AppletModule1,右鍵點擊該項,在彈出菜單中選Install Control Panel Applet項編譯並安裝控制面板程序。如果安裝成功,再右鍵點擊AppletModule1,在彈出菜單中選Launch Control Panel運行控制面板。怎麼樣?在控制面板中是不是增加了一個 AppletModule1項?
當然,現在這個程序還很簡單,沒有漂亮的圖標,雙擊它也沒有反應,在下面我就要介紹對這個程序的擴展。
首先要讓它響應鼠標的雙擊。首先按Shift+F12鍵,在VIEw Form窗口中選擇AppletModule1打開調試、控制窗口。在窗口左邊的Object Inspector中點擊Events頁面,在Events列表中的第一項就是OnActive事件,你也許猜到了,對,這個事件就是控制面板程序被激活(也就是你雙擊控制面板中的程序圖標時發生的事件)時產生的事件。
下面來編寫代碼響應事件。在Delphi菜單中選 File | New,在New Items窗口中選Form項添加一個新的窗口。將文件保存為Unit2.pas,然後在Unit1.pas中添加Uses Unit2; (該句要添加在implementation後面),在Events列表中雙擊OnActive
事件,在事件中添加如下代碼:
procedure TAppletModule1.AppletModuleActivate(Sender: TObject;
Data: Integer);
begin
with TForm2.Create(Application) do begin
if ShowModal = mrOK then
Free;
end;
end;
最後記住將Project1中的Application.CreateForm(TForm2, Form2); 行給刪除掉。
接下來設置程序圖標,點擊AppletModule1的Object Inspector窗口,點擊PropertIEs頁面,選AppletIcon項,就可以為控制面板程序添加圖標了。改變Caption項的值就可以為程序設置不同的標題。
圖標和程序標題設置好以後,再重復上面的Install Control Panel Applet編譯並安裝程序,然後再選Launch Control Panel運行。雙擊新建立的程序圖標,看看,建立一個控制面板程序就是這麼簡單!
當然,這只是一個最簡單的控制面板程序,它只是響應OnActive事件並彈出一個窗口,在OnActive事件中的Data是一個比較重要的參數,它是控制面板程序調用程序傳遞給程序的參數,利用這個參數可以對不同的調用彈出不同的窗口,例如你要建立一個時間/日期調整控制程序,你可以做以下代碼:
procedure TAppletModule1.AppletModuleActivate(Sender: TObject;
Data: Integer);
begin
with TForm2.Create(Application) do begin file://以下是偽代碼:
Case Data of
1:DoChangeTime; file://顯示改變系統時間窗口
2:DoChangeDate; file://顯示改變系統日期窗口
end;
end;
end;
這樣當外部程序以不同的參數調用程序時,程序能彈出不同的窗口,例如 RunDll32