国产在线导航,欧美日本中文,黄色在线观看网站永久免费乱码,chinese国产在线视频,亚洲欧洲第一视频,天天做人人爱夜夜爽2020毛片,亚洲欧美中文字幕在线网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>計算機信息技術(shù)>利用Delphi編寫Windows控制面板組件及實例

利用Delphi編寫Windows控制面板組件及實例

時間:2023-02-21 00:10:32 計算機信息技術(shù) 我要投稿
  • 相關(guān)推薦

利用Delphi編寫Windows控制面板組件及實例

  張 建 軍(中國人民解放軍合肥炮兵學院研究生系97級)
  
  韓 瑩 (中保財險安徽省銅陵市分公司計財部)
  
  關(guān)鍵詞:
  
  在Windows95/NT/98操作系統(tǒng)中,控制面板(Control Panel)提供了定制Windows的操作方法,通過它可以完成設(shè)置打印機、顯示、網(wǎng)絡、添加新硬件等功能。通常控制面板包含20多個組件(*.CPL),分別負責系統(tǒng)某一方面的設(shè)置。鼠標雙擊任一組件圖標,控制面板調(diào)用相應程序,彈出對話框,允許設(shè)置系統(tǒng)參數(shù)。確認修改后系統(tǒng)參數(shù)保存在Windows注冊表或某一配置文件(*.INI)中。
  
  一、控制面板組件基礎(chǔ)知識
  
  控制面板是一個Windows應用程序C:\WINDOWS\CONTROL.EXE,其配置文件是C:\WINDOWS\CONTROL.INI.控制面板組件是一些動態(tài)鏈接庫,其擴展名不是DLL,而是CPL.通常,控制面板組件保存在C:\WINDOWS\SYSTEM\目錄下。在CONTROL.INI中有一個[MMCPL]節(jié),該節(jié)可指定由CONTROL.EXE調(diào)用的動態(tài)鏈接庫,其格式一般為:
  
  …
  
  [MMCPL]
  
  uniqueName=D:\PROJECT1.DLL(這里假設(shè)PROJECT1為用戶編寫的控制面板組板文件
  
  名,其訪問路徑可由讀者自行確定)
  
  …
  
  采用此方法,PROJECT1.DLL不必存放在C:\WINDOWS\SYSTEM\目錄下,擴展名不必改為CPL.CONTROL.EXE運行后按以下順序調(diào)用這些動態(tài)鏈接庫:
  
  在C:\WINDOWS\SYSTEM\目錄下調(diào)用MAIN.INI.
  
  已加載并輸出CplApplet()函數(shù)的可安裝驅(qū)動程序。
  
  在CONTROL.INI[MMCPL]節(jié)中指定的DLL.
  
  在C:\WINDOWS\SYSTEM\目錄下調(diào)用CPL.
  
  因此,編寫控制面板組件近似于編寫普通DLL.通常一個CPL支持控制面板中的一個組件(即一個圖標),也可支持多個組件。本文介紹利用Delphi編寫CPL、擴充控制面板組件(一個CPL支持一個或多個組件)的方法。
  
  二、控制面板組件工作流程
  
  1、每個CPL文件必須輸出一個CplApplet函數(shù),與CONTROL.EXE之間傳遞、處理消息。CplApplet函數(shù)的原形是:
  
  type
  
  TCPLApplet = function (hwndCPl: THandle; uMsg: DWORD;
  
  lParam1, lParam2: Longint): Longint; stdcall;
  
  其中,hwndCPl是控制面板窗口句柄,uMsg是消息標識,lParam1、lParam2是兩個附加參數(shù),具體意義視uMsg的值而定。
  
  2、當CONTROL.EXE把各CPL(或DLL)調(diào)入內(nèi)存時,CONTROL.EXE立刻向CPLApplet發(fā)送一條CPL_INIT消息,要求CPL執(zhí)行全局初始化并分配內(nèi)存。CPL_INIT是唯一可以返回調(diào)用失敗的消息。如果初始化成功,CPL返回非零,否則返回零。如果CPL返回零,控制面板終止與CPL通信并卸載此CPL(或DLL)。
  
  3、CPL_INIT消息處理結(jié)束后,CONTROL.EXE立刻向CPLApplet發(fā)送一條CPL_GETCOUNT消息,CPL返回支持的組件數(shù)。
  
  4、CPL_GETCOUNT消息處理結(jié)束后,CONTROL.EXE立刻向CPLApplet發(fā)送一條CPL_NEWINQUIRE消息,CPL_NEWINQUIRE每次發(fā)送一條,以取得每個組件的圖標、名稱、提示內(nèi)容(顯示在控制面板的狀態(tài)欄)等信息。lParam1是指定對話框的數(shù)值,該值應在0到(CPL_GETCOUNT - 1)之間。如果CPL_NEWINQUIRE處理成功,返回0.
  
  說明:
  
  ◆在Windows3.X系統(tǒng)中,CONTROL.EXE發(fā)送的是CPL_INQUIRE消息。為向下兼容,該消息被保留;赪in32的CPL應使用CPL_NEWINQUIRE.
  
  ◆通過判斷l(xiāng)Param1的值,可對一個CPL支持的多個組件的圖標、名稱、提示內(nèi)容等進行控制。
  
  5、控制面板顯示所有查找到的組件圖標。鼠標雙擊任一組件圖標,控制面板向其CPL發(fā)送一條CPL_DBLCLK消息,CPL顯示相應對話框,供用戶改變系統(tǒng)設(shè)置。
  
  說明:
  
  ◆通過檢測lParam1的值,可判斷用戶雙擊的是一個CPL支持的多個組件中的哪個圖標,并運行相應程序。
  
  6、控制面板關(guān)閉時,向每個組件發(fā)送一條CPL_STOP消息,然后對每個CPL發(fā)送一條CPL_EXIT消息,CPL釋放內(nèi)存并卸載。
  
  三、控制面板組件編寫實例
  
  1、編程步驟:
  
  在Delphi IDE中選取菜單File-New-DLL-OK.
  
 、谠赑roject1中添加如圖所示Form1、Form2……,根據(jù)需要設(shè)計窗體界面。為簡略起見,本文僅以Form1為例。
  
 、跢orm1主要代碼:(為編寫基于Win32的CPL,本文以讀寫Windows注冊表為例)
  
  在uses子句添加:Registry.//引用注冊表單元
  
  在type部分聲明變量:
  
  var
  
  Form1: TForm1;
  
  KeyHandle : HKEY;
  
  ValSize : longint;
  
  Option1 : Integer;
  
  Option2 : Integer;
  
  TForm1.FormActivate代碼://打開Windows注冊表,讀取某特定鍵值
  
  procedure TForm1.FormActivate(Sender: TObject);
  
  begin
  
  RegOpenKeyEx(HKEY_CURRENT_CONFIG,
  
  'Software\Microsoft\windows\CurrentVersion\',
  
  0, KEY_ALL_ACCESS, KeyHandle);
  
  ValSize := SizeOf(Option1);
  
  RegQueryValueEx(KeyHandle,'WinA', nil, nil, @Option1,
  
  @ValSize);
  
  ValSize := SizeOf(Option2);
  
  RegQueryValueEx(KeyHandle,'WinB', nil, nil, @Option2,
  
  @ValSize);
  
  with Form1 do begin
  
  case Option1 of
  
  0: RadioGroup1.ItemIndex:=0;
  
  1: Radiogroup1.ItemIndex:=1;
  
  2: Radiogroup1.ItemIndex:=2;
  
  3: Radiogroup1.ItemIndex:=3;
  
  end;
  
  case Option2 of
  
  0: Radiogroup2.ItemIndex:=0;
  
  1: Radiogroup2.ItemIndex:=1;
  
  2: Radiogroup2.ItemIndex:=2;
  
  3: Radiogroup2.ItemIndex:=3;
  
  end;
  
  end;
  
  end;
  
  TForm1.CancelClick代碼://關(guān)閉Form1,返回控制面板
  
  procedure TForm1.CancelClick(Sender: TObject);
  
  begin
  
  close;
  
  end;
  
  TForm1.ApplyClick代碼://設(shè)置注冊表鍵值
  
  procedure TForm1.ApplyClick(Sender: TObject);
  
  begin
  
  with Form1 do begin
  
  Option1:=Radiogroup1.ItemIndex;
  
  Option2:=Radiogroup2.ItemIndex;
  
  end;
  
  RegSetValueEx(KeyHandle,'WinA', 0, REG_BINARY, @Option1, SizeOf(Option1));
  
  RegSetValueEx(KeyHandle,'WinB', 0, REG_BINARY, @Option2, SizeOf(Option2));
  
  end;
  
  TForm1.FormClose代碼://關(guān)閉注冊表
  
  procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  
  begin
  
  RegCloseKey(KeyHandle);
  
  end;
  
 、苄薷腜roject1代碼如下:
  
  library Project1;
  
  uses
  
  Cpl,
  
  Windows,
  
  Forms,
  
  Unit1 in 'Unit1.pas' {Form1},
  
  Unit2 in 'Unit2.pas' {Form2};
  
  {$R *.RES}
  
  procedure ExecuteApp;
  
  {$E dll}
  
  begin
  
  Application.Initialize;
  
  Application.CreateForm(TForm1, Form1);
  
  Application.Run;
  
  end;
  
  procedure ExecuteApp2;
  
  {$E dll}
  
  begin
  
  Application.Initialize;
  
  Application.CreateForm(TForm2, Form2);
  
  Application.Run;
  
  end;
  
  function CPlApplet(hwndCPl: THandle; uMsg: DWORD;
  
  lParam1, lParam2: LongInt):LongInt;stdcall;
  
  var
  
  NewCplInfo:PNewCplInfo;
  
  begin
  
  Result:=0;
  
  case uMsg of
  
  CPL_INIT:
  
  Result:=1;
  
  CPL_GETCOUNT:
  
  Result:=2;
  
  CPL_NEWINQUIRE:
  
  begin
  
  NewCplInfo:=PNewCplInfo(lParam2);
  
  with NewCplInfo^ do
  
  begin
  
  dwSize:=SizeOf(TNewCplInfo);
  
  dwFlags:=0;
  
  dwHelpContext:=0;
  
  lData:=0;
  
  if lParam1=0 then
  
  begin
  
  szName:=‘新的控制面板組件';
  
  hIcon:=LoadIcon(HInstance,'ICON’);
  
  szInfo:=‘這是一個嘗試';
  
  end
  
  else
  
  begin
  
  szName:=’新的控制面板組件2';
  
  hIcon:=LoadIcon(HInstance,'ICON2‘);
  
  szInfo:=’這是一個嘗試2';
  
  end;
  
  szHelpFile:='';
  
  end;
  
  end;
  
  CPL_DBLCLK:
  
  begin
  
  if lParam1=0 then
  
  ExecuteApp
  
  else
  
  ExecuteApp2;
  
  end;
  
  else Result:=0;
  
  end;
  
  end;
  
  exports
  
  CPlApplet;
  
  begin
  
  end.
  
 、葸x取菜單Project桹ptions桝pplication,在Target file extension中輸入:DLL.在Load Icon中選擇DLL圖標。
  
  ⑥選取菜單Run桺arameters,在Host application中選擇一主程序。例如:D:\PROGRAM FILES\BORLAND\DELPHI3\HELP\TOOLS\HCW.EXE.
  
  ⑦按F9運行程序,生成Project1.dll.
  
 、鄬roject1.dll改名為Project1.cpl,存入C:\WINDOWS\SYSTEM\目錄下;蛘撸贑ONTROL.INI的[MMCPL]中添加:
  
  uniqueName=D:\PROJECT1.DLL(具體視DLL所在路徑而定)
  
 、釂涌刂泼姘,可以看到③中指定的圖標(一個或多個)已出現(xiàn)在控制面板中,鼠標雙擊圖標,彈出相應的Form1、Form2……
  
  說明:
  
  編程時也可將有關(guān)參數(shù)存放在某一INI文件中,操作方法不再贅述。
  
  其它應用程序可通過操作INI文件或Windows注冊表得到所需參數(shù)。
  
  ◆本文所述編寫DLL方法同樣適用于VC、BC、C++Builder等開發(fā)工具,但應注意語法、變量、函數(shù)原型等不同要求。
  
  以上程序在Delphi3.0/4.0、簡體中文Windows 95/NT/98環(huán)境中調(diào)試通過。
  
  一九九九年五月十日
  
  作者通信地址:(230031)安徽省合肥市炮兵學院研究生系97級 張建軍(收)
  
  作者電話: 0551-5560324(張建軍宿舍)
  
  0551-5562566轉(zhuǎn)68750、68210(研究生系值班室)
  
  作者Email: **

【利用Delphi編寫Windows控制面板組件及實例】相關(guān)文章:

利用Delphi全面控制Windows任務欄08-06

在Delphi中巧用Windows 的API函數(shù)08-06

利用TDC組件實現(xiàn)對WEB頁面的交互操作08-06

利用Delphi 3.0開發(fā)微機數(shù)據(jù)采集與處理軟件系統(tǒng)04-12

Delphi拖放編程08-06

硬件密碼組件與軟件密碼組件的比較研究08-06

DELPHI報表的動態(tài)生成08-06

利用注冊表對WINDOWS 98進行管理與維護08-06

利用C Builder自定義Windows窗體“系統(tǒng)菜單”08-09