vc++图像显示

显示资源中的图片

(1)从资源中装入位图

● 定义位图对象数据成员CBitmap m_Bitmap;

● 调用CBitmap成员函数LoadBitmap(),如m_Bitmap.LoadBitmap(IDB_BITMAP1);

● 传入LoadBitmap的参数是位图在图形编辑器中生成或从位图文件中引入时赋予的识别符。

(2)生成与位图相联系的内存设备情境对象

CDC MemDC;

MemDC.CreateCompatibleDC(NULL);

MemDC.SelectObject(&m_Bitmap);

(3)显示位图

CClientDC ClientDC(this);

BITMAP BM;

m_Bitmap.GetObject(sizeof(BM),&BM);

ClientDC.BitBlt ( X,Y, //目标设备逻辑横、纵坐标

BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度

&MemDC, //待显示位图数据的设备情境对象

0,0, //源数据中的横、纵坐标

SRCCOPY); //位操作方式

特点:这种方法显示位图速度快,但不是很灵活,而且会使可执行文件增大。

显示磁盘中的图片

步骤:

HBITMAP *hBitmap; //定义位图对象句柄

BITMAP BM;

CDC MemDC;

CClientDC ClientDC(this);

MemDC.CreateCompatibleDC(&ClientDC);

hBitmap=(HBITMAP*):: LoadImage ( AfxGetInstanceHandle(), //取得应用程序句柄

“demo1.bmp”, //位图文件名

IMAGE_BITMAP, //类型为Windows位图

0,0, LR_LOADFROMFILE); //从文件中取位图数据

MemDC.SelectObject(hBitmap);

:: GetObject(hBitmap,sizeof(BM),&BM);

ClientDC.BitBlt(……) //使用格式与方法一同

特点:这种方法显示位图速度较之前一种慢了一点,但其灵活性较大,可以任意变换位图文件,而无需重新编译源程序, 也减小了可执行文件的大小。

程序模板

显示资源中的图片/在设备上下文中绘制图像[1]

法一

void COutputBmpView::OnDraw(CDC* pDC)

{

COutputBmpDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CDC memDC;//定义一个设备上下文

memDC.CreateCompatibleDC(pDC);//获取兼容的设备上下文

CBitmap bmp;

bmp.LoadBitmap(IDB_BKBITMAP);

memDC.SelectObject(&bmp);//选中位图对象

pDC->BitBlt(30,20,180,180,&memDC,1,1,SRCCOPY);//绘制位图

CRect rc(30,20,210,200);

CBrush brush(RGB(0,0,0));

pDC->FrameRect(rc,&brush);//绘制矩形边框

rc.OffsetRect(220,0);//移动区域

BITMAP BitInfo;

bmp.GetBitmap(&BitInfo);

int x = BitInfo.bmWidth;

int y = BitInfo.bmHeight;

pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),&memDC,0,0,x,y,SRCCOPY);//绘制位图

pDC->FrameRect(rc,&brush);

brush.DeleteObject();

memDC.DeleteDC();//释放设备上下文

bmp.DeleteObject();//释放文图对象

}

在磁盘中加载图像到窗口中[1]

CLoadBmpView::CLoadBmpView()//构造函数中

{

m_hBmp = LoadImage(NULL,"Demo.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//加载位图

}

void CLoadBmpView::OnDraw(CDC* pDC)

{

CLoadBmpDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CBitmap bmp;

bmp.Attach(m_hBmp);//将位图关联到位图句柄上

CDC memDC;

memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文

memDC.SelectObject(&bmp);//选中位图对象

BITMAP BitInfo;                                                                        //定义位图结构

bmp.GetBitmap(&BitInfo);                                                                //获取位图信息

int x = BitInfo.bmWidth;                                                                //获取位图宽度

int y = BitInfo.bmHeight;                                                                //获取位图高度

pDC->BitBlt(0,0,x,y,&memDC,0,0,SRCCOPY);//向窗口中绘制位图

bmp.Detach();//分离位图句柄

memDC.DeleteDC();//释放设备上下文

}

根据位图数据直接绘图[1]

char *m_pBmpData;//①在视图类中定义一个缓冲区

COutputStreamView::COutputStreamView()//②构造函数中读取文件到数据流中

{

CFile file;//定义文件对象

file.Open("bk.bmp",CFile::modeReadWrite);

int len = file.GetLength();

file.Seek(14,CFile::begin);        //*过位图文件头

m_pBmpData = new char[len-14];//为缓冲区分配空间

file.Read(m_pBmpData,len-14);//读取文件数据到缓冲区

file.Close();

}

COutputStreamView::~COutputStreamView()//③析构函数中释放缓冲区

{

delete [] m_pBmpData;

}

void COutputStreamView::OutputStream(char *pStream)//④添加的成员函数,用来根据数据流输出图像

{

char *pHeader =pStream ;//定义临时缓冲区

BITMAPINFO BitInfo;

memset(&BitInfo,0,sizeof(BITMAPINFO));//初始化位图信息对象

memcpy(&BitInfo,pHeader,sizeof(BITMAPINFO));//为位图信息对象赋值

int x = BitInfo.bmiHeader.biWidth;

int y = BitInfo.bmiHeader.biHeight;

pHeader+=40;//指向位图数据

StretchDIBits(GetDC()->m_hDC,0,0,x,y,0,0,x,y,pHeader,&BitInfo,DIB_RGB_COLORS,SRCCOPY);

}

void COutputStreamView::OnDraw(CDC* pDC)//⑥绘制图像

{

COutputStreamDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

OutputStream(m_pBmpData);//输出位图

}

显示JPEG图像[1]

①向视图类添加成员变量

IStream *m_pStream;                                        //定义流对象

IPicture *m_pPicture;                                //定义接口对象

OLE_XSIZE_HIMETRIC m_JPGWidth;                //图像宽度

OLE_YSIZE_HIMETRIC m_JPGHeight;                //图像高度

HGLOBAL hMem;                                                //堆句柄

CShowJPEGView::CShowJPEGView()//②构造函数:从磁盘中加载IPEG位图到流中

{

CFile file;

file.Open("angell.jpg",CFile::modeReadWrite);

DWORD len = file.GetLength();

hMem = GlobalAlloc(GMEM_MOVEABLE,len);//在堆中分配内存

LPVOID pData = NULL; //定义一个指针对象

pData = GlobalLock(hMem);//锁定内存区域

file.ReadHuge(pData,len);//读取图像数据到堆中

file.Close();//

GlobalUnlock(hMem);//解除对堆得锁定

CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);//在堆中创建流

OleLoadPicture(m_pStream,len,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);//加载图像

m_pPicture->get_Height(&m_JPGHeight);//获取图像高度

m_pPicture->get_Width(&m_JPGWidth);

}

void CShowJPEGView::OnDraw(CDC* pDC)//③绘制JPEG图像

{

CShowJPEGDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

m_pPicture->Render(pDC->m_hDC,0,0,(int)(m_JPGWidth/26.45),(int)(m_JPGHeight/26.45)

,0,m_JPGHeight,m_JPGWidth,-m_JPGHeight,NULL);        //绘制JPEG图像

}

时间: 2024-10-09 20:57:24

vc++图像显示的相关文章

什么值得买:一家论坛式导购网站的自我修养

什么值得买 的用户把这个网站亲切称为"色魔张大妈"(SMZDM演化而来),虽然这个昵称有些恶搞的成分,但这是一家我印象中这个时代为数不多的"正常"公司.它没有颠覆什么,但重新定义了什么是"值",并且改变了一大批人的消费习惯. 在电商领域,什么值得买从创立初始就在节奏与气质上特立独行,包括其至今都没有涉及"交易"环节.电商行业里,如果一家公司不擅长赶政策热点.赶创业故事热潮,很难在资本市场为自己谈到一个好价钱,没钱烧就没有资源支

在VC下显示JPEG、GIF格式图像的一种简便方法

在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛的认可.GIF格式虽然仅支持256色但它对于颜色较少的图像有着很高的压缩率,甚至超过JPEG标准,也得到了广泛的认同.但作为众多程序员的一个重要的开发工具--Microsoft Visual C++ 6.0的MFC库却仅对没有经过任何压缩的BMP位图文件有着良好的支持,可以读取.显示.存储甚至在内存

Windows下VC编译OpenDDS

OpenDDS是一个OMG组织DDS标准的C++开源实现,OpenDDS同时也提供Java支持.OpenDDS依赖ACE抽象层来提供不同平台的兼容性,同时也依赖于TAO(例如TAO的IDL编译器).当前OpenDDS有ociweb ObjectComputing维护,官方网站http://www.opendds.org/.目前OpenDDS支持的平台有Windows,Linux family,Android,VxWorks等,可用的编译器包括VC,gcc,QNX gcc等. 1. OpenDDS

一种利用ADO连接池操作MySQL的解决方案(VC++)

VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连接永远不关闭,直接数进程退出),但是这样做至少会引起两个问题:(1)资源竞争,多个数据库请求操作不能同时进行,后一请求必须要等到前一请求完成后才能进行:(2)多线程情况下容易出现混乱,甚至出现资源异常释放.还有一种方法,就是使用数据库时创建连接,使用完后关闭连接回收资源.这种方式在数据库操作频繁的情

VC客户端无法登陆都是REDO日志惹的祸

环境:VSPHERE5.5+独立oracle 11G数据库 现象:打开vcenter服务器控制台,输入密码后卡在欢迎界面无响应,客户端也无法正常登陆. 正常重启也不行.由于VC所在虚机为独立磁盘无法做快照,不能备当时状态. 查看所在WINDOWS系统日志发现硬件可能有问题. 这是偏移量,并不能代表硬件有问题,怀疑VC连接的数据库有问题,逐登陆排查.1.登陆11.15.146.2 首先查看数据库进程,正常. 2.查看数据库的告警日志,发现一个问题. 这个实际上是个比较常见的错误.通常来说是因为在日

【转载】COM 组件设计与应用(十四)——事件和通知(vc.net)

原文:http://vckbase.com/index.php/wv/1244.html 一.前言 我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者: 我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者: 我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者: ... ... ... ... 本回书开始话说 COM 的事件.通知.连接点......这些内容比较多,我分两次(共四回)来介绍. 二.通知的方法 当程序

VC++6.0中OpenGL应用程序开发

1. Win32控制台方式 建立Win32 控制台程序,在头文件中加入 #include <windows.h>  #include <wingdi.h>  #include <GL/gl.h>  #include <GL/glu.h >   #include <GL/glaux.h> 2. MFC方式 (1)采用VC AppWizard向导创建空的MFC(EXE)工程框架,整个过程总共6步,值得指出的是一般情况下在向导的第1步选择创建工程的模式

vc++6.0快捷键

Ctrl+m+Crtr+o折叠所有大纲 Ctrl+M+Crtr+P: 停止大纲显示 Ctrl+K+Crtr+C: 注释选定内容 Ctrl+K+Crtr+U: 取消选定注释内容 Ctrl+J : 列出成员 智能感知Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关 Ctrl+B,N / Ctrl+K,N: 移动到下一书签 Ctrl+B,P: 移动到上一书签 Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 

vc 制作图片资源dll

方法一: 使用纯WIN32 DLL方法封装纯资源第一步,通过VS2005建立WIN32 DLL 空工程第二步,设置配置属性->链接器->高级->无入口点(是/NOENTRY)设置配置属性->C/C++->代码生成->运行时库(多线程/MT)第三步,加入图片资源并定义资源名称第四步,生成DLL,如Skin.DLL第五步,调用方法例子HINSTANCE hLibrary; if ((hLibrary = LoadLibrary (TEXT ("skin.DLL&q