国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

編程實(shí)現(xiàn)窗體的半透明效果

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

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

Const
  WS_EX_LAYERED = $80000;
  LWA_ALPHA = 2;

  我們調(diào)用GetWindowLong函數(shù)獲取當(dāng)前窗口的擴(kuò)展屬性,并調(diào)用SetWindowLong函數(shù)將新的WS_EX_LAYERED窗口擴(kuò)展屬性添加進(jìn)去。

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

  現(xiàn)在我們的窗口已經(jīng)可以調(diào)用SetLayeredWindowAttributes函數(shù),通過設(shè)置該函數(shù)的Alpha參數(shù),我們就可以看到窗口的效果的變化。

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

  以下的VCL控件代碼封裝了SetLayeredWindowAttributes函數(shù),編程時(shí)動(dòng)態(tài)改變AlphaValue值,您就可以看到窗口的透明效果了。控件屏蔽了設(shè)計(jì)期的顯示效果,如果讀者愿意可以改為設(shè)計(jì)期效果可見,不過那樣的話,一不小心,您可能就會(huì)找不著你要設(shè)計(jì)的窗體了 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"假幣"目的所寫,萬一各位看官有任何的疑問,歡迎信至dragonpc@21cn.com,謝謝。


上一篇:類似網(wǎng)絡(luò)螞蟻的懸浮窗體

下一篇:改進(jìn)的socket控件

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 古交市| 淮滨县| 鹤壁市| 乌审旗| 方城县| 康马县| 扶绥县| 兴宁市| 惠来县| 祁阳县| 宜君县| 景宁| 双江| 博湖县| 彭阳县| 搜索| 福贡县| 罗平县| 北碚区| 莲花县| 财经| 奉新县| 东乌| 上犹县| 黄平县| 稷山县| 宜丰县| 寿宁县| 石门县| 巫溪县| 鹿邑县| 承德县| 新和县| 济宁市| 通城县| 大宁县| 沅陵县| 廉江市| 杂多县| 集安市| 海城市|