[VC++ MFC] 如何在Dialog里点击按钮后在指定区域显示jpg图像?
原先没大在MFC里用过图像有点棘手先说一下条件1.VS2008,已经能够在Dialog里显示一张jpg图片,但是那个例子没有说如何用按钮触发显示事件2.使用了相关调用,可...
原先没大在MFC里用过图像
有点棘手
先说一下条件
1.VS2008,已经能够在Dialog里显示一张jpg图片,但是那个例子没有说如何用按钮触发显示事件
2.使用了相关调用,可以让jpg图片成为HBITMAP形式调用
目前就是要求能点击按钮后在指定区域显示jpg图像
而且点击另一个按钮能显示不同的图像,之前的图像能释放掉或是销毁
注意,是一个单纯的Dialog里,不是单文档或是多文档程序
先谢过
最好能给个按钮事件里的示例代码,问题结贴再加分~ 谢了 展开
有点棘手
先说一下条件
1.VS2008,已经能够在Dialog里显示一张jpg图片,但是那个例子没有说如何用按钮触发显示事件
2.使用了相关调用,可以让jpg图片成为HBITMAP形式调用
目前就是要求能点击按钮后在指定区域显示jpg图像
而且点击另一个按钮能显示不同的图像,之前的图像能释放掉或是销毁
注意,是一个单纯的Dialog里,不是单文档或是多文档程序
先谢过
最好能给个按钮事件里的示例代码,问题结贴再加分~ 谢了 展开
5个回答
展开全部
你可以使用CImage类实现,此类由MFC和ATL共享。
void CdlgDlg::OnBnClickedButton1()
{
//IDC_STATIC_IMAGE是你需要放置图片的静态控件ID
CDC * pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC();
CImage image;
//文件路径
image.Load(_T("c:\\image1.jpg"));
image.Draw(pDC->m_hDC, 0,0,100,100,0,0,100,100);//
}
如果你要循环显示图片,只需临时加载不同的图片即可,如
image.Load(_T("c:\\image2.jpg"));
//如有疑问,可以联系。
void CdlgDlg::OnBnClickedButton1()
{
//IDC_STATIC_IMAGE是你需要放置图片的静态控件ID
CDC * pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC();
CImage image;
//文件路径
image.Load(_T("c:\\image1.jpg"));
image.Draw(pDC->m_hDC, 0,0,100,100,0,0,100,100);//
}
如果你要循环显示图片,只需临时加载不同的图片即可,如
image.Load(_T("c:\\image2.jpg"));
//如有疑问,可以联系。
展开全部
放在对话框的OnPaint()函数即可。
CDC* pDC;
pDC=GetDC();
ShowPicture(pDC,"c:\\12.jpg",0,0,200,100);
#define HIMETRIC_INCH 2540
LPPICTURE gpPicture;
void CCDMADlg::ShowPicture(CDC *pDC, CString m_strBRoute, int x, int y, int width, int height)
{
HANDLE hFile =CreateFile(m_strBRoute, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
_ASSERTE(INVALID_HANDLE_VALUE != hFile);
// 取得文件大小
DWORD dwFileSize = GetFileSize(hFile, NULL);
_ASSERTE(-1 != dwFileSize);
LPVOID pvData = NULL;
//根据文件大小分配内存
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal);
pvData = GlobalLock(hGlobal);
_ASSERTE(NULL != pvData);
DWORD dwBytesRead = 0;
//读取文件并存入全局内存
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
_ASSERTE(FALSE != bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
LPSTREAM pstm = NULL;
// 通过全局内存创建 IStream* 的指针
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
_ASSERTE(SUCCEEDED(hr) && pstm);
//通过图形文件创建IPicture 对象
if (gpPicture)
gpPicture->Release();
hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
_ASSERTE(SUCCEEDED(hr) && gpPicture);
pstm->Release();
HDC hdc;
hdc=pDC->GetSafeHdc();
if (gpPicture)
{
// 取得图片的宽和高
long hmWidth;
long hmHeight;
gpPicture->get_Width(&hmWidth);
gpPicture->get_Height(&hmHeight);
//宽高转换为象素
int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
RECT rc;
GetClientRect(&rc);/*取得客户区*/
gpPicture->Render(hdc, x,y, (int)height*hmWidth/hmHeight,height, 0, hmHeight, hmWidth, -hmHeight, &rc);
/*显示图片*/
}
}
参考资料:http://www.cppblog.com/wanghaiguang/archive/2012/09/10/190136.html
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你的开发环境是vs2008及以上,有个类可以直接用:cimage
如果是vs2008以下,有很多方法实现的,搜索“vc显示jpg”
比如:http://bbs.csdn.net/topics/330265113
另外,点击按钮,你得会添加按钮点击的消息响应。
显示,你得先确定指定区域是一个控件的部分区域还是个别区域,这个区域什么时候刷新
刷新的时候,你的显示图片的代码是否生效:
一般来说在onpaint消息回调里添加显示代码,点击按钮时让窗口某区域“失效”(InvalidateRect),
再updatewindow即可。
关于cimage和上边网址上,及上边提到的API,可以去微软MSDN查询(http://msdn.microsoft.com/)。
如果是vs2008以下,有很多方法实现的,搜索“vc显示jpg”
比如:http://bbs.csdn.net/topics/330265113
另外,点击按钮,你得会添加按钮点击的消息响应。
显示,你得先确定指定区域是一个控件的部分区域还是个别区域,这个区域什么时候刷新
刷新的时候,你的显示图片的代码是否生效:
一般来说在onpaint消息回调里添加显示代码,点击按钮时让窗口某区域“失效”(InvalidateRect),
再updatewindow即可。
关于cimage和上边网址上,及上边提到的API,可以去微软MSDN查询(http://msdn.microsoft.com/)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1. 在对话框里放一个 Picture Control 控件, 修改一下 ID
2. 继承 MFC 的 CStatic 类生成一个新 的类,比如 CPicCtrl, 这个类里放一个变量, 用于区别是哪张图
3. 把显示图片的代码放到这个类的 WM_PAINT 处理函数里
4. 在对话框里右键那个 Picture Control ,生成新变量,类型改成新生成的类
5. 按按钮时改变一下类里的变量,再调用一下类的 RedrawWindow 就可以了
2. 继承 MFC 的 CStatic 类生成一个新 的类,比如 CPicCtrl, 这个类里放一个变量, 用于区别是哪张图
3. 把显示图片的代码放到这个类的 WM_PAINT 处理函数里
4. 在对话框里右键那个 Picture Control ,生成新变量,类型改成新生成的类
5. 按按钮时改变一下类里的变量,再调用一下类的 RedrawWindow 就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在控件编辑窗口双击你要写函数的按钮,程序会自动生成消息处理函数框架,名字是Onxxx(),你在这个函数里写显示图片的内容就行了,每次UpdateData都会覆盖之前显示的图片
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询