您的位置:首页 > 编程语言 > C语言/C++

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: