ioleon13's blog

—Good Good Study,Day Day Up!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  27 随笔 :: 0 文章 :: 23 评论 :: 0 引用

       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();

posted on 2007-08-17 16:11  木子一叶  阅读(...)  评论(... 编辑 收藏