VC++6.0 中BMP位图的读取和显示
2010-04-15 15:39
537 查看
Windows中位图有两种格式,一种是“设备相关”位图(Device Depend
Bitmap,DDB),另一种是“设备无关”位图(Device Independ Bitmap,DIB)。
一、DDB位图的显示
DDB位图的显示很简单,将文件内容拷贝到内存中,然后可以很方便地将它粘贴到相关设备中,用BitBlt函数直接显示。首先改写视图类中的
OnFileOpen()函数,从文件装载位图到内存中。m_pBmp是CBitmap指针变量,得到该指针后,就可以在OnDraw()函数中显示位图
了。
void
CBmpDemoView::OnFileOpen()
{
//
TODO: Add your command handler code here
char
szFilter[]
=
"
Bitmap(*.BMP)|*.BMP||
"
;
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
if
(dlg.DoModal()
==
IDOK)
{
CString filename
=
dlg.GetPathName();
HBITMAP hBitmap
=
(HBITMAP)::LoadImage(NULL,szPathName,IMAGE_BITMAP,
0
,
0
,LR_LOADFROMFILE);
m_pBmp
=
new
CBitmap();
m_pBmp
->
Attach(hBitmap);
}
}
void
CBmpDemoView::OnDraw(CDC
*
pDC)
{
CBmpDemoDoc
*
pDoc
=
GetDocument();
ASSERT_VALID(pDoc);
//
TODO: add draw code for native data here
CDC dcMemory;
CBitmap
*
pOldBmp;
dcMemory.CreateCompatibleDC(pDC);
pOldBmp
=
dcMemory.SelectObject(m_pBmp);
pDC
->
BitBlt(m_orgpoint.x,m_orgpoint.y,m_size.cx,m_size.cy,
&
dcMemory,
0
,
0
,SRCCOPY);
dcMemory.SelectObject(pOldBmp);
}
二、DIB位图的显示
由于MFC没有提供现成的类封装DIB,这给用户操作DIB位图带来很大困难,但微软在
2001年十月的MSDN中附带了dibapi.h和dibapi.cpp两个文件,我们可以利用现成的API函数来操作DIB位图,我们甚至可以按照自
己的需要加入一些函数。显示DIB位图一般用SetDIBitsToDeviec()或StretchDIBits()函数实现,这两个函数的参数比较
多,可查阅MSDN或相关书籍搞清楚每个参数的含义。
三、遇到的问题
1.利用多文档应用程序显示位图,程序
启动时会默认打开一个空的文档,如何避免这种情况?
解决方法:在应用程序(XXAPP)类的InitInstance()函数加入一条语句即可(一下代码黑体部分)
BOOL
CShowDibApp::InitInstance()
{
........
CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand =
CCommandLineInfo::FileNothing;
ParseCommandLine(cmdInfo);
..........
}
因为在程序启动时,会产生对OnFileNew()的调用,将m_nShellCommand的初
值改变为CCommandLineInfo::FileNothing时就回避免对OnFileNew()的调用,从而达到我们要求的效果。
2.
当程序打开一幅位图时,能不能调整文档窗口的大小使之与位图的大小相等,达到显示美观的效果?
解决方法:修改视图类的OnInitialUpdate()函数,将sizeTotal的宽度和高度设置成位图的宽度和高度,然后添加以下两句代码:
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
原文出处:http://www.cnblogs.com/ioleon13/archive/2007/08/17/859920.html
Bitmap,DDB),另一种是“设备无关”位图(Device Independ Bitmap,DIB)。
一、DDB位图的显示
DDB位图的显示很简单,将文件内容拷贝到内存中,然后可以很方便地将它粘贴到相关设备中,用BitBlt函数直接显示。首先改写视图类中的
OnFileOpen()函数,从文件装载位图到内存中。m_pBmp是CBitmap指针变量,得到该指针后,就可以在OnDraw()函数中显示位图
了。
void
CBmpDemoView::OnFileOpen()
{
//
TODO: Add your command handler code here
char
szFilter[]
=
"
Bitmap(*.BMP)|*.BMP||
"
;
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
if
(dlg.DoModal()
==
IDOK)
{
CString filename
=
dlg.GetPathName();
HBITMAP hBitmap
=
(HBITMAP)::LoadImage(NULL,szPathName,IMAGE_BITMAP,
0
,
0
,LR_LOADFROMFILE);
m_pBmp
=
new
CBitmap();
m_pBmp
->
Attach(hBitmap);
}
}
void
CBmpDemoView::OnDraw(CDC
*
pDC)
{
CBmpDemoDoc
*
pDoc
=
GetDocument();
ASSERT_VALID(pDoc);
//
TODO: add draw code for native data here
CDC dcMemory;
CBitmap
*
pOldBmp;
dcMemory.CreateCompatibleDC(pDC);
pOldBmp
=
dcMemory.SelectObject(m_pBmp);
pDC
->
BitBlt(m_orgpoint.x,m_orgpoint.y,m_size.cx,m_size.cy,
&
dcMemory,
0
,
0
,SRCCOPY);
dcMemory.SelectObject(pOldBmp);
}
二、DIB位图的显示
由于MFC没有提供现成的类封装DIB,这给用户操作DIB位图带来很大困难,但微软在
2001年十月的MSDN中附带了dibapi.h和dibapi.cpp两个文件,我们可以利用现成的API函数来操作DIB位图,我们甚至可以按照自
己的需要加入一些函数。显示DIB位图一般用SetDIBitsToDeviec()或StretchDIBits()函数实现,这两个函数的参数比较
多,可查阅MSDN或相关书籍搞清楚每个参数的含义。
三、遇到的问题
1.利用多文档应用程序显示位图,程序
启动时会默认打开一个空的文档,如何避免这种情况?
解决方法:在应用程序(XXAPP)类的InitInstance()函数加入一条语句即可(一下代码黑体部分)
BOOL
CShowDibApp::InitInstance()
{
........
CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand =
CCommandLineInfo::FileNothing;
ParseCommandLine(cmdInfo);
..........
}
因为在程序启动时,会产生对OnFileNew()的调用,将m_nShellCommand的初
值改变为CCommandLineInfo::FileNothing时就回避免对OnFileNew()的调用,从而达到我们要求的效果。
2.
当程序打开一幅位图时,能不能调整文档窗口的大小使之与位图的大小相等,达到显示美观的效果?
解决方法:修改视图类的OnInitialUpdate()函数,将sizeTotal的宽度和高度设置成位图的宽度和高度,然后添加以下两句代码:
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
原文出处:http://www.cnblogs.com/ioleon13/archive/2007/08/17/859920.html
相关文章推荐
- VC++6.0中BMP位图的读取和显示
- 如何把位图读入内存中并显示?实现从打包文件中读取bmp文件并显示!
- Matlab读取BMP位图并显示亮度值三维图
- (学习笔记3)BMP位图的读取与显示
- (学习笔记3)BMP位图的读取与显示
- 如何从文件读取显示位图?
- BMP位图读取部分代码
- sdl2-2.04 读取位图并显示
- BMP文件的读取与显示
- iphone下bmp读取显示两种方法
- iphone下bmp读取交显示的两种方法
- C++读取BMP位图数据的方法
- 飞鸽传书 CFile 来读取位图 BMP 文件
- 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(一)
- 位图的读取、显示、保存
- BMP文件的读取与显示
- 位图的读取,PNG转化为BMP
- 读取BMP文件并显示出来(C++实现)
- 【OPENGL】读取并显示BMP文件
- VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等图片