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

VC++6.0中BMP位图的读取和显示

2007-08-17 16:11 477 查看
Windows中位图有两种格式,一种是“设备相关”位图(Device Depend Bitmap,DDB),另一种是“设备无关”位图(Device Independ Bitmap,DIB)。
一、DDB位图的显示
DDB位图的显示很简单,将文件内容拷贝到内存中,然后可以很方便地将它粘贴到相关设备中,用BitBlt函数直接显示。首先改写视图类中的OnFileOpen()函数,从文件装载位图到内存中。m_pBmp是CBitmap指针变量,得到该指针后,就可以在OnDraw()函数中显示位图了。

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