• Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口)


    动画效果显示及隐藏窗口及大大美化程序界面,像QQ的登录窗口也是使用了动画效果显示及隐藏窗口。

    本篇《Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口)》就来介绍下如何使用动画效果来显示隐藏窗口。为了方便代码复用,本人已经将其封装成一个窗口动画效果类,先来看看这个窗口动画效果类的实现吧。

    头文件CAnimateWindow.h

    1. #pragma once 
    2. //Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口) 
    3. // http://blog.csdn.net/morewindows/article/details/8656068 
    4. //By MoreWindows-(http://blog.csdn.net/MoreWindows) 
    5. class CAnimateWindow 
    6. public
    7.     CAnimateWindow(HWND hwnd = NULL); 
    8.     void SetWindowHwnd(HWND hwnd); 
    9.     HWND GetWindowHwnd(); 
    10.     BOOL AnimateWindow(DWORD dwTime = 400,BOOL bShow = TRUE, BOOL bSlide = TRUE); 
    11. private
    12.     int GetRandomNumber(); 
    13. private
    14.     int   m_nAnimateType; 
    15.     HWND  m_hwndWindow; 
    16. }; 

    CPP文件CAnimateWindow.cpp

    1. //Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口) 
    2. // http://blog.csdn.net/morewindows/article/details/8656068 
    3. //By MoreWindows-(http://blog.csdn.net/MoreWindows) 
    4. #include <windows.h> 
    5. #include <stdlib.h> 
    6. #include <time.h> 
    7. #include "CAnimateWindow.h" 
    8.  
    9. CAnimateWindow::CAnimateWindow(HWND hwnd) 
    10.     m_hwndWindow = hwnd; 
    11.     m_nAnimateType = GetRandomNumber(); 
    12.  
    13. void CAnimateWindow::SetWindowHwnd(HWND hwnd) 
    14.     m_hwndWindow = hwnd; 
    15.  
    16. HWND CAnimateWindow::GetWindowHwnd() 
    17.     return m_hwndWindow; 
    18.  
    19. BOOL CAnimateWindow::AnimateWindow(DWORD dwTime,BOOL bShow, BOOL bSlide) 
    20.     DWORD dwFlags; 
    21.     dwFlags = bShow ? AW_ACTIVATE : AW_HIDE; 
    22.     dwFlags |= bSlide ? AW_SLIDE : AW_BLEND; 
    23.     if (m_nAnimateType == 0) 
    24.         dwFlags |= AW_HOR_POSITIVE; 
    25.     elseif (m_nAnimateType == 1) 
    26.         dwFlags |= AW_VER_POSITIVE; 
    27.     else 
    28.         dwFlags |= AW_CENTER; 
    29.  
    30.     return ::AnimateWindow(m_hwndWindow, dwTime, dwFlags); 
    31.  
    32. int CAnimateWindow::GetRandomNumber() 
    33.     srand((UINT)time(NULL)); 
    34.     return rand() % 3; 

    代码非常简单,主要使用的是AnimateWindow函数。这个函数的函数原型如下:

    BOOLAnimateWindow(        

       HWNDhwnd,

       DWORDdwTime,

       DWORDdwFlags

    );

    这个函数也极其简单,三个参数,一个表示窗口句柄,一个表示动画持续时间(毫秒),最后一个参数表示动画效果。可以有以下参数:

    AW_SLIDE

    Uses slide animation. By default, roll animation is used. This flag is ignored when used with AW_CENTER.

    AW_ACTIVATE

    Activates the window. Do not use this value with AW_HIDE.

    AW_BLEND

    Uses a fade effect. This flag can be used only if hwnd is a top-level window.

    AW_HIDE

    Hides the window. By default, the window is shown.

    AW_CENTER

    Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used. The various direction flags have no effect.

    AW_HOR_POSITIVE

    Animates the window from left to right. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND.

    AW_HOR_NEGATIVE

    Animates the window from right to left. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND.

    AW_VER_POSITIVE

    Animates the window from top to bottom. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND.

    AW_VER_NEGATIVE

    Animates the window from bottom to top. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND.

    参数有点多但归纳一下就知道分为水平方向,垂直方向,由里向外或由外向里这几种。

    下面给出这个动画显示窗口类的使用范例。

    代码中的CenterWindow是用来将窗口居中显示的,这个函数中的GetSystemMetrics(SM_CXSCREEN);GetSystemMetrics(SM_CYSCREEN);可以参考《VC++获取屏幕大小第一篇像素大小GetSystemMetrics》。

    1. //Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口) 
    2. // http://blog.csdn.net/morewindows/article/details/8656068 
    3. //By MoreWindows-(http://blog.csdn.net/MoreWindows) 
    4. #include "stdafx.h" 
    5. #include "resource.h" 
    6. #include "CAnimateWindow.h" 
    7.  
    8. BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam); 
    9. //使窗口居中 
    10. void CenterWindow(HWND hwnd); 
    11.  
    12. int APIENTRY WinMain(HINSTANCE hInstance, 
    13.                     HINSTANCE hPrevInstance, 
    14.                      LPSTR     lpCmdLine, 
    15.                     int       nCmdShow) 
    16.     // TODO: Place code here. 
    17.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); 
    18.     return 0; 
    19.  
    20.  
    21. BOOL CALLBACK DlgProc(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam) 
    22.     static HBRUSH s_hBrushDlgBackGround; 
    23.     static CAnimateWindow   s_aw; 
    24.     switch (message) 
    25.     { 
    26.     case WM_INITDIALOG: 
    27.         { 
    28.             SetWindowText(hDlg,"窗口的动画显示和隐藏 - MoreWindows"); 
    29.             // 加载背影图片 
    30.             HINSTANCE hinstance = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE); 
    31.             HBITMAP hBitmap = LoadBitmap(hinstance, MAKEINTRESOURCE(IDB_BITMAP1)); 
    32.             s_hBrushDlgBackGround = CreatePatternBrush(hBitmap); 
    33.              
    34.             CenterWindow(hDlg); 
    35.  
    36.             s_aw.SetWindowHwnd(hDlg); 
    37.             s_aw.AnimateWindow(600); 
    38.         } 
    39.         return FALSE; 
    40.          
    41.          
    42.     case WM_COMMAND: 
    43.         switch (LOWORD(wParam)) 
    44.         { 
    45.         case IDOK: 
    46.         case IDCANCEL: 
    47.             s_aw.AnimateWindow(400, FALSE); 
    48.             EndDialog(hDlg, FALSE); 
    49.             return TRUE; 
    50.         } 
    51.         break
    52.  
    53.  
    54.     case WM_CTLCOLORDLG: 
    55.         return (BOOL)s_hBrushDlgBackGround; 
    56.     } 
    57.     return FALSE; 
    58. //使窗口居中 
    59. void CenterWindow(HWND hwnd) 
    60.     RECT   rcDlg; 
    61.     int    nDlgWidth, nDlgHight; 
    62.     int    nScreenWidth, nScreenHight; 
    63.      
    64.     nScreenWidth = GetSystemMetrics(SM_CXSCREEN); 
    65.     nScreenHight = GetSystemMetrics(SM_CYSCREEN); 
    66.      
    67.     GetWindowRect(hwnd, &rcDlg); 
    68.     nDlgWidth = rcDlg.right - rcDlg.left; 
    69.     nDlgHight = rcDlg.bottom - rcDlg.top; 
    70.      
    71.     MoveWindow(hwnd, (nScreenWidth  - nDlgWidth) / 2, (nScreenHight - nDlgHight) / 2, nDlgWidth, nDlgHight, FALSE); 
    72. }  

    运行效果如下所示,当然动画效果不好截图,大家可以从http://download.csdn.net/detail/morewindows/5128647下载(带源码且免积分),然后自己运行看下效果。

    欢迎继续参考下面两篇《Windows界面编程第七篇文件拖拽(文件拖放)》和

    《Windows界面编程第八篇 listbox彩色显示隔行变色

  • 相关阅读:
    Hive 常用的开窗函数
    常见的三类范式
    About A ROS driver for TCP/IP modems
    ROS Package for communication over TCP/IP.
    A repo of awesome papers about multi target multi camera tracking
    分布式锁
    http请求跳过ssl证书(Get请求示例)
    mysql和mogodb特殊字符转义
    全局异常捕捉
    Jasypt加密
  • 原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589193.html
Copyright © 2020-2023  润新知