老问题透明listview
问题如上:
让listview透明显示
就是类似有Transparent属性一样.
求教怎么实现
[解决办法]
没有,自己处理,加背景图片,取自listview的父控件的颜色
[解决办法]
新版的VCLskin中有个SKINCaptin控件,可以设置整个form的透明度,listview也跟随一起变透明
[解决办法]
给你段透明的代码,自己去改吧
procedure DrawParentBackground(Control: TControl; DC: HDC; R: PRect = nil; bDrawErasebkgnd: Boolean = False);var SaveIndex: Integer; MemDC: HDC; MemBmp: HBITMAP;begin if R <> nil then begin MemDC := CreateCompatibleDC(DC); MemBmp := CreateCompatibleBitmap(DC, Control.Width, Control.Height); SelectObject(MemDC, MemBmp); try with Control.BoundsRect.TopLeft do SetWindowOrgEx(MemDC, X, Y, nil); if bDrawErasebkgnd then Control.Parent.Perform(WM_ERASEBKGND, Integer(MemDC), Integer(MemDC)); Control.Parent.Perform(WM_PAINT, Integer(MemDC), Integer(MemDC)); with Control.BoundsRect.TopLeft do BitBlt(DC, R^.Left, R^.Top, R^.Right - R^.Left, R^.Bottom - R^.Top, MemDC, X + R^.Left, Y + R^.Top, SRCCOPY); finally DeleteObject(MemBmp); DeleteDC(MemDC); end; Exit; end; SaveIndex := SaveDC(DC); try with Control.BoundsRect.TopLeft do SetWindowOrgEx(DC, X, Y, nil); if bDrawErasebkgnd then Control.Parent.Perform(WM_ERASEBKGND, Integer(DC), Integer(DC)); Control.Parent.Perform(WM_PAINT, Integer(DC), Integer(DC)); finally RestoreDC(DC, SaveIndex); end;end;
[解决办法]
三行代码以内,实现LISTVIEW透明,满足楼主要求。只是希望楼主再加点分以表示对问题的重视。
[解决办法]
关注三行代码。
另外,根本不存在"alphabend"这样的属性,楼主不必被误导。
[解决办法]
不好意思,这几天有点忙,明天晚上把三行代码发到你信箱,现在在网吧上网有点不方便。
我再加80分,但是我要实现的可不是要让listview有背景颜色,而是要让listview任何其他控件上透明,
假如有个image,或其他,让listview叠在这些控件上均能透明.
答:去掉背景色,是透明的,叠在这些控件上均透明!
[解决办法]
用winapi嘛。
函数功能:设置窗口透明颜色
格式:BOOL SetLayeredWindowAttributes(
HWND hwnd, //窗口手柄
COLORREF crKey, //指定颜色值
BYTE bAlpha, //混合函数值
DWORD dwFlags //动作
);
[解决办法]
{API声明}
type
TSetLayeredWindowAttributes
= function(wnd: HWND; crKey: DWORD;
bAlpha: BYTE; dwFlag: DWORD): Boolean; stdcall;
const
WS_EX_LAYERED = $80000;
LWA_ALPHA = 2;
var
hLibUser32: THandle;
MySetLayeredWindowAttributes:
TSetLayeredWindowAttributes;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
p: Pointer;
begin
hLibUser32 := LoadLibraryA(‘user32.dll');
MySetLayeredWindowAttributes := nil;
if hLibUser32 <> 0 then begin
p:=GetProcAddress(hLibUser32,
‘SetLayeredWindowAttributes');
if p = nil then begin
FreeLibrary(hLibUser32);
hLibUser32 := 0;
end else begin
MySetLayeredWindowAttributes :=
TSetLayeredWindowAttributes(p);
end;
end;
if hLibUser32 <> 0 then begin
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE)
or WS_EX_LAYERED);
ScrollBar1.Position := ScrollBar1.Max;
ScrollBar1Change(Self);
end else begin
ShowMessage(‘该操作系统不支持!');
Application.Terminate;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if hLibUser32 <> 0 then begin
FreeLibrary(hLibUser32);
hLibUser32 := 0;
end;
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
var
alpha: Integer;
begin
if hLibUser32 <> 0 then begin
alpha := ScrollBar1.Position;
alpha := alpha * 255 div
(ScrollBar1.Max - ScrollBar1.Min);
if alpha < 8 then alpha := 8;
if alpha > 255 then alpha := 255;
MySetLayeredWindowAttributes
(Handle, 0, Byte(alpha), LWA_ALPHA);
end;
end;
----程序在Delphi5.0、Wndows2000操作系统下调试成功。
[解决办法]
关注
[解决办法]
为什么发邮箱,楼主公开下阿
[解决办法]
Test = class(TListView) public function IsCustomDrawn(Target: TCustomDrawTarget; Stage: TCustomDrawStage): Boolean; override; public IsTrantp: Boolean; constructor Create(AOwner: TComponent); override; end;constructor Test.Create(AOwner: TComponent);begin inherited Create(AOwner); IsTrantp := True;end;function Test.IsCustomDrawn(Target: TCustomDrawTarget; Stage: TCustomDrawStage): Boolean;var R1: TRect;begin R1 := Self.ClientRect; DrawParentBackground(Self, Canvas.Handle, @R1, IsTrantp);end;// 测试procedure TForm1.Button2Click(Sender: TObject);var T1: Test;begin T1 := Test.Create(self); T1.Parent := Self;end;
[解决办法]
持续关注三行代码。
[解决办法]
等待楼主发出代码。
[解决办法]
关注NEW人三行代码!
[解决办法]
三行似乎不可能。除了下面必须的三行设置属性的代码:
SetWindowLong(Form.Handle, GWL_STYLE, GetWindowLong(Form.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
SetWindowLong(Listview.Handle, GWL_STYLE, GetWindowLong(Listview.Handle, GWL_STYLE) and not WS_CLIPSIBLING);
SetWindowLong(Listview.Handle, GWL_EX_STYLE, GetWindowLong(Listview.Handle, GWL_STYLE) or WS_EX_TRANSPARENT);
还需要截取listview的WM_ERASEBKGND消息
[解决办法]
还没搞定?
[解决办法]
三行呢?
[解决办法]
up
[解决办法]
关注
回复内容太短了!
[解决办法]
3行代码引发的血案
[解决办法]
原来在深度论坛看到有一个实现了ListView半透明,但是没有公开代码,从他的描述中有很多代码。
期待三行代码。