MFC加载动态gif图片的欢迎界面

MFC加载动态gif图片的欢迎界面,第1张

要做到你的需求,你需要如下技术积累:

1、自己解码或者找到系统库,或者第三方库,解析一个gif格式的图片

gif格式的图片解析之后会得到多张图片,多个时间延迟信息。

2、往界面上画图。

如果你使用bmp是直接在资源里引入 位图的方式,那你还需要学习下如何手动自绘一张图片,结合第一个技术点,就可以实现你的需求了

多张图切换,需要你控制时间间隔,重复刷新绘制。

给你个例子 利用流

工程基于对话框 名字是IPicture 建好工程后 加入下面的代码 就可以显示图片了

// IPictureDlg.h : 头文件

BOOL DisplayPic(CString strFileName, HWND hWnd, int nScrWidth, int nScrHeight)

// IPictureDlg.cpp : 实现文件

BOOL CIPictureDlg::DisplayPic(CString strFileName, HWND hWnd, int nScrWidth, int nScrHeight)

{

HDC hDC=::GetDC(hWnd)

IPicture *pPicture

IStream *pStream

HRESULT hResult

HANDLE hFile = NULL

DWORD dwFileSize,dwByteRead

hFile = CreateFile(strFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)

if (hFile == INVALID_HANDLE_VALUE)

{

return E_FAIL

}

dwFileSize = GetFileSize(hFile, NULL)

HGLOBAL hGlobal = ::GlobalAlloc(GHND, dwFileSize)

if(hGlobal == NULL)

{

AfxMessageBox("图形文件装载出错!")

return E_FAIL

}

LPVOID lpData = NULL

lpData = ::GlobalLock(hGlobal)

ReadFile(hFile, lpData, dwFileSize, &dwByteRead, NULL)

::GlobalUnlock(hGlobal)

if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) != S_OK)

{

AfxMessageBox("流初始化失败!")

return E_FAIL

}

hResult = OleLoadPicture(pStream, dwFileSize, TRUE, IID_IPicture, (LPVOID*) &pPicture)

if(FAILED(hResult))

{

AfxMessageBox("图形文件装载出错!")

return E_FAIL

}

OLE_XSIZE_HIMETRIC hmWidth//图片的真实宽度

OLE_YSIZE_HIMETRIC hmHeight//图片的真实高度

pPicture->get_Width(&hmWidth)

pPicture->get_Height(&hmHeight)

//将图形输出到屏幕上

hResult = pPicture->Render(hDC, 0, 0, nScrWidth, nScrHeight, 0, hmHeight, hmWidth, -hmHeight, NULL)

CloseHandle(hFile)//关闭打开的文件

pPicture->Release()

// Free memory.

::GlobalFree(hGlobal)

if (SUCCEEDED(hResult))

{

return S_OK

}

else

{

AfxMessageBox("图形文件装载出错!")

return E_FAIL

}

}

void CIPictureDlg::OnBnClickedOk()

{

// TODO: 在此添加控件通知处理程序代码

static char szFilter[] = "JPG Files (*.jpg)|*.jpg|BMP Files (*.bmp)|*.bmp|GIF Files (*.gif)|*.gif|All Files (*.*)|*.*||"

CFileDialog dlg(TRUE, "BMP", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter)

if(dlg.DoModal() != IDOK)

return

CRect rect

GetDlgItem(IDC_STATIC)->GetWindowRect(rect)

DisplayPic(dlg.GetPathName(),GetDlgItem(IDC_STATIC)->GetSafeHwnd(), rect.Width(), rect.Height())

}

void CMFCApplication2Dlg::OnPaint()

{

if (IsIconic())

{

//...

else

{

CPaintDC dc(this) // device context for painting

CPoint Pt[7]

Pt[0] = CPoint(20+m_incr, 50)

Pt[1] = CPoint(180+m_incr, 50)

Pt[2] = CPoint(180+m_incr, 20)

Pt[3] = CPoint(230+m_incr, 70)

Pt[4] = CPoint(180+m_incr, 120)

Pt[5] = CPoint(180+m_incr, 90)

Pt[6] = CPoint(20+m_incr, 90)

dc.Polygon( Pt, 7)

CDialogEx::OnPaint()

}

} void CMFCApplication2Dlg::OnBnClickedButton1()//Move Arrow button

{

if ( m_nTimer )

{

KillTimer( m_nTimer )

m_nTimer = NULL

}

else

m_nTimer = SetTimer(1, 20, 0)

}

void CMFCApplication2Dlg::OnTimer(UINT_PTR nIDEvent)

{

m_incr += 3

Invalidate()

CDialogEx::OnTimer(nIDEvent)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11922460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存