CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

我的突发奇想。实在没思路,请达人指点。

楼主zhoupeng2005(看这里,看这里...)2005-02-25 16:22:20 在 VB / 基础类 提问

我想要作个窗口,这个窗口的功能是,透视!  
  所谓透视,透过当前操作的窗口看到当前窗口下面的窗口(如果没窗口就看到桌面)  
  例如,有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

相关问题

  • 突发奇想!
  • 突发奇想与奇思妙想!!!
  • 请大家帮我打开思路,指点指点。谢谢!!!
  • 污水工程,指点一下思路!!
  • 急,思路指点一下,在线等~~~
  • 思路问题,请高手指点
  • 请教个思路!!请高手指点!!!
  • C++ 作用域的问题.突发奇想.求高手解答
  • 突发奇想 有兴趣的来 指纹识别
  • 有关C编译的突发奇想,请高手指教

关键词

  • 区域
  • 剪裁
  • 样式
  • 界面
  • me
  • ws
  • 解决
  • longprivate
  • 窗体
  • byval

得分解答快速导航

  • 帖主:zhoupeng2005
  • zyl910
  • viena

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo