精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>图形界面和窗体>>使程序的窗口充满整个屏幕及使桌面图标的标题为透明背景

主题:使程序的窗口充满整个屏幕及使桌面图标的标题为透明背景
发信人: 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] 

[关闭][返回]