最近做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);
}
转载自原文链接, 如需删除请联系管理员。
原文链接:MFC对话框动态刷新图片(仿照全屏屏保),转载请注明来源!