首页 > 代码库 > 【VC编程技巧】窗体?3.6以渐变效果载入对话框
【VC编程技巧】窗体?3.6以渐变效果载入对话框
平时我们经常可以看到很多应用程序启动过程很酷,什么百叶窗,渐变,各种效果,今天我们看一下如何在程序中增加这种效果。
一、示例展示:
二、示例思路:
1.首先介绍两个知识,一个是函数MoveWindow(),一个是定时器。
- 函数MoveWindow():改变指定窗口的位置和大小.对顶窗口来说,位置和大小取决于屏幕的左上角;对子窗口来 说,位置和大小取决于父窗口客户区的左上角。函数原形如下:
HWND hWnd,
int X,
int Y,
int nWidth,
int nHeight,
BOOL bRepaint
);
- 定时器:VisualC++自带的一个组件,可以按照一定的时间间隔周期性执行。具体的相关函数如下:
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提供文章示例代码:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。