MFC动态加载JPG图片,作为对话框背景图片,且每隔10秒显示一次

梦境传说 梦境传说 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我现在有个测试代码,编译运行都是正确的,不过是通过资源的方式导入JPG图片的。现在要动态加载图片,不要下面的资源导入。

运行的效果也是正确的:现在就是怎么改成动态加载:



下面是我的测试代码:
.h 文件:
public:
UINT IDJPG[4];
int i;
int m_iPic;
CBrush m_brBk;
CBitmap bmp;

CPoint pt;
CPen pen;
CBrush cbrush;


.cpp 文件:
初始化工作:
CTestJPGDlg::CTestJPGDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestJPGDlg::IDD, pParent)
{
IDJPG[0] = IDR_JPG1;
IDJPG[1] = IDR_JPG2;
IDJPG[2] = IDR_JPG3;
IDJPG[3] = IDR_JPG4;
i = 0;
m_iPic = 1;

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


BOOL CTestJPGDlg::OnInitDialog()
{
…………
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

//初始化一个画笔-------------------------------
pen.CreatePen(PS_INSIDEFRAME,1,RGB(255,0,0));

SetTimer(1, 1000, NULL);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CTestJPGDlg::OnPaint()
{
DrawCircle();

CPaintDC dc(this);
}

void CTestJPGDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

if (nIDEvent == 1)
{
pt.x=(long)rand()%100+30;
pt.y=(long)rand()%100+30;

DrawCircle();

i++;
m_iPic++;

if ( i == 4 )
{
i = 0;
}

if ( m_iPic == 40 )
{
m_iPic = 0;
}

/*if (m_iPic < 80)
{
m_iPic++;
}*/
}

CDialog::OnTimer(nIDEvent);
}

BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Gdiplus::Image * &pImg)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); //type
if (!hRsrc)
{
return FALSE;
}

// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
{
return FALSE;
}

// Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
// load from stream
pImg=Gdiplus::Image::FromStream(pstm);
// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);

return TRUE;
}

//画图函数-------------------------
void CTestJPGDlg::DrawPicture(void)
{
m_brBk.DeleteObject();
bmp.DeleteObject();

Image *pBackImage = NULL;
//int index = min(4,m_iPic/10);

if ( ImageFromIDResource(/*IDJPG[index]*/IDJPG[m_iPic/10],_T("JPG"),pBackImage) )
{
CDC *pDC = GetDC();
Graphics graph(pDC->m_hDC);

CRect rect;
GetClientRect(&rect);
Rect rectClient(rect.left,rect.top,rect.Width(),rect.Height());

graph.DrawImage(pBackImage,rectClient);
ReleaseDC(pDC);
}

//pDC->FillRect(rect,&m_brBk);
}

//画圆函数---------------------
void CTestJPGDlg::DrawCircle()
{
DrawPicture();

CDC *pDC = GetDC();

CPen *pPen = pDC->SelectObject(&pen);
cbrush.CreateSolidBrush(RGB(255,0,0));
CBrush *poldbrush = pDC->SelectObject(&cbrush);
pDC->Ellipse(pt.x-30,pt.y-30,pt.x+30,pt.y+30);

//Sleep(500); //不用这个
//Sleep(500);
pDC->SelectObject(poldbrush);
pDC->SelectObject(pPen);

//Invalidate();

cbrush.DeleteObject();
ReleaseDC(pDC);
}

HBRUSH CTestJPGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: 在此更改 DC 的任何属性

// TODO: 如果默认的不是所需画笔,则返回另一个画笔

if (pWnd == this)
{
return m_brBk;
}

return hbr;
}


现在是,主要修改画图函数中的这句话ImageFromIDResource(/*IDJPG[index]*/IDJPG[m_iPic/10],_T("JPG"),pBackImage)
改成绝对路径。。。 但是我运行是对的,没有显示?
我把JPG图片放在res中建立的一个文件夹:C:\E\Project\TestJPG\TestJPG\res\JPG

望,高手们指点。怎么稍微修改代码,实现动态加载JPG图片。。。
...全文

相关推荐

MFC背景图片实现:WM_ERASEBKGND、OnPaint与CBrush三种绘制方法

在Windows图形界面开发中,窗口背景的自定义是提升应用视觉体验的常见需求。其底层实现依赖消息循环中的背景擦除与重绘机制,通过WM_ERASEBKGND、OnPaint等消息处理函数,开发者可以控制窗口背景的绘制逻辑。合理运用这些技术能有效避免闪烁,并支持图片拉伸、平铺等多样化显示效果。在MFC框架中,背景图片通常不是独立控件,而是通过CBitmap加载位图资源,再结合BitBlt、StretchBlt或CBrush画刷完成绘制。面向维护老工程或初次在MFC对话框添加背景的开发者,从工程配置、图片资源导入

兔肉菌

SKINSHARP皮肤引擎:MFC界面个性化定制

SKINSHARP是一个专为开发者设计的皮肤引擎,它提供了强大的自定义UI元素和视觉效果的能力。开发者可以利用SKINSHARP来实现高度可定制的用户界面,使得应用能够更好地融入用户的个性化需求中。引擎底层支持多种渲染技术,确保在不同平台和设备上均有良好的兼容性和表现力。接下来,我们将深入探讨其文件格式解析、布局信息设置、字体样式定义、动画效果展示以及优化和设计原则。

有调App

基于树莓派与SDL2的交互式雪花球:嵌入式图形应用开发实践

在嵌入式系统开发中,图形用户界面(GUI)和实时交互是实现丰富用户体验的关键技术。其核心原理在于通过图形库(如SDL2)进行帧缓冲区的绘制与更新,并结合输入事件处理库(如libevdev)捕获用户操作,从而在资源受限的设备上实现流畅的动画与响应。这项技术的价值在于能够将复杂的视觉反馈与用户输入紧密结合,为智能家居、工业控制面板、信息终端等场景提供直观的人机交互界面。本文以“交互式雪花球”这一具体项目为例,详细阐述了如何在树莓派(Raspberry Pi)平台上,利用SDL2图形库进行雪花飘落动画的渲染,并通

weixin_33708432

政府科技管理者如何提升区域科技成果转化成功率?.docx

政府科技管理者如何提升区域科技成果转化成功率?

BIZKEEN

LangGraph与Graphviz集成:生成高质量静态图

内容概要:展示如何将LangGraph图导出为Graphviz DOT格式,生成PNG/SVG。通过自定义布局和样式,呈现清晰的流程图。对比Mermaid,讨论适用场景。 0533zbyy.com 0595ty.cn www.zh-casting.com yobest2.com 10cd.cn

2601_96960507
评论 9
收藏 已收藏
分享
返回顶部
梦境传说
界面 15,976 成员 115,866 内容