我的突发奇想。实在没思路,请达人指点。
我想要作个窗口,这个窗口的功能是,透视!
所谓透视,透过当前操作的窗口看到当前窗口下面的窗口(如果没窗口就看到桌面)
例如,有1,2,3,3个窗口。1为我要做的那个窗口(当然它永远在别的窗口上边)。2号窗口是我们正在朝作的窗口。这时,需要看到3号窗口。这是就要把第一个窗口最小化,看后面的3号。一次可以。要是多次反复作就很累。所以我想做一个窗口透视一下。方便实用。
我的表到能力不佳,不知道各位听明白没~
问题点数:100、回复次数:13Top
1 楼zhoupeng2005(看这里,看这里...)回复于 2005-02-25 16:38:29 得分 0
up
Top
2 楼jadeluo(秀峰)回复于 2005-02-25 16:46:25 得分 0
要是1号窗口全透明了, 那就不能显示内容,那还留着它有何用呢?Top
3 楼zhoupeng2005(看这里,看这里...)回复于 2005-02-25 16:48:25 得分 0
1号窗口是为了透过2号窗口看3号的内容
Top
4 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2005-02-25 16:49:51 得分 50
不可能的
这违反窗口的有效区规则的
解决方法只有一个:
使用API Hook技术拦截掉gdi32.dll、user32.dll的所有API
自己处理Windows的界面绘制任务
难度不亚于自己写一个操作系统
Top
5 楼yangao(人品决定一切,相貌决定人品!)回复于 2005-02-25 16:51:31 得分 0
可以实现
以前偶有个这样的例子
透明窗口专门显示最近更新的内容Top
6 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2005-02-25 17:02:11 得分 0
另一种解决方案:
用SetWindowRgn设置其他窗口的剪裁区域
剪裁掉1窗口的区域
这种方法也有问题的
1.
区域是进程级GDI资源,
要想跨进程使用区域,
只有利用全局Hook跨进程。
但VB无法编译全局Hook所需的普通dll。
2.
这种方法只有其他程序不工作的时候才有效。
因为在其他程序工作的时候,
肯定需要修改窗口的剪裁区域,
会与你的代码造成冲突,
导致界面显示不正常。
解决办法不是没有——用API Hook
拦截掉其他窗口的SetWindowRgn请求
再自己窗口区域的冲突问题
虽然难度比前一种简单一点,但还是需要自己处理好Windows的界面绘制任务
工作量极其庞大
估计等你一个人写出来的时候Microsoft早倒闭了
Top
7 楼zhoupeng2005(看这里,看这里...)回复于 2005-02-25 17:02:45 得分 0
确实不是很容易,大家讨论一下。我就不信有能把这个论坛难住的问题Top
8 楼viena(维也纳N02)回复于 2005-02-25 17:06:23 得分 50
不明白妳的意思,如果是在窗体上打洞的话,如下就可以:
Option Explicit
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Const RGN_XOR = 3
Private Sub Command1_Click()
Dim a As Long, b As Long
a = CreateRectRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY)
b = CreateRectRgn(50, 100, 300, 300)
CombineRgn a, a, b, RGN_XOR
SetWindowRgn Me.hWnd, a, True
End Sub
Top
9 楼rayxu(有心就成)回复于 2005-02-25 17:09:26 得分 0
可以的,我看到一本书上介绍过做透明窗体的方法,我去查查。Top
10 楼rayxu(有心就成)回复于 2005-02-25 17:12:11 得分 0
来了就是这个!
Option Explicit
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 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 Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = &H2
Private Sub Form_Load()
Dim FormStyle As Long
' 取的窗口原先的样式
FormStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
' 使窗体添加上新的样式WS_EX_LAYERED
FormStyle = FormStyle Or WS_EX_LAYERED
' 把新的样式赋给窗体
SetWindowLong Me.hwnd, GWL_EXSTYLE, FormStyle
' 设置窗体为半透明
SetLayeredWindowAttributes Me.hwnd, 0, 152, LWA_ALPHA
End SubTop
11 楼viena(维也纳N02)回复于 2005-02-25 17:15:03 得分 0
晕,有点看明白了,送妳四个字:
异 想 天 开Top
12 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2005-02-25 17:22:57 得分 0
回复人: zhoupeng2005(看这里,看这里...) ( ) 信誉:100 2005-02-25 17:02:00 得分: 0
确实不是很容易,大家讨论一下。我就不信有能把这个论坛难住的问题
-----------------------------------------
不是做不出来
这是因为Windows的窗口体系不允许这样做
所以必须自己编码实现整个窗口体系
其工作量相当于自己写一个操作系统了
如果真的有那么容易实现的话
Micosoft为什么不在Windows中内置此功能
Top
13 楼viena(维也纳N02)回复于 2005-02-25 17:33:42 得分 0
楼主钻到牛角尖里去了,快出来吧,前面没有路了~Top




