• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Woosa

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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

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

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

头文件CAnimateWindow.h

[cpp]view plaincopyprint?
  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. }; 
#pragma once
//Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口)
// http://blog.csdn.net/morewindows/article/details/8656068
//By MoreWindows-(http://blog.csdn.net/MoreWindows)
class CAnimateWindow
{
public:
	CAnimateWindow(HWND hwnd = NULL);
	void SetWindowHwnd(HWND hwnd);
	HWND GetWindowHwnd();
	BOOL AnimateWindow(DWORD dwTime = 400, BOOL bShow = TRUE, BOOL bSlide = TRUE);
private:
	int GetRandomNumber();
private:
	int   m_nAnimateType;
	HWND  m_hwndWindow;
};

CPP文件CAnimateWindow.cpp

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

CAnimateWindow::CAnimateWindow(HWND hwnd)
{
	m_hwndWindow = hwnd;
	m_nAnimateType = GetRandomNumber();
}

void CAnimateWindow::SetWindowHwnd(HWND hwnd)
{
	m_hwndWindow = hwnd;
}

HWND CAnimateWindow::GetWindowHwnd()
{
	return m_hwndWindow;
}

BOOL CAnimateWindow::AnimateWindow(DWORD dwTime, BOOL bShow, BOOL bSlide)
{
	DWORD dwFlags;
	dwFlags = bShow ? AW_ACTIVATE : AW_HIDE;
	dwFlags |= bSlide ? AW_SLIDE : AW_BLEND;
	if (m_nAnimateType == 0)
		dwFlags |= AW_HOR_POSITIVE;
	else if (m_nAnimateType == 1)
		dwFlags |= AW_VER_POSITIVE;
	else
		dwFlags |= AW_CENTER;

	return ::AnimateWindow(m_hwndWindow, dwTime, dwFlags);
}

int CAnimateWindow::GetRandomNumber()
{
	srand((UINT)time(NULL));
	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》。

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

BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
//使窗口居中
void CenterWindow(HWND hwnd);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
	return 0;
}


BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HBRUSH s_hBrushDlgBackGround;
	static CAnimateWindow   s_aw;
	switch (message)
	{
	case WM_INITDIALOG:
		{
			SetWindowText(hDlg, "窗口的动画显示和隐藏 - MoreWindows");
			// 加载背影图片
			HINSTANCE hinstance = (HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE);
			HBITMAP hBitmap = LoadBitmap(hinstance, MAKEINTRESOURCE(IDB_BITMAP1));
			s_hBrushDlgBackGround = CreatePatternBrush(hBitmap);
			
			CenterWindow(hDlg);

			s_aw.SetWindowHwnd(hDlg);
			s_aw.AnimateWindow(600);
		}
		return FALSE;
		
		
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			s_aw.AnimateWindow(400, FALSE);
			EndDialog(hDlg, FALSE);
			return TRUE;
		}
		break;


	case WM_CTLCOLORDLG:
		return (BOOL)s_hBrushDlgBackGround;
	}
	return FALSE;
}
//使窗口居中
void CenterWindow(HWND hwnd)
{
	RECT   rcDlg;
	int    nDlgWidth, nDlgHight;
	int    nScreenWidth, nScreenHight;
	
	nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	nScreenHight = GetSystemMetrics(SM_CYSCREEN);
	
	GetWindowRect(hwnd, &rcDlg);
	nDlgWidth = rcDlg.right - rcDlg.left;
	nDlgHight = rcDlg.bottom - rcDlg.top;
	
	MoveWindow(hwnd, (nScreenWidth  - nDlgWidth) / 2, (nScreenHight - nDlgHight) / 2, nDlgWidth, nDlgHight, FALSE);
} 

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

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

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

posted on 2013-03-15 20:13  Woosa  阅读(289)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3