惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Y
Y Combinator Blog
T
Tailwind CSS Blog
G
Google Developers Blog
博客园 - Franky
Google DeepMind News
Google DeepMind News
阮一峰的网络日志
阮一峰的网络日志
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
爱范儿
爱范儿
博客园 - 【当耐特】
腾讯CDC
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
C
Check Point Blog
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - 木子一叶

ffmpeg音视频文件批量转换脚本 2010年下半年软考信息系统项目管理师论文预测-备忘 H.264编解码标准的核心技术(提供相关流程图) 《卓有成效的管理者》书摘(一) 回调函数的那些事儿 年轻男人必读 一定要知道的71个做饭技巧 c、c++,MFC在笔试中容易出现的内容 凸多边形最优三角剖分 矩阵连乘最佳加括号方式-动态规划算法 用Visual C++6.0实现棋盘覆盖分治算法 在线查询大全 SPS技术体系之三------Sharepoint2003对象模型 SPS技术体系之二-----数据库表结构分析 SPS技术体系之一-----程序文件和IIS配置 英语学习网站收藏----來自http://yhb20fly.spaces.msn.com/ 每个开发人员应该下载的十种必备工具 转载--完整的UBB代码(C#版) SQL查询优化
VC++6.0中BMP位图的读取和显示
木子一叶 · 2007-08-17 · via 博客园 - 木子一叶

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