1. 程式人生 > >【VC編程技巧】窗口?3.6以漸變效果加載對話框

【VC編程技巧】窗口?3.6以漸變效果加載對話框

ng- 屏幕 運行 程序 true 周期性 利用 win rect

平時我們常常能夠看到非常多應用程序啟動過程非常酷。什麽百葉窗。漸變,各種效果,今天我們看一下怎樣在程序中添加這樣的效果。

一、演示樣例展示:

技術分享


技術分享


技術分享


二、演示樣例思路:


1.首先介紹兩個知識,一個是函數MoveWindow(),一個是定時器。

  • ? 函數MoveWindow():改變指定窗體的位置和大小.對頂窗體來說,位置和大小取決於屏幕的左上角;對子窗體來 說,位置和大小取決於父窗體客戶區的左上角。函數原形例如以下:
BOOL MoveWindow(
HWND hWnd,
int X,
int Y,
int nWidth,
int nHeight,
BOOL bRepaint
);

  • ?定時器:VisualC++自帶的一個組件。能夠依照一定的時間間隔周期性運行。詳細的相關函數例如以下:
SetTimer() :設置並啟動定時器
KillTimer() :關閉定時器
OnTimer() :定時器消息WM_TIMER對應函數


2.主要思路是。就是在窗體啟動時,設置定時器,在定時器WM_TIMER對應函數中,不斷地更新窗體。直到更新到我們預期的樣子。



三、演示樣例步驟:


1.在窗體初始化函數OnInitDialog()中。初始化窗體狀態。設置定時器。

// CDynamicStartDlg メッセージ ハンドラー

BOOL CDynamicStartDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// "バージョン情報..." メニューをシステム メニューに追加します。

	// IDM_ABOUTBOX は、システム コマンドの範囲內になければなりません。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// このダイアログのアイコンを設定します。

アプリケーションのメイン ウィンドウがダイアログでない場合、 // Framework は、この設定を自動的に行います。

SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 // TODO: 初期化をここに追加します。 //獲取對話框窗體的大小 this->GetWindowRect(&m_dlgRect); //獲取桌面窗體的大小 CWnd* pDestopWnd = GetDesktopWindow(); pDestopWnd->GetWindowRect(&m_destopRect); //初始化對話框的位置和大小(位置:桌面中心,大小:0) MoveWindow( (m_destopRect.Width()-m_dlgRect.Width())/2, (m_destopRect.Height()-m_dlgRect.Height())/2, 0, 0); //設置定時器,並啟動(5s) this->SetTimer(1, 5, NULL); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。

}



2.加入WM_TIMER的對應函數OnTimer(),在OnTimer()中更新窗體的狀態。達到預期的樣子時,就關閉定時器。

void CDynamicStartDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。

	CRect dlgRect;         //保存對話框窗體當前大小
	static int offsetX = 2;//更新對話框窗體狀態時的X增量
	static int offsetY = 2;//更新對話框窗體狀態時的Y增量

	switch (nIDEvent)
	{
	case 1:
		//獲取對話框窗體當前的大小
		this->GetWindowRect(&dlgRect);
		//更新對話框的位置和大小(利用:offsetX,offsetY)
		MoveWindow(
		(-offsetX + m_destopRect.Width() - dlgRect.Width())/2, 
		(-offsetY + m_destopRect.Height() - dlgRect.Height())/2,
		dlgRect.Width() + offsetX,
		dlgRect.Height() + offsetY);

		//X方向達到對話框窗體預期值,停止添加
		if (dlgRect.Width() >= m_dlgRect.Width())   offsetX = 0;
		//Y方向達到對話框窗體預期值,停止添加
		if (dlgRect.Height() >= m_dlgRect.Height()) offsetY = 0;
		//X。Y都達到對話框窗體預期值,關閉定時器
		if (dlgRect.Width() >= m_dlgRect.Width() && dlgRect.Height() >= m_dlgRect.Height())
		{
			this->KillTimer(nIDEvent);
		}
	default:
		break;
	}
	CDialogEx::OnTimer(nIDEvent);
}

P.S提供文章演示樣例代碼:http://download.csdn.net/detail/chenjintaoxp/7639411

【VC編程技巧】窗口?3.6以漸變效果加載對話框