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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)