对话框上放置一幅图片,然后在对话框显示的时候,渐进渐出。
从CDialog继承一个对话框类,然后在初始化函数里加载位图,不调整对话框大小和图片一样大,最后在时间事件处理函数中调用AlphaBleed函数实现渐进渐出。
(1)新建一个基于对话框的MFC应用程序InAndOutPictureDlgTest,删除对话框中原有控件。
(2)切换到资源视图,新建一个对话框IDD_ALPHASPLASH,设置去Boarder属性为None,然后为其添加类CAlphaSplashDlg。
(3)为CAlphaSplashDlg添加OnInitDialog函数,加载位图并调整对话框大小,代码如下:
BOOL CAlphaSplashDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
m_bf.BlendOp = AC_SRC_OVER;
m_bf.BlendFlags = 0;
m_bf.SourceConstantAlpha = 0;
m_bf.AlphaFormat = 0;
m_bitmap.LoadBitmap(IDB_SPLASH);
BITMAP BitMap;
m_bitmap.GetBitmap(&BitMap);
m_nWidth = BitMap.bmWidth;
m_nHeight = BitMap.bmHeight;
SetWindowPos(NULL, 0,0,m_nWidth, m_nHeight, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW);
m_nCount = 0;
CenterWindow();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
(4)为CAlphaSplashDlg添加OnTimer,随着时间的变化不断改变透明程度,通过AlphaBlend来实现,代码如下:
void CAlphaSplashDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
static int temp = 0;
if (temp > 255 - 10)
{
temp = 0;
KillTimer(1);
ShowWindow(SW_HIDE);
}
else
{
m_nCount += 4;
temp += (m_nCount/100);
m_bf.SourceConstantAlpha = temp + 10;
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap *pOldBitmap = dcMem.SelectObject(&m_bitmap);
AlphaBlend(dc, 0,0, m_nWidth, m_nHeight, dcMem, 0,0,m_nWidth, m_nHeight,m_bf);
dcMem.SelectObject(pOldBitmap);
}
CDialog::OnTimer(nIDEvent);
}
(5)再分别增加两个成员函数,以供外部方便调用。
void CAlphaSplashDlg::Create(CWnd *pParent)
{
CDialog::Create(CAlphaSplashDlg::IDD, pParent);
}
void CAlphaSplashDlg::OnInitSplash()
{
m_nCount = 0;
::SetTimer(m_hWnd, 1, 50, NULL);
}
非模态对话框调用方式。
(6)切换到资源视图,在IDD_INANDOUTPICTUREDLGTEST_DIALOG对话框上放置一个按钮“显示渐进渐出对话框”,添加按钮事件代码如下:
void CInAndOutPictureDlgTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_pSplash->OnInitSplash();
m_pSplash->ShowWindow(SW_SHOW);
}
(7)为了一开始就出现渐变对话框,在 CInAndOutPictureDlgTestDlg::OnInitDialog中添加代码如下:
m_pSplash = new CAlphaSplashDlg;
m_pSplash->Create(this);
m_pSplash->OnInitSplash();
m_pSplash->ShowWindow(SW_SHOW);
(8)为添加销毁函数,实现对m_pSplash的销毁,代码如下:
void CInAndOutPictureDlgTestDlg::OnDestroy()
{
CDialogEx::OnDestroy();
// TODO: 在此处添加消息处理程序代码
delete m_pSplash;
}
(9)保存工程并运行,就可以实现让带图像的对话框渐进渐出的效果了。