[VC++ MFC] 如何在Dialog里点击按钮后在指定区域显示jpg图像?

原先没大在MFC里用过图像有点棘手先说一下条件1.VS2008,已经能够在Dialog里显示一张jpg图片,但是那个例子没有说如何用按钮触发显示事件2.使用了相关调用,可... 原先没大在MFC里用过图像
有点棘手

先说一下条件
1.VS2008,已经能够在Dialog里显示一张jpg图片,但是那个例子没有说如何用按钮触发显示事件
2.使用了相关调用,可以让jpg图片成为HBITMAP形式调用

目前就是要求能点击按钮后在指定区域显示jpg图像
而且点击另一个按钮能显示不同的图像,之前的图像能释放掉或是销毁

注意,是一个单纯的Dialog里,不是单文档或是多文档程序
先谢过
最好能给个按钮事件里的示例代码,问题结贴再加分~ 谢了
展开
 我来答
cgsd2004
推荐于2016-11-22 · TA获得超过419个赞
知道小有建树答主
回答量:518
采纳率:55%
帮助的人:405万
展开全部
你可以使用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"));

//如有疑问,可以联系。
sun1yu1jia1
推荐于2018-05-10 · TA获得超过1066个赞
知道小有建树答主
回答量:1178
采纳率:62%
帮助的人:531万
展开全部

放在对话框的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

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
龚炜林
2015-05-22 · TA获得超过1560个赞
知道大有可为答主
回答量:1102
采纳率:66%
帮助的人:578万
展开全部
如果你的开发环境是vs2008及以上,有个类可以直接用:cimage
如果是vs2008以下,有很多方法实现的,搜索“vc显示jpg”
比如:http://bbs.csdn.net/topics/330265113
另外,点击按钮,你得会添加按钮点击的消息响应。
显示,你得先确定指定区域是一个控件的部分区域还是个别区域,这个区域什么时候刷新
刷新的时候,你的显示图片的代码是否生效:
一般来说在onpaint消息回调里添加显示代码,点击按钮时让窗口某区域“失效”(InvalidateRect),
再updatewindow即可。

关于cimage和上边网址上,及上边提到的API,可以去微软MSDN查询(http://msdn.microsoft.com/)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sqrn
2010-01-28 · 超过12用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:0
展开全部
1. 在对话框里放一个 Picture Control 控件, 修改一下 ID
2. 继承 MFC 的 CStatic 类生成一个新 的类,比如 CPicCtrl, 这个类里放一个变量, 用于区别是哪张图
3. 把显示图片的代码放到这个类的 WM_PAINT 处理函数里
4. 在对话框里右键那个 Picture Control ,生成新变量,类型改成新生成的类
5. 按按钮时改变一下类里的变量,再调用一下类的 RedrawWindow 就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
thomasez
2010-01-28 · TA获得超过511个赞
知道小有建树答主
回答量:411
采纳率:0%
帮助的人:263万
展开全部
在控件编辑窗口双击你要写函数的按钮,程序会自动生成消息处理函数框架,名字是Onxxx(),你在这个函数里写显示图片的内容就行了,每次UpdateData都会覆盖之前显示的图片
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式