[资料收集]关于AnimateWindow函数

by admin on 2020年1月31日

   
最近公司的事情不多,自己实现了一个简单的功能,算是一个demo,功能极其简单,而且我们还经常遇到起。

函数SetLayeredWindowAttributes
  使用这个函数,可以轻松的实现半透明窗体。按照微软的要求,透明窗体窗体在创建时应使用WS_EX_LAYERED参数(用CreateWindowEx),或者在创建后设置该参数(用SetWindowLong),我选用后者。全部函数、常量声明如下:
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
 
 其中hwnd是透明窗体的句柄,crKey为颜色值,bAlpha是透明度,取值范围是[0,255],dwFlags是透明方式,可以取两个值:当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效而窗体中的所有颜色为crKey的地方将变为透明--这个功能很有用:我们不必再为建立不规则形状的窗体而调用一大堆区域分析、创建、合并函数了,只需指定透明处的颜色值即可,哈哈哈哈!请看具体代码。
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = &H2
Private Const LWA_COLORKEY = &H1
代码一:一个半透明窗体
Private Sub Form_Load()
  Dim rtn As Long
  rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
  rtn = rtn Or WS_EX_LAYERED
  SetWindowLong hwnd, GWL_EXSTYLE, rtn
  SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA
End Sub

Private Declare AnimateWindow Lib “user32” (ByVal hwnd As Long,
ByVal dwTime As Long, ByVal dwFlags As Long) As Long
其中:
   hwnd只对Form有效,其他像Picture1都无法产生效果。
   dwTime是动画持续的时间,默认为200。
   dwFlags可取以下值:
     AW_HOR_POSITIVE ( &H1 ) ‘从左到右打开窗口
     AW_HOR_NEGATIVE ( &H2 ) ‘从右到左打开窗口
     AW_VER_POSITIVE ( &H4 ) ‘从上到下打开窗口
     AW_VER_NEGATIVE ( &H8 ) ‘从下到上打开窗口
     AW_CENTER    ( &H10 ) ‘看不出任何效果
     AW_HIDE     (&H10000)
‘在窗体卸载时若想使用本函数就得加上此常量
     AW_ACTIVATE   (&H20000)
‘在窗体通过本函数打开后,默认情况下会失去焦点,除非加上本常量
     AW_SLIDE     (&H40000) ‘看不出任何效果
     AW_BLEND     (&H80000) ‘淡入淡出效果

就是在右下角渐变的弹出一个提示框出来,有点类似于QQ或MSN那消息提示功能.(从下往上渐变显示出来)

代码二:形状不规则的窗体
Private Sub Form_Load()
  Dim rtn As Long
  BorderStyler=0
  rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
  rtn = rtn Or WS_EX_LAYERED
  SetWindowLong hwnd, GWL_EXSTYLE, rtn
  SetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY
将扣去窗口中的蓝色
End Sub

实例:

图片 1

Private Declare AnimateWindow Lib “user32” (ByVal hwnd As Long, ByVal
dwTime As Long, ByVal dwFlags As Long) As Long
Private Const AW_BLEND = &H80000
Private Const AW_ACTIVATE = &H20000
Private Sub Form_Load()
    AnimateWindow Me.hwnd, 2000, AW_BLEND Or AW_ACTIVATE
    Me.Refresh
End Sub

当然可以进行其他扩展(如对窗体美化,内容控制等),这里只是一个很简单的实现。就没有考虑那么多了。

 

下面是主要的代码:(主要是调用了系统的API函数实现渐变效果)。其实就是调用了这个函数产生了渐变效果,从下往上显示

图片 2  [DllImport(“user32”)]
图片 2        private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
图片 2        const int AW_HOR_POSITIVE = 0x0001;
图片 2        const int AW_HOR_NEGATIVE = 0x0002;
图片 2        const int AW_VER_POSITIVE = 0x0004;
图片 2        const int AW_VER_NEGATIVE = 0x0008;
图片 2        const int AW_CENTER = 0x0010;
图片 2        const int AW_HIDE = 0x10000;
图片 2        const int AW_ACTIVATE = 0x20000;
图片 2        const int AW_SLIDE = 0x40000;
图片 2        const int AW_BLEND = 0x80000;

调用代码就省略了哈。 

下面是这个API函数的相关说明(参考网络其他资源)

//添加引用 
  using  System.Runtime.InteropServices;      
  //声明API 
  [DllImport(“user32”)] 
  private  static  extern  bool  AnimateWindow(IntPtr  hwnd,int 
dwTime,  int  dwFlags); 
  const  int  AW_HOR_POSITIVE  =  0x0001; 
  const  int  AW_HOR_NEGATIVE  =  0x0002; 
  const  int  AW_VER_POSITIVE  =  0x0004; 
  const  int  AW_VER_NEGATIVE  =  0x0008; 
  const  int  AW_CENTER  =  0x0010; 
  const  int  AW_HIDE  =  0x10000; 
  const  int  AW_ACTIVATE  =  0x20000; 
  const  int  AW_SLIDE  =  0x40000; 
  const  int  AW_BLEND  =  0x80000;  
  //窗体加载时的动画效果API 
  AnimateWindow(this.Handle,1000,  AW_VER_NEGATIVE 
|AW_ACTIVATE);//从下到上且不占其它程序焦点      
    
  /*下面是AnimateWindow的具体说明 
  AnimateWindow  API          
  函数AnimateWindow. 
         
尽管MSDN页面上说这个函数是Win2000的最新函数,但经网友证实在Win98里就已经有这个函数了:      
  Private  Declare  Function  AnimateWindow  Lib  “user32”  (ByVal 
hwnd  As  Long,  ByVal  dwTime  As  Long,  ByVal  dwFlags  As  Long) 
As  Long 
   
  其中: 
     hwnd只对Form有效,其他像Picture1都无法产生效果。 
     dwTime是动画持续的时间,默认为200。 
     dwFlags可取以下值: 
       AW_HOR_POSITIVE  (    &H1    )  ‘从左到右打开窗口 
       AW_HOR_NEGATIVE  (    &H2    )  ‘从右到左打开窗口 
       AW_VER_POSITIVE  (    &H4    )  ‘从上到下打开窗口 
       AW_VER_NEGATIVE  (    &H8    )  ‘从下到上打开窗口 
       AW_CENTER     (    &H10  )  ‘看不出任何效果 
       AW_HIDE      (&H10000) 
‘在窗体卸载时若想使用本函数就得加上此常量   
       AW_ACTIVATE    (&H20000) 
‘在窗体通过本函数打开后,默认情况下会失去焦点,除非加上本常量   
       AW_SLIDE       (&H40000)  ‘看不出任何效果 
       AW_BLEND       (&H80000)  ‘淡入淡出效果 
   
  最后一个就是我要找的,遗憾的是只对Win2000有效。

 

另外还有一个要点是:如何让弹出的窗体在右下角:也很简单,供参考:

图片 13图片 14Code
int x = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Width-this.Width;
int y = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Height-this.Height;
this.SetDesktopLocation(x, y);

 

好了,关键代码都出来了,由于只是一个很小的功能demo,没怎么具体优化。这里只供提供一种思路。有兴趣的朋友可以自己去进行扩展:

源代码下载:MessageShowDemo

 

资料参考: 

 

Charles Chen

MSN:gotosunny@msn.com

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图