在单文档页面上加一幅图片之后, 由于我的图片太大, 插入之后只能显示图片的一部分, 怎样让图片缩小到合理的尺寸呢?我的插入图片方法如下:
1.首先准备好一张美丽的图片,保存为BMP格式。2.新建一个工程,命名为:test ,在资源编辑里用Import导入刚才准备好的位图文件.ID为IDB_BITMAP
如果位图是大于16色的,会出现无法显示的提示。不要紧,这并不影响程序最终的显示。3.代码实现:
    3.1 我们为CTestView类添加一个变量 CBrush m_brushBackground;这个画刷就是用于画背景的。
    3.2 我们在CTestView的构造函数中加入如下代码: 
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP); ///加载位图
         m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷    3.3 接着我们需要在OnDraw函数中画出来,代码如下: 
CRect rect;
GetClientRect(rect);///取得客户区域
         pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域
    3.4 为了避免背景的闪烁,使显示更加完美,我们添加WM_ERASEBKGND消息的处理函数,并取消调用父类的处理函数,代码  
        BOOL CTestView::OnEraseBkgnd(CDC* pDC) 
        {
    return TRUE;
        }插入之后只能显示图片的一部分, 怎样让图片缩小到合理的尺寸呢?
感谢各位大哥的帮忙, 谢谢!

解决方案 »

  1.   

    上面的这位朋友, 我的VC水平比较菜, 可以讲说细一点吗?
    StretchBlt 应该写在什么地方? 参数应该如何设置?
    谢谢你的帮助
      

  2.   

    3.3里写
    CDC mem;
    mem.CreateCompatibleDC(NULL);
    CBitmap *oldbit=mem.SelectObject(&bmp);
    BITMAP bm;
    bmp.GetBitmap(&bm);
    CRect   rect; 
    GetClientRect(rect);///取得客户区域 
    CDC *pDC;
    pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&mem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
    mem.SelectObject(oldbit);
    mem.DeleteDC();
    3.2里m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷 
    不要
      

  3.   

    4楼的朋友, 非常感谢你的帮助.
    但我试了你的程序, 这是一个截屏幕图的程序, 而我想要的是加入一幅 IDB_BITMAP
    谢谢
      

  4.   

    晕晕,什么和什么啊,这是一个截屏幕图的程序?????怎么可能````
    CBitmap   *oldbit=mem.SelectObject(&bmp); mem就是你的IDB_BITMAP 图的内存DC再用内存DC显示的显示屏上~~~~
      

  5.   

    但结果怎么会显示一个当前屏幕呢? 我也奇怪~~
    当前屏幕是什么, CTextView就显示什么..
      

  6.   

    OnDraw()函数里
    CDC   mem; 
    mem.CreateCompatibleDC(NULL); 
    CBitmap   *oldbit=mem.SelectObject(&bmp); 
    BITMAP   bm; 
    bmp.GetBitmap(&bm); 
    CRect       rect;   
    GetClientRect(rect);///取得客户区域   
    CDC   *pDC; 
    pDC-> StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&mem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); 
    mem.SelectObject(oldbit); 
    mem.DeleteDC(); 
    一定是你没有画在这里,再呢BOOL   CTestView::OnEraseBkgnd(CDC*   pDC)   
                    { 
            return   TRUE; 
                    } 返回 true了,所以就等于没有画,当然就是后面的图了
      

  7.   

    上面的朋友, 我想我知道为什么会显示当前屏幕的图像了, 我的想法不知道是否正确, 请看:你的代码是这样写的:CDC mem;
    mem.CreateCompatibleDC(NULL);
    CBitmap *oldbit=mem.SelectObject(&bmp); 
    BITMAP bm;
    bmp.GetBitmap(&bm);
    CRect rect;
    GetClientRect(rect); //取得客户区域
    CDC *pDC; //在这里出错: redefinition of formal parameter 'pDC'
    pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&mem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
    mem.SelectObject(oldbit);
    mem.DeleteDC();我编译之后出现了以下错误提示:
    D:\C++ Project\Text\Text.cpp(95) : error C2082: redefinition of formal parameter 'pDC'结果我就以为是 CDC *pDC 重新定义了, 所以我把 CDC *pDC 改成: CDC *pDC2
    改之后的代码如下:CDC mem;
    mem.CreateCompatibleDC(NULL);
    CBitmap *oldbit=mem.SelectObject(&bmp); 
    BITMAP bm;
    bmp.GetBitmap(&bm);
    CRect rect;
    GetClientRect(rect); //取得客户区域
    CDC *pDC2; //在这里出错: redefinition of formal parameter 'pDC'
    pDC2->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&mem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
    mem.SelectObject(oldbit);
    mem.DeleteDC();可能就是因为我把 CDC *pDC 改成: CDC *pDC2的原因而导致显示当前屏幕的图像, 但如果我不这样做的话应该怎样改呢?
    还请帮帮忙, 非常感谢!
      

  8.   

    我的错我的错,呵呵,我是不是在ondraw里面写的,所以呢,自己就定义了一个,你这个不用就可以了```
    CDC   *pDC;   //在这里出错:   redefinition   of   formal   parameter   'pDC ' 
    删了```