看看这文章你也许就明白了.<br><br>首先要对付的是桌面图标那一个个难看的、带有背景色的文字,不仅看上去别扭,还遮住了漂亮的墙纸,一定要去掉它,把它变成透明。其次就是图标的位置,只会傻傻地呆在屏幕的左边,还得我们一个个去拖,真累!给它来点新花样,Please Follow Me!<br><br>1、 新建一工程,在 uses 中加入 CommCtrl 单元,窗体上加一个按钮;<br><br>2、 声明一个取得桌面句柄的函数:<br><br>function TForm1.GetDesktopHand: THandle;<br><br>begin<br><br> Result:=FindWindow('progman',nil);<br><br> Result:=GetWindow(Result,GW_Child);<br><br> Result:=GetWindow(Result,GW_Child);<br><br>end;<br><br>3、 声明一个设置图标文字颜色的过程:<br><br>procedure TForm1.SetTextColor(ForeClr, BackClr: TColor);<br><br>var Hand: THandle;<br><br>begin<br><br> Hand:= GetDesktopHand;<br><br> Listview_SetTextColor(Hand,ForeClr); // 设置文字前景色;<br><br> Listview_SetTextBkColor(Hand,BackClr); // 设置文字背景色,crNone 为透明;<br><br> Listview_RedrawItems(Hand,0,Listview_GetItemCount(Hand)); // 重画;<br><br>end;<br><br> <br><br>有了上面的两个方法,你已经可以对桌面动小手术了。下面介绍图标的排列方式。<br><br> <br><br>4、 以屏幕的中心为圆点作圆形排列:<br><br>procedure TForm1.Circle(r: integer); // 形参 r 为半径;<br><br>var<br><br> i, Count, CenterX, CenterY, TempR :integer;<br><br> Hand: THandle;<br><br> Radian: double;<br><br> TempRect: TRect;<br><br> DesktopHeight,DesktopWidth :integer;<br><br> X, Y : Word;<br><br>begin<br><br> Hand:=GetDesktopHand;<br><br> SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作区域;<br><br> DesktopWidth:=TempRect.Right - TempRect.Left; // 工作区的宽(即屏幕的宽);<br><br> DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作区的高(即屏幕的高);<br><br> CenterX:=DesktopWidth div 2; // 取得圆心 X 坐标;<br><br> CenterY:=DesktopHeight div 2; // 圆心 Y 坐标;<br><br> if CenterX>CenterY then<br><br> TempR:=CenterY<br><br> else<br><br> TempR:=CenterX; <br><br> if r>TempR then r:=TempR; // 半径不能超过屏幕中心点到四边的最短距离;<br><br> Count:=Listview_GetItemCount(Hand); // 桌面上图标个数;<br><br> Radian:=2*3.14159/Count; // 相邻图标间的弧度;<br><br> for i:=0 to Count-1 do<br><br>begin<br><br> // 第一个图标排在正上方;<br><br> X:=Integer(CenterX+Trunc(r*Sin(i*Radian))); // 图标的X坐标; <br><br> Y:=Integer(CenterY+Trunc(r*Cos(i*Radian))); // 图标的Y坐标;<br><br> SendMessage(Hand,LVM_SetItemPosition,i,MakeLparam(X, y)); // 设置坐标;<br><br> end;<br><br>end;<br><br> <br><br>5、 图标右对齐:<br><br>procedure AlignRight(Rec: Integer); // 形参 Rec 为一个图标所占区域大小,一般为77;<br><br>var Hand: THandle;<br><br> h, I, j, DesktopHight, DesktopWidth :integer;<br><br> TempRect : TRect;<br><br>Begin<br><br>Hand:=GetDesktopHand;<br><br> SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作区域;<br><br> DesktopWidth:=TempRect.Right - TempRect.Left; // 工作区的宽(即屏幕的宽);<br><br> DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作区的高(即屏幕的高);<br><br> I:=0; // 图标所排的列数<br><br> J:=0; <br><br> For h:=0 to Listview_GetItemCount(Hand)-1 do<br><br>Begin<br><br> Inc(j);<br><br> If j*rec>DesktopHeight then // 排完一列;<br><br> Begin<br><br> Inc(i); // 换列<br><br> J:=1;<br><br> End;<br><br> SendMessage(Hand,LVM_SetItemPosition,h,<br><br>MakeLparam(DesktopWidth-Rec*(I+1),Rec*(j-1));<br><br>End; // for 循环结束;<br><br>End;<br><br> <br><br>6、 在按钮的单击事件中加入代码:<br><br>procedure TForm1.Button1Click(Sender: TObject);<br><br>begin<br><br> SetTextColor(clBlack,crNone); // 设置图标文字颜色;<br><br> Circle(200); // 把图标排列成半径为200的圆;<br><br> // AlignRight(77); // 右对齐;<br><br>end;<br><br> <br><br>编译运行,单击按钮。哇塞!太棒了!你还可发挥你的想象力,对程序稍加改进,把图标排成蛇形、椭圆形、环形等等。以上程序在 Win98+Delphi5下运行通过。<br>