玩轉(zhuǎn)Windows桌面圖標(biāo)
發(fā)表時間:2023-07-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]大家一定和我一樣對Windows的桌面十分不滿意吧。那就拿起手術(shù)刀(Delphi)給它動動手術(shù)。 首先要對付的是桌面圖標(biāo)那一個個難看的、帶有背景色的文字,不僅看上去別扭,還遮住了漂亮的墻紙,一定要去...
大家一定和我一樣對Windows的桌面十分不滿意吧。那就拿起手術(shù)刀(Delphi)給它動動手術(shù)。
首先要對付的是桌面圖標(biāo)那一個個難看的、帶有背景色的文字,不僅看上去別扭,還遮住了漂亮的墻紙,一定要去掉它,把它變成透明。其次就是圖標(biāo)的位置,只會傻傻地呆在屏幕的左邊,還得我們一個個去拖,真累!給它來點新花樣,Please Follow Me!
1、 新建一工程,在 uses 中加入 CommCtrl 單元,窗體上加一個按鈕;
2、 聲明一個取得桌面句柄的函數(shù):
function TForm1.GetDesktopHand: THandle;
begin
Result:=FindWindow('progman',nil);
Result:=GetWindow(Result,GW_Child);
Result:=GetWindow(Result,GW_Child);
end;
3、 聲明一個設(shè)置圖標(biāo)文字顏色的過程:
procedure TForm1.SetTextColor(ForeClr, BackClr: TColor);
var Hand: THandle;
begin
Hand:= GetDesktopHand;
Listview_SetTextColor(Hand,ForeClr); // 設(shè)置文字前景色;
Listview_SetTextBkColor(Hand,BackClr); // 設(shè)置文字背景色,crNone 為透明;
Listview_RedrawItems(Hand,0,Listview_GetItemCount(Hand)); // 重畫;
end;
有了上面的兩個方法,你已經(jīng)可以對桌面動小手術(shù)了。下面介紹圖標(biāo)的排列方式。
4、 以屏幕的中心為圓點作圓形排列:
procedure TForm1.Circle(r: integer); // 形參 r 為半徑;
var
i, Count, CenterX, CenterY, TempR :integer;
Hand: THandle;
Radian: double;
TempRect: TRect;
DesktopHeight,DesktopWidth :integer;
X, Y : Word;
begin
Hand:=GetDesktopHand;
SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作區(qū)域;
DesktopWidth:=TempRect.Right - TempRect.Left; // 工作區(qū)的寬(即屏幕的寬);
DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作區(qū)的高(即屏幕的高);
CenterX:=DesktopWidth div 2; // 取得圓心 X 坐標(biāo);
CenterY:=DesktopHeight div 2; // 圓心 Y 坐標(biāo);
if CenterX>CenterY then
TempR:=CenterY
else
TempR:=CenterX;
if r>TempR then r:=TempR; // 半徑不能超過屏幕中心點到四邊的最短距離;
Count:=Listview_GetItemCount(Hand); // 桌面上圖標(biāo)個數(shù);
Radian:=2*3.14159/Count; // 相鄰圖標(biāo)間的弧度; for i:=0 to Count-1 do
begin
// 第一個圖標(biāo)排在正上方;
X:=Integer(CenterX+Trunc(r*Sin(i*Radian))); // 圖標(biāo)的X坐標(biāo);
Y:=Integer(CenterY+Trunc(r*Cos(i*Radian))); // 圖標(biāo)的Y坐標(biāo);
SendMessage(Hand,LVM_SetItemPosition,i,MakeLparam(X, y)); // 設(shè)置坐標(biāo);
end;
end;
5、 圖標(biāo)右對齊:
procedure AlignRight(Rec: Integer); // 形參 Rec 為一個圖標(biāo)所占區(qū)域大小,一般為77;
var Hand: THandle;
h, I, j, DesktopHight, DesktopWidth :integer;
TempRect : TRect;
Begin
Hand:=GetDesktopHand;
SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作區(qū)域;
DesktopWidth:=TempRect.Right - TempRect.Left; // 工作區(qū)的寬(即屏幕的寬);
DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作區(qū)的高(即屏幕的高);
I:=0; // 圖標(biāo)所排的列數(shù)
J:=0;
For h:=0 to Listview_GetItemCount(Hand)-1 do
Begin
Inc(j);
If j*rec>DesktopHeight then // 排完一列;
Begin
Inc(i); // 換列
J:=1;
End;
SendMessage(Hand,LVM_SetItemPosition,h,
MakeLparam(DesktopWidth-Rec*(I+1),Rec*(j-1));
End; // for 循環(huán)結(jié)束;
End;
6、 在按鈕的單擊事件中加入代碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
SetTextColor(clBlack,crNone); // 設(shè)置圖標(biāo)文字顏色;
Circle(200); // 把圖標(biāo)排列成半徑為200的圓;
// AlignRight(77); // 右對齊;
end;
編譯運行,單擊按鈕。哇塞!太棒了!你還可發(fā)揮你的想象力,對程序稍加改進,把圖標(biāo)排成蛇形、橢圓形、環(huán)形等等。以上程序在 Win98+Delphi5下運行通過。