delphi 建立半透明的異形視窗

2021-06-04 23:52:09 字數 2269 閱讀 5661

準備乙個半透明效果的png放在res目錄下。

新建乙個rc檔案:test.rc 加入專案。

內如如下

png_test png "res\未命名-1.png"
**如下:

uses winapi.gdipapi, winapi.gdipobj,activex;

procedure tform1.formcreate(sender: tobject);

var vgdip: thandle;

vbitmap: hbitmap;

voldbitmap: hbitmap;

vpoint1, vpoint2: tpoint;

vsize: tsize;

vblendfunction: tblendfunction;

vdc: hdc;

vbitmapinfo: tbitmapinfoheader;

vdibsection: tdibsection;

vbuffer: pchar;

vstream: istream;

vglobal: hglobal;

begin

setwindowlong(handle,gwl_exstyle,

getwindowlong(handle,gwl_exstyle)

or ws_ex_toolwindow

or ws_ex_layered

);//從資源中載入

with tresourcestream.create(hinstance, 'png_test', 'png') do try

vglobal := globalalloc(ghnd, size);

if vglobal = 0 then exit;

vbuffer := globallock(vglobal);

if not assigned(vbuffer) then exit;

tryread(vbuffer^, size);

finally

globalunlock(vgdip);

end;

if createstreamonhglobal(vglobal, false, vstream) <> s_ok then

exit;

if gdipcreatebitmapfromstreamicm(vstream,pointer( vgdip)) <> ok then exit;

globalfree(vglobal);

finally

free;

end;

if gdipcreatehbitmapfrombitmap(pointer(vgdip), vbitmap, 0) <> ok then

exit;

vbitmapinfo.bisize := sizeof(vbitmapinfo);

getobject(vbitmap, sizeof(vdibsection), @vdibsection);

vpoint1 := point(left, top);

vpoint2 := point(0, 0);

vsize.cx := vdibsection.dsbm.bmwidth;

vsize.cy := vdibsection.dsbm.bmheight;

vblendfunction.blendop := ac_src_over;

vblendfunction.blendflags := 0;

vblendfunction.sourceconstantalpha := $ff; // 透明度

vblendfunction.alphaformat := ac_src_alpha; //同上

vdc := createcompatibledc(canvas.handle);

voldbitmap := selectobject(vdc, vbitmap);

updatelayeredwindow(handle, canvas.handle,

@vpoint1, @vsize, vdc, @vpoint2, 0, @vblendfunction, ulw_alpha);

selectobject(vdc, voldbitmap);

deletedc(vdc);

deleteobject(vbitmap);

gdipdisposeimage(pointer(vgdip));

end;

效果圖:(後方藍色框是滑鼠選擇桌面圖示的效果)

半透明dialog的應用

下面簡單說一下 首先自定義乙個imagedialog,這樣好管理點.自定義dialog public class imagedialog extends dialog override public boolean onkeydown int keycode,keyevent event 操作 pu...

Unity 中的半透明

首先說unity中的渲染順序,在unity中改變渲染順序的方式有四層,第一層為camera的depth,第二層為sorting layers,canvas可直接在面板中調節,其他的可能需要在指令碼中設定,第三層為shader中的渲染佇列,第四層為pass pass的順序在不同情況下有差別 再說半透明...

半透明視窗的實現

在上篇 關於視窗嵌入桌面及透明的注意事項 提到 setlayeredwindowattributes 會使視窗上的控制項也一起被透明化 網上搜了一下,也沒有比較好的解決辦法 似乎唯一的解決辦法就是 在視窗後面再貼個透明視窗。步驟 1.使用 setwindowrgn 將沒有控制項的區域鏤空 2.建立乙...