国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

控制面板的編程

2019-11-18 18:43:56
字體:
供稿:網(wǎng)友
 

大家應(yīng)該都非常熟悉控制面板吧,大家也都有操作過控制面板吧,但如何使用Delphi對控制面板進(jìn)行編程呢?
一、控制面板的原理
下面我就來講講控制面板的原理:控制面板在windows中的system目錄下,其中所有以CPL為擴(kuò)展名的,就都是我們的控制面板。要想對控制面板進(jìn)行編程,就要對CPlApplet這個(gè)函數(shù)非常熟悉,它是構(gòu)成CPL文件的核心,原型如下:
function CPlAPPTet(
hwndCPL:HWND;
uMsg:UINT;
lParam1:LPARAM;
lParam2:LPARAM
):LongInt;stdcall;
參數(shù)說明:
hwndCPL:激活控制面板組件的應(yīng)用程序窗口handle。
uMsg:由外界傳入的控制消息。
lParam1:根據(jù)消息種類而定的參數(shù)1。
lParam2:根據(jù)消息種類而定的參數(shù)2。
返回值:根據(jù)消息種類而定。
當(dāng)我們想編程激活某個(gè)CPL文件時(shí),就會(huì)加載此CPL文件,取得CPlApplet函數(shù)地址然后調(diào)用它。而CPlApplet函數(shù)的任務(wù)是,根據(jù)uMsg消息參數(shù)得知外界的請求并做出適當(dāng)響應(yīng)。可以傳入的消息種類如下表所示:
 
CPL_INIT CPL文件加載后 供CPL文件有機(jī)會(huì)進(jìn)行各控制面板組件的數(shù)據(jù)結(jié)構(gòu)、變量及配置內(nèi)存等初始化及前置工作
CPL_GETCOUNT 緊接在CPL_INIT消息后 取得CPL文件提供的控制面板組件數(shù)目
CPL_INQUIRE 緊接在CPL_GETCOUNT消息后 取得個(gè)別控制面板的信息
CPL_NEWINQUIRE 緊接在CPL_INQUIRE消息后 取得個(gè)別控制面板的信息,作用與消息CPL_INQUIRE相同,但應(yīng)用場合不同,組件通常只須選擇二者之一支持即可
CPL_DBLCLK 激活個(gè)別組件前 激活某一控制面板組件,通常的響應(yīng)都是顯示Modal對話框供用戶設(shè)置
CPL_STOP 激活個(gè)別組件后 激活中的控制面板組件關(guān)閉后,控制面板程序會(huì)送出此消息進(jìn)行個(gè)別組件的善后工作
CPL_EXIT 釋放CPL文件前 控制面板程序要釋放此CPL文件前會(huì)送出此消息,提供資源釋放或其它善后工作的機(jī)會(huì)
二、CPlApplet函數(shù)的詳解
現(xiàn)在我就來講講,以上列表中各個(gè)消息的詳細(xì)作用:
1、CPL_INIT:lParam1、lParam2:均未使用。返回值:成功返回非零值;失敗返回零。
CPL程序第一個(gè)收到的消息一定是CPL_INIT,這時(shí)我們可以利用此機(jī)會(huì)初始化所有控制面板組件共享的數(shù)據(jù)結(jié)構(gòu)及變量。若初始化失敗,返回零,這會(huì)使得控制面板不繼續(xù)傳送其它消息給此CPL文件,而這個(gè)CPL包含的控制面板的組件就不會(huì)出現(xiàn)在控制面板內(nèi)。
2、CPL_GETCOUNT:lParam1、lParam2:均未使用。返回值:返回此CPL文件所支持的控制面板組件數(shù)目。
繼CPL_INIT消息后,緊接著會(huì)收到CPL_GETCOUNT消息,此時(shí)必須返回CPL文件所支持的控制面板組件數(shù)目。
3、CPL_INQUIRE:lParam1:組件編號(hào),值為0~(CPL_GETCOUNT返回?cái)?shù)目-1)。lParam2:指向TCPLInfo結(jié)構(gòu)的指針。返回值:成功返回零,失敗返回非零。
CPL_INQUIRE是編程中最重要的消息,控制面板就是利用這個(gè)消息來取得每個(gè)組件的確良名稱、描述及圖標(biāo)。參數(shù)一傳入組件編號(hào),我們必須根據(jù)組件編號(hào)將對應(yīng)的組件信息填入?yún)?shù)2指向的TCPLInfo結(jié)構(gòu)中。
TCPLInfo結(jié)構(gòu)定義如下:
TCPLInfo=pccked record
idIcon:integer;//指向組件圖標(biāo)
idName:integer;//指向組件名稱
idInfo:integer;//指向組件描述CPL_DBLCLKCPL_STOP
lData:Longint;//用戶自定義參數(shù)
end;
idIcon、idName、idInfo這三個(gè)字段是存放組件圖標(biāo)、名稱、描述的,我們要調(diào)用LoadString及LoadIcon API函數(shù),從CPL文件中取得實(shí)際字符串及圖標(biāo)的。
lData字段的類型為Longint,長度為4個(gè)字節(jié)的無符號(hào)整數(shù),不過也可改為指針變量來使用,lData中的值會(huì)在控制面板程序下次傳送CPL_DBLCLK、CPL_STOP消息時(shí)由lParam2參數(shù)返回供組件使用,你可以自由決定它的功能。
4、CPL_NEWINQUIRE:lParam1:組件編號(hào),值為0~(CPL_GETCOUNT返回?cái)?shù)目-1)。lParam2:指向TNewCPLInfo結(jié)構(gòu)的指針。返回值:成功返回零,失敗返回非零。TNewCPLInfo結(jié)構(gòu)比TCPLInfo結(jié)構(gòu)稍微復(fù)雜,定義如下:
TNewCPLInfo=pccked record
dwSize:DWord;//結(jié)構(gòu)占用長度
dwFlags:DWORD;//目前未使用
dwHelpContext:DWORD;//說明頁編號(hào),目前未使用
lData:Longint;//用戶自定義參數(shù)
hIcon:HICON;//組件圖示
szName:array[0..31] of char;//組件名稱
szInfo:array[0..63] of char;

szHelpFile:array[0..127] of char;//說明文件名,目前未使用
end;
szName、szInfo 、hIcon、lData這4個(gè)字段與上一個(gè)CPLInfo結(jié)構(gòu)中對應(yīng)的4個(gè)字段作用完全相同,只不過szName、szInfo 、hIcon字段變成為字符串及HICN類型了。這使得CPL程序可以動(dòng)態(tài)地根據(jù)情況來產(chǎn)生及返回組件的名稱、描述及圖標(biāo)。
5、CPL_DBLCLK:lParam1:組件編號(hào),值為0~(CPL_GETCOUNT返回?cái)?shù)目-1)。lParam2:指向TCPLInfo或TNewCPLInfo結(jié)構(gòu)的返回的lData字段值。返回值:成功返回零,失敗返回非零。
當(dāng)我們雙擊控制面板中的組件圖標(biāo)時(shí),就會(huì)觸發(fā)CPL_DBLCLK消息。這個(gè)就是我們用來打開控制面板,打開相應(yīng)的對話框,然后來設(shè)置用的。
6、CPL_STOP:lParam1:組件編號(hào),值為0~(CPL_GETCOUNT返回?cái)?shù)目-1)。lParam2:指向TCPLInfo或TNewCPLInfo結(jié)構(gòu)的返回的lData字段值。返回值:成功返回零,失敗返回非零。
這個(gè)消息提供機(jī)會(huì)讓個(gè)別組件進(jìn)行善后工作,例如釋放GDI或核心對象等等。如果一切無誤,返回零。
7、CPL_EXIT:lParam1、lParam2:均未使用。返回值:成功返回零;失敗返回非零值。就是退出啦。
好了,關(guān)于控制面板的研究,到此就告一段落了,若想對它進(jìn)行深入的編程,可轉(zhuǎn)入到實(shí)例中進(jìn)行練習(xí)練習(xí)。三、我的控制面板的制作
大家一定用過Windows優(yōu)化大師吧,它里面有個(gè)控制面板,可以把我們電腦里的控制面板都顯示出來,我們經(jīng)過了前面的學(xué)習(xí),是否可以也編一個(gè)類似的程序呢?回答是肯定的。下面我們就來編個(gè)看看吧!
經(jīng)過我們觀察,決定用TlistView控件 。
為了美觀,TlistView控件做如下設(shè)置:Checkboxes設(shè)為True;Columnclick設(shè)為False;FlatScrollBar設(shè)為True;SortType設(shè)為stText;ViewStyle設(shè)為vsReport;單擊Columns,加上三個(gè)數(shù)值:項(xiàng)目名稱、項(xiàng)目說明、項(xiàng)目作用。在USES中加入聲明:CPL。
編程代碼:
PRocedure TForm1.FormCreate(Sender: TObject);
procedure newview(ANode: TListItem);
var
hLib : THandle;
CPLProc : TCPLApplet;//指向 CPlApplet 函數(shù)的指針
iCount, I : Integer; // 用來取得控制面板的結(jié)構(gòu)
cplInfo : TCPLInfo;

// 記錄元件的名稱、描述及圖標(biāo)
sName, sInfo: array[0..255] of char;
hAppIcon : hIcon;
begin

hLib := LoadLibrary(PChar(ANode.Caption));
if hLib = 0 then
begin
ANode.SubItems.Add(' - 無法加載!!');
Exit;
end;
try

CPLProc := TCPLApplet(GetProcAddress(hLib, 'CPlApplet'));
if @CPLProc = nil then Exit;
if CPLProc(Handle, CPL_INIT, 0, 0) = 0 then Exit;

iCount := CPLProc(Handle, CPL_GETCOUNT, 0, 0);
for I := 0 to iCount - 1 do
begin

FillChar(cplInfo, sizeof(TCPLInfo), 0);
CPLProc(Handle, CPL_INQUIRE, I, LongInt(@cplInfo));

LoadString(hLib, cplInfo.idName, @sName, 255);
LoadString(hLib, cplInfo.idInfo, @sInfo, 255);
hAppIcon := LoadIcon(hLib,MAKEINTRESOURCE(cplInfo.idIcon));

ANode.SubItems.Add(sName);
ANode.SubItems.Add(sInfo);

end;
CPLProc(Handle, CPL_EXIT, 0, 0);
finally
FreeLibrary(hLib);

end;
end;
var
sSysdir:array[0..255] of char;
SearchRec:TSearchRec;
J: Integer;
NewItem: TListItem;
begin
GetsystemDirectory(sSysdir,255);//取得系統(tǒng)目錄
J:=FindFirst(sSysdir+'/*.cpl',faAnyFile,SearchRec);//開始尋找系統(tǒng)目錄下的CPL文件
while J=0 do
begin

NewItem:=ListView1.Items.add;
NewItem.caption:=AnsiLowerCase(searchRec.name);
NewView(NewItem);//調(diào)用自定義函數(shù)NewView
J:=FindNext(searchRec);//尋找下一個(gè)CPL文件
end;
FindClose(searchRec);
end;
若想雙擊進(jìn)行運(yùn)行選中的控制面板,代碼如下:
procedure TForm1.ListView1DblClick(Sender: TObject);
var
hLib : THandle;
CPLProc: TCPLApplet;
NewItem: TListItem;
cplInfo: TCPLInfo;

begin
NewItem:=ListView1.Selected;
if (not Assigned(NewItem)) then Exit;
hLib := LoadLibrary(PChar(NewItem.Caption));//加載CPL文件, CPL文件名就是項(xiàng)目名

if hLib = 0 then
begin
MessageDlg('無法運(yùn)行' + NewItem.Caption,
mtError,[mbOK], 0);
Exit;
end;

CPLProc := TCPLApplet(GetProcAddress(hLib, 'CPlApplet'));
if @CPLProc <> nil then
begin
CPLProc(Handle, CPL_INIT, 0, 0);//運(yùn)行面板
FillChar(cplInfo, sizeof(TCPLInfo), 0);
CPLProc(Handle, CPL_INQUIRE, NewItem.Index, LongInt(@cplInfo));
CPLProc(Handle, CPL_DBLCLK, NewItem.Index, cplInfo.lData);
CPLProc(Handle, CPL_STOP, NewItem.Index, cplInfo.lData);
CPLProc(Handle, CPL_EXIT, 0, 0);
end;
FreeLibrary(hLib);//釋放CPL文件
end;
好了,編程完畢。程序在Windows98+Delphi5下調(diào)試通過。
如果大家不想麻煩編寫這么多代碼的話,可以寫信向本人索取源代碼,我的E-Mail:bomin@163.com


上一篇:淺析桌面精靈的實(shí)現(xiàn)

下一篇:一個(gè)可以靠右顯示的簡單Edit控件

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 林甸县| 沙雅县| 和林格尔县| 比如县| 平昌县| 建瓯市| 宁强县| 威海市| 衡南县| 腾冲县| 大庆市| 南平市| 芦溪县| 定日县| 马关县| 长兴县| 赤城县| 射阳县| 通榆县| 赤峰市| 工布江达县| 桦南县| 卢龙县| 东安县| 海淀区| 江陵县| 台南市| 甘南县| 龙门县| 凉城县| 禹城市| 乐山市| 安康市| 绥德县| 金沙县| 临清市| 巴南区| 塔河县| 洪江市| 双牌县| 清涧县|