程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 編程實現窗體的半透明效果

編程實現窗體的半透明效果

編輯:Delphi
如果你不是使用Windows2000+Delphi編程的話,我不想浪費你的時間。如果是,請繼續。
  大家都知道Windows 2000支持淡入淡出的窗體顯示效果。如何讓自己的應用程序也具備這種效果呢?前兩天研究FormContainer的Form顯示效果時(注:FormContainer是一個強大的Delphi特效處理控件,有興趣的朋友可以訪問http://www.billeniumsoft.com/),得高人告知,核心API函數就是SetLayeredWindowAttributes。
  要實現淡入淡出效果,就需要實現窗口的可調整的透明效果。傳統的Windows應用程序想實現透明效果,一般來說需要處理自己的窗口的WM_Paint消息,程序員需要GetDC獲取屏幕的HDC,調用BitBlt函數將屏幕將要被覆蓋的區域拷貝到內存的TBitmap對象中,然後對該Tbitmap的ScanLine二維數組逐象素的修改rgbtRed、rgbtGreen和rgbtBlue值。天哪,實在是太麻煩了。
  Windows2000的API庫中終於提供了半透明的窗體顯示效果支持(雖然不是很完善)。要實現半透明的窗口效果,首先需要給創建的窗口添加WS_EX_LAYERED 擴展屬性,這是一個新的窗口擴展屬性,Delphi5並沒有定義相應的常量和SetLayeredWindowAttributes函數,我們需要手工聲明。

function SetLayeredWindowAttributes(Handle: HWND;
  COLORKEY: COLORREF; Alpha: BYTE; Flags: DWord): Boolean; stdcall; external 'USER32.DLL';

Const
  WS_EX_LAYERED = $80000;
  LWA_ALPHA = 2;

  我們調用GetWindowLong函數獲取當前窗口的擴展屬性,並調用SetWindowLong函數將新的WS_EX_LAYERED窗口擴展屬性添加進去。

procedure TForm1.FormCreate(Sender: TObject);
  begin
  SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_LAYERED);
  end;

  現在我們的窗口已經可以調用SetLayeredWindowAttributes函數,通過設置該函數的Alpha參數,我們就可以看到窗口的效果的變化。

procedure TForm1.Button1Click(Sender: TObject);
  begin
  SetLayeredWindowAttributes(Form1.Handle, 0, 180, LWA_ALPHA);
  end;

  以下的VCL控件代碼封裝了SetLayeredWindowAttributes函數,編程時動態改變AlphaValue值,您就可以看到窗口的透明效果了。控件屏蔽了設計期的顯示效果,如果讀者願意可以改為設計期效果可見,不過那樣的話,一不小心,您可能就會找不著你要設計的窗體了 8-)

unit TranForm; {DragonPC 2001.2.21 }

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms ;

type
  TTranForm = class(TComponent)
  private
   FAlphaValue : integer ;
   FParentFormHandle : HWND ;
  procedure SetFAlphaValue(Alpha:integer) ;
   protected
   procedure UpdateDisplay ;
  public
  constructor Create(AOwner: TComponent); override;
  published
  property AlphaValue : integer read FAlphaValue write SetFAlphaValue ;
  end;

procedure Register;

function SetLayeredWindowAttributes(Handle: HWND; COLORKEY: COLORREF;
  Alpha: BYTE; Flags: DWord): Boolean; stdcall; external 'USER32.DLL';

implementation

procedure Register;
  begin
  RegisterComponents('Standard', [TTranForm]);
  end;

procedure TTranForm.SetFAlphaValue(Alpha: integer);
  begin
   if (Alpha >= 0) and (Alpha < 256) then begin
   FAlphaValue := Alpha ;
   UpdateDisplay() ;
  end;
  end;

procedure TTranForm.UpdateDisplay;
  begin
   if (csDesigning in ComponentState) then Exit ;
   SetLayeredWindowAttributes(FParentFormHandle, 0, FAlphaValue, 2);
  end;

constructor TTranForm.Create(AOwner: TComponent);
  begin
  inherited;
  if (csDesigning in ComponentState) then Exit;
  FAlphaValue := 255 ;
  FParentFormHandle := TForm(AOwner).Handle ;
  SetWindowLong(FParentFormHandle,
     GWL_EXSTYLE,
     GetWindowLong(FParentFormHandle, GWL_EXSTYLE) or WS_EX_LAYERED);
  end;

end.

    謝謝您的莫大耐心得以看完此文,此文純粹本著賺取china-pub"假幣"目的所寫,萬一各位看官有任何的疑問,歡迎信至[email protected],謝謝。
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved