MFC动态加载JPG图片,作为对话框背景图片,且每隔10秒显示一次,该怎么解决
MFC动态加载JPG图片,作为对话框背景图片,且每隔10秒显示一次
我现在有个测试代码,编译运行都是正确的,不过是通过资源的方式导入JPG图片的。现在要动态加载图片,不要下面的资源导入。
运行的效果也是正确的:现在就是怎么改成动态加载:
下面是我的测试代码:
.h 文件:
.cpp 文件:
初始化工作:
我现在有个测试代码,编译运行都是正确的,不过是通过资源的方式导入JPG图片的。现在要动态加载图片,不要下面的资源导入。
运行的效果也是正确的:现在就是怎么改成动态加载:
下面是我的测试代码:
.h 文件:
- C/C++ code
public: UINT IDJPG[4]; int i; int m_iPic; CBrush m_brBk; CBitmap bmp; CPoint pt; CPen pen; CBrush cbrush;
.cpp 文件:
初始化工作:
- C/C++ code
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); }
- C/C++ code
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; }