热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

老问题透明listview

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

60 个解决方案

#1


没有,自己处理,加背景图片,取自listview的父控件的颜色

#2


新版的VCLskin中有个SKINCaptin控件,可以设置整个form的透明度,listview也跟随一起变透明

#3


取自listview的父控件的颜色,怎么取?
能否详细下

#4


给你段透明的代码,自己去改吧 

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;

#5


三行代码以内,实现LISTVIEW透明,满足楼主要求。只是希望楼主再加点分以表示对问题的重视。

#6


好象还有点麻烦呢。。。

#7


Mark

#8


mwy654321:
我再加80分,但是我要实现的可不是要让listview有背景颜色,而是要让listview任何其他控件上透明,
假如有个image,或其他,让listview叠在这些控件上均能透明.
希望你能及时给我答复解决..
如果解决不了listview透明,stringgrid也行
sanguomi :我现在就去看下你的代码能否实现

#9


mwy654321:我都已经加分了,还不来解答,5555

#10


自己顶,急

#11


alphabend属性?

#12


alphabend,有这属性否,晕

#13


关注三行代码。

另外,根本不存在"alphabend"这样的属性,楼主不必被误导。

#14


回帖是一种美德!每天回帖即可获得 10 分可用分

#15


关注三行代码,顶起来

#16


为3行代码mark一下

#17


GZ

#18


不好意思,这几天有点忙,明天晚上把三行代码发到你信箱,现在在网吧上网有点不方便。



我再加80分,但是我要实现的可不是要让listview有背景颜色,而是要让listview任何其他控件上透明, 
假如有个image,或其他,让listview叠在这些控件上均能透明. 


答:去掉背景色,是透明的,叠在这些控件上均透明!

#19


用winapi嘛。

函数功能:设置窗口透明颜色
格式:BOOL SetLayeredWindowAttributes(
             HWND hwnd,         //窗口手柄
             COLORREF crKey,    //指定颜色值
             BYTE bAlpha,        //混合函数值
             DWORD dwFlags     //动作
             );

#20


{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操作系统下调试成功。

#21


引用 13 楼 ccrun 的回复:
关注三行代码。

 另外,根本不存在"alphabend"这样的属性,楼主不必被误导。

哈哈,我也关注

#22


关注

#23


为什么发邮箱,楼主公开下阿

#24


引用 20 楼 shuaialang 的回复:
{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操作系统下调试成功。


至huaialang:
你好,我刚才用你教的方法测试了,可以设置form的透明度,
但我依此类推:
SetWindowLong(ListView1.Handle, GWL_EXSTYLE,
      GetWindowLong(Listview1.Handle, GWL_EXSTYLE)
      or WS_EX_LAYERED);
MySetLayeredWindowAttributes(ListView1.Handle, 0, Byte(alpha), LWA_ALPHA);
却改变不了listview的透明度,知道为什么吗?

#25


经过测试发现问题:
SetWindowLong(ListView1.Handle, GWL_EXSTYLE, 
      GetWindowLong(Listview1.Handle, GWL_EXSTYLE) 
      or WS_EX_LAYERED); 
这里的SetWindowLong执行失败,

#26



  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;

#27


持续关注三行代码。

#28


等待楼主发出代码。

#29


引用 28 楼 zzflover 的回复:
等待楼主发出代码。

我也在等待大家帖代码,郁闷,
还没能解决

#30


再加50分,等待答案

#31


靠,不能加分

#32


关注NEW人三行代码!

#33


引用 32 楼 wooden954 的回复:
关注NEW人三行代码!

哪有这么好三行代码,还是等你来解决吧

#34


三行似乎不可能。除了下面必须的三行设置属性的代码:
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消息

#35


来看一下.

#36


STUDAY

#37


听说有三行代码,关注一下

#38


持续关注三行代码

#39


引用 5 楼 mwy654321 的回复:
三行代码以内,实现LISTVIEW透明,满足楼主要求。只是希望楼主再加点分以表示对问题的重视。


BS

#40


还没搞定?

#41


三行呢?

#42


"三行代码"就是新时代的大费马!

#43


想用设置窗口的方法来设置控件,都是徒劳的,哈哈

#44


自己写个从那里继承写个控件,先对控件做个透明处理,然后在自绘函数里把数据自绘上去

#45


引用 40 楼 sanguomi 的回复:
还没搞定?

555,没搞定,先搁着了

#46


引用 34 楼 idle_ 的回复:
三行似乎不可能。除了下面必须的三行设置属性的代码:
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消息

恩,难做

#47


alphabend是CDC的成员函数!怎么叫没有?》?

#48


mark

#49


up

#50


关注
回复内容太短了! 

推荐阅读
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • mysql数据库json类型数据,sql server json数据类型
    mysql数据库json类型数据,sql server json数据类型 ... [详细]
  • 本文探讨了如何在游戏启动画面中移除广告,特别是在游戏数据加载期间(大约5-6秒)广告会短暂显示的问题。通过调整XML布局和代码逻辑,可以实现广告的延迟加载或完全移除。 ... [详细]
  • 本文介绍了如何在 VC++ 中使用双缓冲技术来减少屏幕闪烁,提高绘图性能。通过示例代码详细展示了双缓冲的实现步骤。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 图像处理学习笔记:噪声分析与去除策略
    本文详细探讨了不同类型的图像噪声及其对应的降噪技术,旨在帮助读者理解各种噪声的本质,并掌握有效的降噪方法。文章不仅介绍了高斯噪声、瑞利噪声、伽马噪声、指数噪声、均匀噪声和椒盐噪声等常见噪声类型,还特别讨论了周期噪声的特性及处理技巧。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 深入解析WebP图片格式及其应用
    随着互联网技术的发展,无论是PC端还是移动端,图片数据流量占据了很大比重。尤其在高分辨率屏幕普及的背景下,如何在保证图片质量的同时减少文件大小,成为了亟待解决的问题。本文将详细介绍Google推出的WebP图片格式,探讨其在实际项目中的应用及优化策略。 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
  • 本文详细介绍了 Java 中 org.w3c.dom.Node 类的 isEqualNode() 方法的功能、参数及返回值,并通过多个实际代码示例来展示其具体应用。此方法用于检测两个节点是否相等,而不仅仅是判断它们是否为同一个对象。 ... [详细]
author-avatar
爱笑的美美6_833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有