首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

老有关问题透明listview

2012-02-12 
老问题透明listview问题如上:让listview透明显示就是类似有Transparent属性一样.求教怎么实现[解决办法]没

老问题透明listview
问题如上:
让listview透明显示
就是类似有Transparent属性一样.
求教怎么实现

[解决办法]
没有,自己处理,加背景图片,取自listview的父控件的颜色
[解决办法]
新版的VCLskin中有个SKINCaptin控件,可以设置整个form的透明度,listview也跟随一起变透明
[解决办法]
给你段透明的代码,自己去改吧 

Delphi(Pascal) code
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操作系统下调试成功。

[解决办法]
关注
[解决办法]
为什么发邮箱,楼主公开下阿
[解决办法]

Delphi(Pascal) code
  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半透明,但是没有公开代码,从他的描述中有很多代码。

期待三行代码。

热点排行