桌面(desktop)操作的问题 HWND hWnd=GetDesktopWindow(VOID)HDC hDc=GetDC(hWnd)SelectObject( HDC hdc,HGDIOBJ hgdiobj // handle to object)BitBlt() 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我突然在想,把那个 ListView 弄过来 subClass 一下,是不是会比较过瘾啊?~~~想想而已,我也没有做过啊... 还有活动桌面IActiveDesktop 接口方法表 方法 功能和用途 AddDesktopItem 添加一个桌面项。 AddDesktopItemWithUI 使用某个用户界面添加一个桌面项到活动桌面。 AddUrl 添加与指定的URL关联的桌面项。 ApplyChange 执行对活动桌面的修改。要使修改生效必须调用这个函数。用于激活或取消活动桌面。 GenerateDesktopItemHtml 产生包含给定桌面项的通用HTML页面。 GetDesktopItem 获得指定的桌面项。 GetDesktopItemByID 获得与给定ID匹配的桌面项。 GetDesktopItemBySource 用源URL获得某个桌面项。 GetDesktopItemCount 或的桌面项计数。 GetDesktopItemOptions 检查活动桌面是否打开或关闭。SHGetSettings 性能更佳。用于激活或取消活动桌面。 GetPattern 获取当前使用的式样。 GetWallpaper 获取当前使用的墙纸。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。 GetWallpaperOptions 获得墙纸选项。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。 ModifyDesktopItem 修改桌面项。 RemoveDesktopItem 从桌面删除指定的桌面项。 SetDesktopItemOptions 打开或关闭活动桌面。 SetPattern 设置活动桌面式样。 SetWallpaper 设置活动桌面墙纸。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。 SetWallpaperOptions 设置墙纸选项。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。 欢迎大家讨论,欢迎捧场 贴一个玩转Windows桌面图标 大家一定和我一样对Windows的桌面十分不满意吧。那就拿起手术刀(Delphi)给它动动手术。 首先要对付的是桌面图标那一个个难看的、带有背景色的文字,不仅看上去别扭,还遮住了漂亮的墙纸,一定要去掉它,把它变成透明。其次就是图标的位置,只会傻傻地呆在屏幕的左边,还得我们一个个去拖,真累!给它来点新花样,Please Follow Me!1、 新建一工程,在 uses 中加入 CommCtrl 单元,窗体上加一个按钮;2、 声明一个取得桌面句柄的函数:function TForm1.GetDesktopHand: THandle;beginResult:=FindWindow('progman',nil);Result:=GetWindow(Result,GW_Child);Result:=GetWindow(Result,GW_Child);end; 3、 声明一个设置图标文字颜色的过程:procedure TForm1.SetTextColor(ForeClr, BackClr: TColor);var Hand: THandle;beginHand:= GetDesktopHand;Listview_SetTextColor(Hand,ForeClr); // 设置文字前景色;Listview_SetTextBkColor(Hand,BackClr); // 设置文字背景色,crNone 为透明;Listview_RedrawItems(Hand,0,Listview_GetItemCount(Hand)); // 重画;end; 有了上面的两个方法,你已经可以对桌面动小手术了。下面介绍图标的排列方式。 4、 以屏幕的中心为圆点作圆形排列:procedure TForm1.Circle(r: integer); // 形参 r 为半径;vari, Count, CenterX, CenterY, TempR :integer;Hand: THandle;Radian: double;TempRect: TRect;DesktopHeight,DesktopWidth :integer;X, Y : Word;beginHand:=GetDesktopHand;SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作区域;DesktopWidth:=TempRect.Right - TempRect.Left; // 工作区的宽(即屏幕的宽);DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作区的高(即屏幕的高);CenterX:=DesktopWidth div 2; // 取得圆心 X 坐标;CenterY:=DesktopHeight div 2; // 圆心 Y 坐标;if CenterX>CenterY thenTempR:=CenterYelseTempR:=CenterX; if r>TempR then r:=TempR; // 半径不能超过屏幕中心点到四边的最短距离;Count:=Listview_GetItemCount(Hand); // 桌面上图标个数;Radian:=2*3.14159/Count; // 相邻图标间的弧度; for i:=0 to Count-1 dobegin// 第一个图标排在正上方;X:=Integer(CenterX+Trunc(r*Sin(i*Radian))); // 图标的X坐标; Y:=Integer(CenterY+Trunc(r*Cos(i*Radian))); // 图标的Y坐标;SendMessage(Hand,LVM_SetItemPosition,i,MakeLparam(X, y)); // 设置坐标;end;end; 5、 图标右对齐:procedure AlignRight(Rec: Integer); // 形参 Rec 为一个图标所占区域大小,一般为77;var Hand: THandle;h, I, j, DesktopHight, DesktopWidth :integer;TempRect : TRect;BeginHand:=GetDesktopHand;SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作区域;DesktopWidth:=TempRect.Right - TempRect.Left; // 工作区的宽(即屏幕的宽);DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作区的高(即屏幕的高);I:=0; // 图标所排的列数J:=0; For h:=0 to Listview_GetItemCount(Hand)-1 doBeginInc(j);If j*rec>DesktopHeight then // 排完一列;BeginInc(i); // 换列J:=1;End;SendMessage(Hand,LVM_SetItemPosition,h,MakeLparam(DesktopWidth-Rec*(I+1),Rec*(j-1));End; // for 循环结束;End; 6、 在按钮的单击事件中加入代码:procedure TForm1.Button1Click(Sender: TObject);beginSetTextColor(clBlack,crNone); // 设置图标文字颜色;Circle(200); // 把图标排列成半径为200的圆;// AlignRight(77); // 右对齐;end; 编译运行,单击按钮。哇塞!太棒了!你还可发挥你的想象力,对程序稍加改进,把图标排成蛇形、椭圆形、环形等等。以上程序在 Win98+Delphi5下运行通过。 /********这里是图标的改动,如果我想将ico换成gif动化呢?谁有好的建议?**************/ go on 没人参与呀!快来人呀! 把 ListView 中图标的链接信息记录下来然后清掉图标,在其中添加若干个显示gif的子窗口,摆到相应的位置上,监测鼠标点击事件...我看你干脆把 ListView 的窗口过程给截了算了,他提供的 API 不足以完成这样的灵活性 Combo Box不能显示前一次的选择值 有两个问题,第一个关于GIF,第二个关于移动控件 招聘C++/VC专、兼职培训教师,感兴趣者请进-- 有关DC的疑问 rc文件中对菜单名称的修改无效 高分求助:有没有查看dll文件输出函数的详细信息的工具? 求自动控制方面的故障诊断程序 MAKEINTRESOURCE为什么要把一个数字转换成指针? 这里没有高手吗?请高手现身帮忙解答困扰多时的问题-关于硬件厂家提供API函数问题 如何用发送消息的方法(SendMessage())来让toolbar上的按钮,按下? 请问如何用标准C++设置小数点对齐? 如何在程序中显示odbc配置dsn的对话框?
想想而已,我也没有做过啊...
IActiveDesktop 接口方法表
方法 功能和用途
AddDesktopItem 添加一个桌面项。
AddDesktopItemWithUI 使用某个用户界面添加一个桌面项到活动桌面。
AddUrl 添加与指定的URL关联的桌面项。
ApplyChange 执行对活动桌面的修改。要使修改生效必须调用这个函数。用于激活或取消活动桌面。
GenerateDesktopItemHtml 产生包含给定桌面项的通用HTML页面。
GetDesktopItem 获得指定的桌面项。
GetDesktopItemByID 获得与给定ID匹配的桌面项。
GetDesktopItemBySource 用源URL获得某个桌面项。
GetDesktopItemCount 或的桌面项计数。
GetDesktopItemOptions 检查活动桌面是否打开或关闭。SHGetSettings 性能更佳。用于激活或取消活动桌面。
GetPattern 获取当前使用的式样。
GetWallpaper 获取当前使用的墙纸。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。
GetWallpaperOptions 获得墙纸选项。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。
ModifyDesktopItem 修改桌面项。
RemoveDesktopItem 从桌面删除指定的桌面项。
SetDesktopItemOptions 打开或关闭活动桌面。
SetPattern 设置活动桌面式样。
SetWallpaper 设置活动桌面墙纸。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。
SetWallpaperOptions 设置墙纸选项。仅用于活动桌面。标准模式时(桌面关闭),使用SystemParametersInfo。
欢迎大家讨论,欢迎捧场
玩转Windows桌面图标
大家一定和我一样对Windows的桌面十分不满意吧。那就拿起手术刀(Delphi)给它动动手术。
首先要对付的是桌面图标那一个个难看的、带有背景色的文字,不仅看上去别扭,还遮住了漂亮的墙纸,一定要去掉它,把它变成透明。其次就是图标的位置,只会傻傻地呆在屏幕的左边,还得我们一个个去拖,真累!给它来点新花样,Please Follow Me!1、 新建一工程,在 uses 中加入 CommCtrl 单元,窗体上加一个按钮;2、 声明一个取得桌面句柄的函数:function TForm1.GetDesktopHand: THandle;beginResult:=FindWindow('progman',nil);Result:=GetWindow(Result,GW_Child);Result:=GetWindow(Result,GW_Child);end;
3、 声明一个设置图标文字颜色的过程:procedure TForm1.SetTextColor(ForeClr, BackClr: TColor);var Hand: THandle;beginHand:= GetDesktopHand;Listview_SetTextColor(Hand,ForeClr); // 设置文字前景色;Listview_SetTextBkColor(Hand,BackClr); // 设置文字背景色,crNone 为透明;Listview_RedrawItems(Hand,0,Listview_GetItemCount(Hand)); // 重画;end; 有了上面的两个方法,你已经可以对桌面动小手术了。下面介绍图标的排列方式。
4、 以屏幕的中心为圆点作圆形排列:procedure TForm1.Circle(r: integer); // 形参 r 为半径;vari, Count, CenterX, CenterY, TempR :integer;Hand: THandle;Radian: double;TempRect: TRect;DesktopHeight,DesktopWidth :integer;X, Y : Word;beginHand:=GetDesktopHand;SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作区域;DesktopWidth:=TempRect.Right - TempRect.Left; // 工作区的宽(即屏幕的宽);DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作区的高(即屏幕的高);CenterX:=DesktopWidth div 2; // 取得圆心 X 坐标;CenterY:=DesktopHeight div 2; // 圆心 Y 坐标;if CenterX>CenterY thenTempR:=CenterYelseTempR:=CenterX; if r>TempR then r:=TempR; // 半径不能超过屏幕中心点到四边的最短距离;Count:=Listview_GetItemCount(Hand); // 桌面上图标个数;Radian:=2*3.14159/Count; // 相邻图标间的弧度; for i:=0 to Count-1 dobegin// 第一个图标排在正上方;X:=Integer(CenterX+Trunc(r*Sin(i*Radian))); // 图标的X坐标; Y:=Integer(CenterY+Trunc(r*Cos(i*Radian))); // 图标的Y坐标;SendMessage(Hand,LVM_SetItemPosition,i,MakeLparam(X, y)); // 设置坐标;end;end; 5、 图标右对齐:procedure AlignRight(Rec: Integer); // 形参 Rec 为一个图标所占区域大小,一般为77;var Hand: THandle;h, I, j, DesktopHight, DesktopWidth :integer;TempRect : TRect;BeginHand:=GetDesktopHand;SystemParametersInfo(SPI_GetWorkArea,0,@TempRect,0); // 取得工作区域;DesktopWidth:=TempRect.Right - TempRect.Left; // 工作区的宽(即屏幕的宽);DesktopHeight:= TempRect.Bottom - TempRect.Top; // 工作区的高(即屏幕的高);I:=0; // 图标所排的列数J:=0; For h:=0 to Listview_GetItemCount(Hand)-1 doBeginInc(j);If j*rec>DesktopHeight then // 排完一列;BeginInc(i); // 换列J:=1;End;SendMessage(Hand,LVM_SetItemPosition,h,MakeLparam(DesktopWidth-Rec*(I+1),Rec*(j-1));End; // for 循环结束;End; 6、 在按钮的单击事件中加入代码:procedure TForm1.Button1Click(Sender: TObject);beginSetTextColor(clBlack,crNone); // 设置图标文字颜色;Circle(200); // 把图标排列成半径为200的圆;// AlignRight(77); // 右对齐;end; 编译运行,单击按钮。哇塞!太棒了!你还可发挥你的想象力,对程序稍加改进,把图标排成蛇形、椭圆形、环形等等。以上程序在 Win98+Delphi5下运行通过。
/********这里是图标的改动,如果我想将ico换成gif动化呢?谁有好的建议?**************/
没人参与呀!快来人呀!
我看你干脆把 ListView 的窗口过程给截了算了,他提供的 API 不足以完成这样的灵活性