找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 290|回复: 5

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

[复制链接]

52

主题

62

回帖

0

积分

版主

积分
0
发表于 2013-10-6 23:24:28 | 显示全部楼层 |阅读模式
动画效果显示及隐藏窗口及大大美化程序界面,像QQ的登录窗口也是使用了动画效果显示及隐藏窗口。
[attachment=1123]




本篇《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. {
  7. public:
  8.     CAnimateWindow(HWND hwnd = NULL);
  9.     void SetWindowHwnd(HWND hwnd);
  10.     HWND GetWindowHwnd();
  11.     BOOL AnimateWindow(DWORD dwTime = 400, BOOL bShow = TRUE, BOOL bSlide = TRUE);
  12. private:
  13.     int GetRandomNumber();
  14. private:
  15.     int   m_nAnimateType;
  16.     HWND  m_hwndWindow;
  17. };
复制代码
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. CAnimateWindow::CAnimateWindow(HWND hwnd)
  9. {
  10.     m_hwndWindow = hwnd;
  11.     m_nAnimateType = GetRandomNumber();
  12. }
  13. void CAnimateWindow::SetWindowHwnd(HWND hwnd)
  14. {
  15.     m_hwndWindow = hwnd;
  16. }
  17. HWND CAnimateWindow::GetWindowHwnd()
  18. {
  19.     return m_hwndWindow;
  20. }
  21. BOOL CAnimateWindow::AnimateWindow(DWORD dwTime, BOOL bShow, BOOL bSlide)
  22. {
  23.     DWORD dwFlags;
  24.     dwFlags = bShow ? AW_ACTIVATE : AW_HIDE;
  25.     dwFlags |= bSlide ? AW_SLIDE : AW_BLEND;
  26.     if (m_nAnimateType == 0)
  27.         dwFlags |= AW_HOR_POSITIVE;
  28.     else if (m_nAnimateType == 1)
  29.         dwFlags |= AW_VER_POSITIVE;
  30.     else
  31.         dwFlags |= AW_CENTER;
  32.     return ::AnimateWindow(m_hwndWindow, dwTime, dwFlags);
  33. }
  34. int CAnimateWindow::GetRandomNumber()
  35. {
  36.     srand((UINT)time(NULL));
  37.     return rand() % 3;
  38. }
复制代码


代码非常简单,主要使用的是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);


  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. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  8. //使窗口居中
  9. void CenterWindow(HWND hwnd);
  10. int APIENTRY WinMain(HINSTANCE hInstance,
  11.                      HINSTANCE hPrevInstance,
  12.                      LPSTR     lpCmdLine,
  13.                      int       nCmdShow)
  14. {
  15.      // TODO: Place code here.
  16.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
  17.     return 0;
  18. }
  19. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  20. {
  21.     static HBRUSH s_hBrushDlgBackGround;
  22.     static CAnimateWindow   s_aw;
  23.     switch (message)
  24.     {
  25.     case WM_INITDIALOG:
  26.         {
  27.             SetWindowText(hDlg, "窗口的动画显示和隐藏 - MoreWindows");
  28.             // 加载背影图片
  29.             HINSTANCE hinstance = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE);
  30.             HBITMAP hBitmap = LoadBitmap(hinstance, MAKEINTRESOURCE(IDB_BITMAP1));
  31.             s_hBrushDlgBackGround = CreatePatternBrush(hBitmap);
  32.             
  33.             CenterWindow(hDlg);
  34.             s_aw.SetWindowHwnd(hDlg);
  35.             s_aw.AnimateWindow(600);
  36.         }
  37.         return FALSE;
  38.         
  39.         
  40.     case WM_COMMAND:
  41.         switch (LOWORD(wParam))
  42.         {
  43.         case IDOK:
  44.         case IDCANCEL:
  45.             s_aw.AnimateWindow(400, FALSE);
  46.             EndDialog(hDlg, FALSE);
  47.             return TRUE;
  48.         }
  49.         break;
  50.     case WM_CTLCOLORDLG:
  51.         return (BOOL)s_hBrushDlgBackGround;
  52.     }
  53.     return FALSE;
  54. }
  55. //使窗口居中
  56. void CenterWindow(HWND hwnd)
  57. {
  58.     RECT   rcDlg;
  59.     int    nDlgWidth, nDlgHight;
  60.     int    nScreenWidth, nScreenHight;
  61.    
  62.     nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  63.     nScreenHight = GetSystemMetrics(SM_CYSCREEN);
  64.    
  65.     GetWindowRect(hwnd, &rcDlg);
  66.     nDlgWidth = rcDlg.right - rcDlg.left;
  67.     nDlgHight = rcDlg.bottom - rcDlg.top;
  68.    
  69.     MoveWindow(hwnd, (nScreenWidth  - nDlgWidth) / 2, (nScreenHight - nDlgHight) / 2, nDlgWidth, nDlgHight, FALSE);
  70. }
复制代码
运行效果如下所示,



[attachment=1124]


本章源代码回复可见!!
[attachment=1125]



67

主题

115

回帖

0

积分

版主

积分
0
发表于 2013-10-6 23:41:28 | 显示全部楼层
: 这是原创么。

52

主题

62

回帖

0

积分

版主

积分
0
 楼主| 发表于 2013-10-7 00:25:44 | 显示全部楼层
我是改行,以前用易现在才学C.我还没到这程度!!
原文来至CSDN

0

主题

6

回帖

0

积分

新手上路

积分
0
发表于 2013-10-7 15:00:58 | 显示全部楼层
应该写个转载比较好

1

主题

23

回帖

0

积分

新手上路

积分
0
发表于 2013-10-15 09:16:37 | 显示全部楼层
学学           

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2013-10-16 20:57:52 | 显示全部楼层
大牛太多了, 牛X ,膜拜中。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 04:40 , Processed in 0.085800 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表