• 【VC编程技巧】窗口☞3.6以渐变效果加载对话框


    平时我们常常能够看到非常多应用程序启动过程非常酷。什么百叶窗。渐变,各种效果,今天我们看一下怎样在程序中添加这样的效果。

    一、演示样例展示:







    二、演示样例思路:


    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

  • 相关阅读:
    设计模式六大原则(PHP)
    composer update 或者 composer install提示killed解决办法
    运行composer出现do not run Composer as root/super user!
    composer install报错intervention/image 2.4.x-dev requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.
    laravel执行数据库迁移的过程中出现IlluminateDatabaseQueryException : SQLSTATE[HY000] [2002] Operation timed out (SQL: select * from information_schema.tables where table_schema = shop and table_name = migrations
    docker删除mysql镜像失败Error response from daemon: conflict: unable to delete 8809d5286227 (must be forced)
    测试开发岗,面试必看
    Python遍历字典去key和value需要注意的点→enumerate和items()
    Python→整数反转
    我去阿里、头条、京东的面试经(测开)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6918759.html
Copyright © 2020-2023  润新知