頁面切換特效




#include "Common.h"
#include <complex>
#include <map>


class Expo
{
public:
    double In(double t, double b, double c, double d)
    {
		return (t==0) ? b : c * pow(2, 10 * (t/d - 1)) + b;
    }
	double Out(double t, double b, double c, double d)
    {
		return (t==d) ? b+c : c * (-pow(2, -10 * t/d) + 1) + b;
    }
	double InOut(double t, double b, double c, double d)
    {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * pow(2, 10 * (t - 1)) + b;
		return c/2 * (-pow(2, -10 * --t) + 2) + b;
    }
};


class CPageSwitch
{
public:
	CPageSwitch()
	{
		m_hCurrentPage = NULL;
	}
	VOID Create(HWINDOW hWindow,UINT IDTimer=100,UINT uElapse=10)
	{
		m_hWindow = hWindow;
		m_IDTimer = IDTimer;
		m_uElapse = uElapse;
		XWnd_RegEventCPP(m_hWindow,WM_TIMER,&CPageSwitch::OnWndTimer);
	}
	VOID SetDefaultPage(HELE hPage)
	{
		m_hCurrentPage = hPage;
	}
	VOID SetShowRect(RECT showRect)
	{
		m_ShowRect = showRect;
	}
	VOID AddPage(HELE hBtn,HELE hPage,int index)
	{
		XEle_SetUserData(hBtn,(int)hPage);
		XEle_RegEventCPP1(hBtn,XE_BNCLICK,&CPageSwitch::OnBtnClick);
//		std::map<HELE,int>
		m_map.insert(std::pair<HELE,int>(hPage,index));
	}

private:
	int OnBtnClick(HELE hBtn,BOOL *pbHandled)
	{
		//如果當前顯示頁面 == 要顯示的頁面,則忽略
		HELE hPage = (HELE)XEle_GetUserData(hBtn);
		if (hPage == m_hCurrentPage)
			return 0;

		XWnd_KillTimer(m_hWindow,m_IDTimer);

		//通過綁定的索引判斷方向
		if (m_map[hPage] > m_map[m_hCurrentPage])
			m_bDir = TRUE; //從右到左
		else
			m_bDir = FALSE; //從右到左


		m_hPrevPage = m_hCurrentPage;
		XEle_GetRect(m_hPrevPage,&m_PrevRect);

		m_hCurrentPage = hPage;
		XEle_ShowEle(m_hCurrentPage,TRUE);

		m_Index = 0;
		m_c = m_ShowRect.right - m_ShowRect.left;

		if (m_bDir)
		{
			m_OrgRect.left = m_ShowRect.right;
			m_OrgRect.top  = m_ShowRect.top;

			m_OrgRect.right = m_OrgRect.left + (m_ShowRect.right-m_ShowRect.left);
			m_OrgRect.bottom= m_OrgRect.top  + (m_ShowRect.bottom-m_ShowRect.top);
		} 
		else
		{
			m_OrgRect.left = -(m_ShowRect.right-m_ShowRect.left);
			m_OrgRect.top  = m_ShowRect.top;

			m_OrgRect.right = m_ShowRect.left;
			m_OrgRect.bottom= m_OrgRect.top + (m_ShowRect.bottom-m_ShowRect.top);
		}

		XEle_SetRect(m_hCurrentPage,&m_OrgRect);

		XWnd_SetTimer(m_hWindow,m_IDTimer,m_uElapse);
		return 0;
	}

	int OnWndTimer(UINT nIDEvent,BOOL *pbHandled)
	{
		if (m_Index > 100)
		{
			XWnd_KillTimer(m_hWindow,m_IDTimer);
			XEle_ShowEle(m_hPrevPage,FALSE);
			m_Index = 0;
			return 0;
		}
		if (nIDEvent == m_IDTimer)
		{
			double s = m_expo.Out(m_Index,0,m_c,100);

			RECT rc1 = m_PrevRect;
			RECT rc2 = m_OrgRect;
			if (m_bDir)
			{//右到左
				rc2.left -= s;
				rc2.right-= s;
				rc1.left -= s;
				rc1.right-= s;
			} 
			else
			{//左到右
				rc2.left += s;
				rc2.right+= s;
				rc1.left += s;
				rc1.right+= s;
			}

			xtrace("%d %d | %d %d\n",rc1.left,rc1.right,rc2.left,rc2.right);
			XEle_SetRect(m_hCurrentPage,&rc2);
			XEle_SetRect(m_hPrevPage,&rc1);
			XWnd_RedrawWnd(m_hWindow);
			m_Index++;
		}
		return 0;
	}

private:
	HWINDOW m_hWindow;
	UINT m_IDTimer;
	UINT m_uElapse;

	RECT m_ShowRect;
	Expo m_expo;
	int  m_Index;
	int  m_c;   //改變量
	HELE m_hCurrentPage;
	RECT m_PrevRect;
	HELE m_hPrevPage;
	RECT m_OrgRect;

	BOOL m_bDir; //方向 true ->從右到左,否則從左到右

	std::map<HELE,int> m_map;
};



class CMyWindowElement
{
public:
    HWINDOW m_hWindow;

	HELE	m_hBtn1;
	HELE	m_hBtn2;
	HELE	m_hBtn3;
	HELE    m_hEle1;
	HELE	m_hEle2;
	HELE	m_hEle3;

	CPageSwitch m_pageSwitch;
    CMyWindowElement(){
        Init();
    }

    void Init()
    {
		XC_LoadResource(L"Animal\\resource.xml",L"Animal");
		m_hWindow = (HWINDOW)XC_LoadLayout(L"Animal\\layout.xml");
		
		m_hBtn1 = (HELE)XC_GetObjectByID(m_hWindow, 100);
		m_hBtn2 = (HELE)XC_GetObjectByID(m_hWindow, 101);
		m_hBtn3 = (HELE)XC_GetObjectByID(m_hWindow, 102);

		m_hEle1 = (HELE)XC_GetObjectByID(m_hWindow, 200);
		m_hEle2 = (HELE)XC_GetObjectByID(m_hWindow, 201);
		m_hEle3 = (HELE)XC_GetObjectByID(m_hWindow, 202);

		XEle_ShowEle(m_hEle2,FALSE);
		XEle_ShowEle(m_hEle3,FALSE);

		m_pageSwitch.Create(m_hWindow);
		m_pageSwitch.AddPage(m_hBtn1,m_hEle1,1);
		m_pageSwitch.AddPage(m_hBtn2,m_hEle2,2);
		m_pageSwitch.AddPage(m_hBtn3,m_hEle3,3);
		m_pageSwitch.SetDefaultPage(m_hEle1);

		RECT rtBody;
		XWnd_GetBodyRect(m_hWindow,&rtBody);
		m_pageSwitch.SetShowRect(rtBody);

		XWnd_AdjustLayout(m_hWindow);
        XWnd_ShowWindow(m_hWindow,SW_SHOW);
    }
};

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    XInitXCGUI();
    CMyWindowElement  MyWindowt;
    XRunXCGUI();
    XExitXCGUI();
    return 0;
}






這個是用的js裏面的tween算法,完整的工程代碼如下


http://download.csdn.net/detail/u012607841/9642499

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章