发信人: daji(妲姬) 
整理人: teleme(2001-04-27 09:17:09), 站内信件
 | 
 
 
一般而言,窗口最大化不能覆盖任务栏,下面的方法可以突破这个限制。 
 
 为完成这项工作需要处理 WM_SETTINGCHANGE 消息,并使用 SystemParametersInfo(...) WinAPI 函数。
 
 TfmMyForm=class(TForm) 
   procedure FormCreate(Sender: TObject); 
   ............. 
 private 
   ...... 
   procedure WMSettingChange( var Msg: TMessage); message WM_SETTINGCHANGE; 
   ........... 
 protected 
   ........ 
 end; 
 
 implementation 
 
 // returns available work area 
 function GetWindowsWorkArea: TRect; 
 begin 
   SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0); 
 end; 
 
 .......... 
 //respond to any change of work area dimensions during runtime... 
 procedure TfmMyForm.WMSettingChange( var Msg: TMessage); 
 var 
   R: TRect; 
 begin 
   if (Msg.WParam=SPI_SETWORKAREA) then 
   begin 
     R:=GetWindowsWorkArea; 
     SetBounds(R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top); 
   end; 
   Msg.Result:=0; 
 end; 
 
 //in an OnFormCreate event get available work area, 
 //because your form won't get WM_SETTINGCHANGE at startup... 
 procedure TfmMyForm.FormCreate(Sender: TObject); 
 var 
   R: TRect; 
 begin 
   R:=GetWindowsWorkArea; 
   SetBounds(R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top); 
 end; 
 
 //*************************************************
 使桌面图标的标题为透明背景
 Windows的桌面属性对话框并没有使桌面图标标题为透明的选项,使得在使用墙纸时总有一块 
 为背景色的区域,下面是使其为透明的代码。 
 
 首先,找到包括图标的窗口,即桌面的句柄。 
 
 uses Windows;  
 function GetDesktopIconWindow: HWND;  
 begin  
   Result := FindWindow(PChar('Progman'), PChar('Program Manager'));  
   Result := FindWindowEx(Result, 0, PChar('SHELLDLL_DefView'), nil);  
   Result := FindWindowEx(Result, 0, PChar('SysListView32'), nil);  
 end;  
 
 然后,实现透明效果: 
 
 uses Windows, CommCtrl;  
 procedure SetDesktopIconTransparent;  
 var  
   Desktop : HWND;  
 begin  
   Desktop := GetDesktopIconWindow;  
   ListView_SetTextBkColor(Desktop, MAXDWORD);  
   ListView_RedrawItems(Desktop, 0, Pred(ListView_GetItemCount(Desktop)));  
   UpdateWindow(Desktop);  
 end;  
 
 BTW,还可以设置图标标题文字和背景的颜色。 
 
 uses Windows, CommCtrl, Graphics; 
 procedure SetDesktopIconColors(const FColor, BColor: TColor);  
 var  
   Desktop : HWND;  
 begin  
   Desktop := GetDesktopIconWindow;  
   ListView_SetTextColor(Desktop, FColor);  
   ListView_SetTextBkColor(Desktop, BColor);  
   ListView_RedrawItems(Desktop, 0, Pred(ListView_GetItemCount(Desktop)));  
   UpdateWindow(Desktop);  
 end;  
 
 其中 FColor 是前景色,BColor 是背景色。 
 
 最后,是恢复原来的样子。 
 
 uses Windows;  
 procedure ResetDesktopIconColors;  
 var  
   Kind, Color : Integer;  
 begin  
   Kind := COLOR_DESKTOP;  
   Color := GetSysColor(COLOR_DESKTOP);  
   SetSysColors(1, Kind, Color);  
 end;  
 
 
 
 ----
                 ^^                                    `_ , 
  ^^           |    |    |      Hello,                -(_)- 
       ^^     )_)  )_)  )_)         My Friends!        ,  ` 
 姬海涵      )___))___))___)\                  , 
            )____)____)_____)\\              __)\_ 
 妲姬网苑 _____|____|____|____\\\__    (\_.-'    a`-. 
 ---------\                   /--------(/~~````(/~^^`-------- 
   ^^^^^ ^^^^^^^^^^^^^^^^^^^^^         http://daji.xoasis.com 
     ^^^^      ^^^^     ^^^    ^^      [email protected] 
  | 
 
 
 |