让带图像的对话框渐进渐出

对话框上放置一幅图片,然后在对话框显示的时候,渐进渐出。
从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)保存工程并运行,就可以实现让带图像的对话框渐进渐出的效果了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值