MFC对话框动态刷新图片(仿照全屏屏保)

最近做MFC对话框工程 用到全屏刷新图片的功能,由于功能实现比较简单,便使用CImage类配合定时器制作,下面贴上实现方式:

增加消息响应事件:

//在对话框属性的消息中 添加WM_PAINT与WM_TIMER
//消息响应函数原型
afx_msg void OnPaint();
afx_msg void OnTimer(UINT_PTR nIDEvent);

增加初始化函数:

//在对话框属性的重写中 添加OnInitDialog
//初始化函数原型
virtual BOOL OnInitDialog();

.h文件定义:

//获取图片路径 这里用CString数组保存多张图片路径
bool GetPath(CStringArray & StrPath);
//保存图片的路径
CStringArray m_StrPath;
//记录当前加载哪张图片
int m_nNum;

.cpp文件实现:

//首先在OnInitDialog()函数中添加图片计数的初始化、图片路径以及启动定时器
BOOL CTestSTLFileDlg::OnInitDialog()
{
    m_nNum = 0;
    //全屏显示
    ShowWindow(SW_MAXIMIZE);
    //获取图片路径
    GetPath(m_StrPath);
    //启动定时器
    SetTimer(1,1000,NULL);
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


//在OnPaint()函数的else 中添加图片绘制部分
void CTestSTLFileDlg::OnPaint()
{
if()//主对话框中自动生成,如果是子对话框 直接拷贝下面else内的代码就行
{
}
else
{
        CPaintDC dc(this); // 用于绘制的设备上下文
        CRect _GetGroup;
        this->GetWindowRect(_GetGroup);
        CImage image;  
        //这里用了2张图片做演示
        image.Load(m_StrPath.GetAt(m_nNum++ %2));               image.Draw(dc.GetSafeHdc(),_GetGroup.left,_GetGroup.top,_GetGroup.right,_GetGroup.bottom);
        if (!image.IsNull())
        {
            image.Destroy();
        }
        CDialogEx::OnPaint();
}
}


//获取图片路径函数
bool CTestSTLFileDlg::GetPath(CStringArray & StrPath)
{
    TCHAR strTemp[MAX_PATH];
    GetCurrentDirectory(MAX_PATH,strTemp);
    //测试增加2张图片
    for (int i = 0;i < 2;i++)
    {
        CString str;
        str.Format(_T("%s\\res\\test%d.png"),strTemp,i + 1);
        //保存图片路径
        StrPath.Add(str);
    }
    return true;
}


//定时器函数
void CTestSTLFileDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    if (1 == nIDEvent)
    {
        //重绘图片
        Invalidate(TRUE);
    }
    CDialogEx::OnTimer(nIDEvent);
}


//在析构函数或者退出函数中释放定时器
CTestSTLFileDlg::~CTestSTLFileDlg()
{
    KillTimer(1);
}

到这里对话框动态刷新图片功能基本完成,剩下还需要在主类(与工程名相同的类)中增加GDI启动函数;

主类的.cpp中增加:

 //全局变量
 ULONG_PTR m_gdi;

 //构造函数或者初始化函数中增加GDI启动
CTestSTLFileApp::CTestSTLFileApp()
{
    // 将所有重要的初始化放置在 InitInstance 中
    Gdiplus::GdiplusStartupInput out;
    Gdiplus::GdiplusStartup(&m_gdi,&out,NULL);

}

//在析构函数或者退出函数中释放GDI内存
CTestSTLFileApp::~CTestSTLFileApp()
{
    Gdiplus::GdiplusShutdown(m_gdi);
}

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/79049083