在对话框显示图片的多种方法(下)
承接上篇,介绍了三种方法,本篇将介绍动态载入图片的另一种方法:
方法4 通过CBitmap,HBITMAP,直接用OnPaint()绘制
首先在CTestDlg类中声明一个变量: CBitmap m_bmp;
然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1
然后:
BOOL CDisplayPic::OnInitDialog()
{
CDialog::OnInitDialog();
if( m_bmp.m_hObject != NULL )//判断
m_bmp.DeleteObject();
/载入图片
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
"c://aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if( hbmp == NULL )
return FALSE;
///该断程序用来取得加载的BMP的信息
m_bmp.Attach( hbmp );
DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;
m_bmp.GetObject( sizeof(ds), &ds );
int cx=bminfo.biWidth; //得到图像宽度
int cy=bminfo.biHeight; //得到图像高度
///
/得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///
CRect rect;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);
ScreenToClient(&rect);
GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息
void CDisplayPic::OnPaint()
{
//以下三种情况任选一种会是不同效果(只能一种存在)///
//CPaintDC dc(this); //若用此句,得到的是对话框的DC,图片将被绘制在对话框上.
CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用此句,得到picture控件的DC,图像将被绘制在控件上
// CDC dc;
// dc.m_hDC=::GetDC(NULL); //若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上///
CRect rcclient;
GetDlgItem(IDC_STATIC1)->GetClientRect(&rcclient);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
memdc.SelectObject( &bitmap );
CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
CDC maskdc;
maskdc.CreateCompatibleDC(&dc);
CBitmap maskbitmap;
maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);
maskdc.SelectObject( &maskbitmap );
maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,
rcclient.left, rcclient.top, SRCCOPY);
CBrush brush;
brush.CreatePatternBrush(&m_bmp);
dc.FillRect(rcclient, &brush);
dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
&memdc, rcclient.left, rcclient.top,SRCPAINT);
brush.DeleteObject();
// Do not call CDialog::OnPaint() for painting messages
}
以上四种方法唯有KoDak可以支持多种图像,其它的只支持BMP
如果读者有兴趣可以向我索要以上方法的全部例程.
信箱: zhucde@jxfw.com
应广大朋友的建议,特将所有例程打包,放在以下地址供下载:
http://www.7forever.com/c3d/study/pictest.rar
其中,直接绘制的程序为对话框自适应图片大小,不是文章中Static自适应大小
在对话框显示图片的多种方法(下)相关推荐
- 在对话框显示图片的多种方法(上)
我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基 ...
- 在对话框显示图片的多种方法
我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基 ...
- 前端页面显示图片的多种方法小结
对我使用过的前端显示图片的方法进行小总结,作为以后参考的依据. 说在前面的话:关于这几种实现方式,有可能原理是一样的,而且肯定有更优的实现方式.因为时间关系我没有进行深入研究,如果哪里写的不对,请多多 ...
- PowerShell隐藏不显示窗口的多种方法
转载 https://www.jb51.net/article/68186.htm 隐藏不显示窗口的多种方法这篇文章主要介绍了PowerShell隐藏不显示窗口的多种方法,本文讲解了启动PowerSh ...
- 苹果手机不显示图片的解决方法
苹果手机不显示图片的解决方法 给图片设置下大小就有了.. 查看原文:http://newmiracle.cn/?p=508
- python图显示在新的窗口_python在新的图片窗口显示图片(图像)的方法
python在新的图片窗口显示图片(图像)的方法 使用python画图,发现生成的图片在console里.不仅感觉很别扭,很多功能也没法实现(比如希望在一幅图里画两条曲线). 想像matlab一样单独 ...
- 文本文档写html图片显示不出来,word文档几种不显示图片的解决方法
word文档几种不显示图片的解决方法 我们在Word文档添加图片的时候,常常会遇到图片显示不出来的情况,那么这个时候应该怎么办呢?下面就来和小编一起看看word文档几种不显示图片的解决方法吧. 1.可 ...
- android显示图片部分区域,Android编程实现只显示图片一部分的方法
本文实例讲述了Android编程实现只显示图片一部分的方法.分享给大家供大家参考,具体如下: 在Android应用程序中加载一张图片,然后把它显示出来这是一件非常容易的事情,那怎么才能显示一张图片的一 ...
- php图片横排,Discuz板块横排显示图片的实现方法_php技巧
Discuz板块横排显示图片的实现方法_php技巧 到你目前在使用的模板中寻找 discuz.htm 找到这一段代码: onMouseOver="this.className='altbg1 ...
最新文章
- 抗生素抗性基因研究进展PPT分享
- python处理表格数据-python通过xrld库读取表格数据
- Sqlserver中查询存储过程是否包含某些文本
- postgresql数据库增删改:使用pgadmin以及SQL语句来实现
- 1.5 引入解释性变量
- BASH Shell 简易进度条小函数
- Visual Studio 2008单元测试实践一
- LeetCode 543二叉树的直径-简单
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- 分布式系统设计理念为何这么难学?
- 20180602_Eclipse配置Maven的本地仓库和阿里云镜像
- 管理感悟:掌握写文档的技能
- memcached在项目中的应用
- 计算机无法安装ae,Windows10系统AE软件无法安装如何处理
- 识别圆的强化RANSAC算法
- 分析对象竞是我自己?我在 9 月上班划水 1510 分钟!
- 延迟队列DelayQueue原理
- 目前全网最详细的树莓派 Pico入门指南!
- QQ空间热修复原理深入解析
- 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...