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

一、演示样例展示:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbl9qaW50/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

二、演示样例思路:

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

最新文章

  1. Javascript 相关文章 —— 性能
  2. 由java的八个基本数据类型说开去
  3. iOS游戏截图或广告图尺寸要求
  4. DDD学习笔记一
  5. cocos2dx 2.x 版本+Windows+ADT Bundle 配置
  6. lintcode:1-10题
  7. css中将div定位居中
  8. ORA-16014: 日志 1 的序列号 242 未归档, 没有可用的目的地
  9. Hadoop集群运行JNI程序
  10. Apple Watch程序开发30分钟秒懂
  11. Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
  12. tornado with MySQL, torndb, django model, SQLAlchemy ==&gt; JSON dumped
  13. Python CGI编程和CGIHTTPServer
  14. 就是要你懂Java中volatile关键字实现原理
  15. 《Github入门与实践》读书笔记 蟲咋先生的追求之旅(上)
  16. java的OutOfMemoryError: PermGen space实战剖析
  17. 【T10】记住,TCP__IP不是轮询的
  18. GitHub学习四-查看版本库信息
  19. elastastic search
  20. 详述MSSQL服务在渗透测试中的利用(上篇)

热门文章

  1. PCB 电测试--测试点数自动输出到流程指示中(读取TGZ Stephdr文件)
  2. Largest Rectangle in a Histogram(dp)
  3. Phoenix与Squirrel 是什么?
  4. vs2008bin下Debug bll Release文件 obj下的Debug bll Release文件区别
  5. Java基础13一异常
  6. Windows 10 新功能
  7. OpenCV中的模板匹配/Filter2d
  8. css单双行样式
  9. Memcached 之取模与哈希算法命中率实验
  10. js俄罗斯方块