如何使某个控件变半透明,像半透明窗体一样?

qifanghcy01 2002-11-21 11:43:27
如何使某个控件变半透明,像半透明窗体一样?
...全文
127 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
peiji 2002-11-25
  • 打赏
  • 举报
回复
都是些高手啊,佩服
Sean918 2002-11-25
  • 打赏
  • 举报
回复
学习
dsclub 2002-11-23
  • 打赏
  • 举报
回复
看看以下代码的效果你会对windows的绘图机制有新的认识:
Option Explicit

Private Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long

Private Const GWL_EXSTYLE As Long = (-20)
Private Const LWA_ALPHA As Long = &H2


'这下面的代码是为了让你方便找到被小化的按钮
Private Sub Command1_Click()
CloseWindow Command1.hwnd
End Sub

Private Sub Form_Click()
FlashWindow Command1.hwnd, True
End Sub

Private Sub Form_Load()
Dim Temp As Long
Temp = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
Temp = Temp Or &H80000
SetWindowLong Me.hwnd, GWL_EXSTYLE, Temp
SetLayeredWindowAttributes Me.hwnd, 0, 100, LWA_ALPHA
End Sub

要求Windows2000下运行!
运行上面代码,点击按钮(command1),然后用鼠标点住它移动,结果透明的窗体被搞的乱七八糟的,这时你只需把此半透明窗体移开,一看:呀,原来是这个窗体后面的屏幕上被搞乱了,而这个半透明的窗体确整洁依然!
flyflyfly_woo 2002-11-23
  • 打赏
  • 举报
回复
看得比较晕,不过很多东东回去消化
boyzhang 2002-11-23
  • 打赏
  • 举报
回复
半透明可以用AlphaBlend实现,先获取Win最上层DC,再获取窗体DC,调用这个API就OK了,不过,呵呵,在W9X下要实现半透明真的太麻烦了,建议还是用2K或XP中的API吧!



:)
boyzhang 2002-11-23
  • 打赏
  • 举报
回复
可以哟,比如要一个窗体透明[W9X下],只要先
隐藏自身,然后获取Windows最上层的DC,Bitblt
窗体的RECT到Form,就"透明"了,不过,一定要在Hook
到窗体的KillFocus消息的时候让窗体隐藏,等到SetFocus
的时候再用上面的方法Bitblt一次,只不过效果没有在
2K/XP下的效果好罢了! :)
holydiablo 2002-11-22
  • 打赏
  • 举报
回复
也是
一个软件界面最好的效果就是合适的统一的简洁的风格
x_yiwen 2002-11-22
  • 打赏
  • 举报
回复
长见识了
boyzhang 2002-11-22
  • 打赏
  • 举报
回复
先获取这个控件或窗体的HWND[即句柄]
然后再获取句柄的HDC[设备Image]
然后获取最上层进程的HDC并裁下相应的RECT部份
BITBLT到先前那个控件的HDC上就OK了!

哈哈,挺简单的吧!
-------------------------
各自在路上,但有你同行!
如果有什么不懂的,Email或Q我都可以!
boyzhangpublic@163.net or liaisonme@hotmail.com
QQ:20437023
dengwei007 2002-11-22
  • 打赏
  • 举报
回复
同意楼上的!
想要好的效果就会浪费大量的系统资源
好的软件并不是靠华丽的外表
当然有兴趣去钻研是可以的

以前有太多的帖子讨论窗体透明的问题,搜索一下看一看吧,也许有点参考价值
zyl910 2002-11-22
  • 打赏
  • 举报
回复
楼上的说错了
那种方法我以前试过,不行!
所以曾经对Windows窗口绘制方式进行了研究

得到结论:在现有的操作系统上不可能实现

以前回答的:
====================================================================
在Win9X不可能实现窗体的半透明
那是受Windows对窗体的绘制方式的限制
Windows系统实际上是把所有显示的窗体的内容放在一个位图中
等窗体需要更新时
就会设置窗体的绘制区域(就是把在它上面的窗体的区域屏蔽掉)
在发送WM_PAINT、WM_NCPAINT消息让程序去绘制
所以本窗体下屏幕是不会更新的
而半透明的计算是需要下层图形的(透明计算公式:绘制的RGB分量 = 下层图形该点的RGB分量 + CLng((上层图形该点的RGB分量 - 下层图形该点的RGB分量) * 透明度),0<=透明度<=1,0完全透明,1不透明)

至于游戏中为什么能半透明
原理实在是太简单
PhotoShop用过吗
就是用多图层合并办到的

你没有注意吗
游戏中的背景层都是这个游戏的画面
根本不是Windows桌面
而且此窗体非彼窗体
这根本不是Windows系统的窗体
这是游戏中画出来的窗体

这样 上层图形、下层图形 都知道了,计算一下显示的颜色,半透明效果不就出来了!

====================================================================
而Windows2000新增那个API只对顶层窗体有效

它将窗体的图像专门放在另一个位图中
显示时再自动合并图层

由于没有多少内存可以被那些透明窗体浪费(一个窗体所占内存就有 高*宽*3字节,你算算你的内存能放多少个窗口(控件是一种子窗口))
再加上半透明合并的运算量很大
所以特地设计成只对顶层窗体有效
sanlinkcn 2002-11-22
  • 打赏
  • 举报
回复
用api函数,可以实现窗体半透明。

Const LWA_COLORKEY = &H1
Const LWA_ALPHA = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Sub Form_Load()
Dim Ret As Long
'Set the window style to 'Layered'
Ret = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
Ret = Ret Or WS_EX_LAYERED
SetWindowLong Me.hWnd, GWL_EXSTYLE, Ret
'Set the opacity of the layered window to 128
SetLayeredWindowAttributes Me.hWnd, 0, 128, LWA_ALPHA
End Sub

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧