HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, name, IMAGE_BITMAP, nX*mode1,nY*mode2, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
//
m_bmpCtrl.SetBitmap(hBitmap);

我原来放大bmp是用的上边两句这种方法,nx,ny为象素数,mode1,mode2为放大倍数.m_bmctrl为picture控件,CbitmapCtrl对象.这样放大后是有滚动条的,但是放大时有颜色失真.于是我想用StretchBlt来放大,为了能使用滚动条,请问如何将其与HBITMAP hBitmap对应起来呢?
pDC-> StretchBlt(0,   0,   nX*mode1,   nY*mode2,   &memDC,   0,   0,   48,   48,   SRCCOPY);

解决方案 »

  1.   

    // EditBMP.cpp : implementation file
    //#include "stdafx.h"
    #include "BitmapCtrlDemo.h"
    #include "EditBMP.h"
    //#include "BitmapCtrl.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CEditBMP dialog
    CEditBMP::CEditBMP(CWnd* pParent /*=NULL*/)
    : CDialog(CEditBMP::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CEditBMP)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    }
    void CEditBMP::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CEditBMP)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    // DDX_Control(pDX, IDC_BITMAP_CTRL, m_bitmapctrl);
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CEditBMP, CDialog)
    //{{AFX_MSG_MAP(CEditBMP)
    ON_BN_CLICKED(IDC_BITMAP_CTRL, OnBitmapCtrl)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CEditBMP message handlersBOOL CEditBMP::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    GetDlgItem(IDC_BITMAP_CTRL)->GetWindowRect(brect);
    ScreenToClient(brect);
    m_bmpCtrl.Create(WS_CHILD|WS_VISIBLE,brect,this); // TODO: Add extra initialization here
    CDC *pDC=m_bmpCtrl.GetDC(); 
     
    HBITMAP   hBmp   =   (HBITMAP)::LoadImage(NULL,strpath, 
    IMAGE_BITMAP,0,0, 
    LR_LOADFROMFILE|LR_CREATEDIBSECTION); 

    CBitmap   bmp; 
    bmp.Attach(hBmp); 

    CDC   memDC; 
    memDC.CreateCompatibleDC(pDC); 
    memDC.SelectObject(&bmp); mode1=mode2=1;

    // HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, strpath, IMAGE_BITMAP, nX*mode1,nY*mode2, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);

    // m_bmpCtrl.SetBitmap(hBitmap);
    HDC hdc   = memDC.GetSafeHdc();      
    HBITMAP hBitmap =GetSrcBit(hdc,nX, nY);        
     m_bmpCtrl.SetBitmap(hBitmap);
      //pDC-> StretchBlt(0,   0,   nX*mode1*2,   nY*mode2*2,   &memDC,   0,   0,   48,   48,   SRCCOPY);
       
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }void CEditBMP::OnOK() 
    {
    // TODO: Add extra validation here CDC *pDC=m_bmpCtrl.GetDC(); 
    HBITMAP   hBmp   =   (HBITMAP)::LoadImage(NULL,strpath, 
    IMAGE_BITMAP,0,0, 
    LR_LOADFROMFILE|LR_CREATEDIBSECTION); 

    CBitmap   bmp; 
    bmp.Attach(hBmp); 

    CDC   memDC; 
    memDC.CreateCompatibleDC(pDC); 
    memDC.SelectObject(&bmp);  //HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, name, IMAGE_BITMAP, nX*mode1,nY*mode2, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
    //
    //m_bmpCtrl.SetBitmap(hBitmap);
    mode1*=1.5;
    mode2*=1.5;
    pDC->StretchBlt(0,   0,   nX*mode1*2,   nY*mode2*2,   &memDC,   0,   0,   nX*2,   nY*2,   SRCCOPY);
    int i;

    CPen   m_pen(PS_SOLID,1/*宽度*/,RGB(255,0,0)/*颜色*/);    
    //pDC-> SetROP2(R2_XORPEN); 
    for (i=0;i<=nY;i++)
    {

    pDC->SelectObject(&m_pen);
    pDC->MoveTo(0,i*mode1); 
    pDC->LineTo(nX*mode2,i*mode1); 
    }
    for (i=0;i<=nX;i++)
    {
    pDC->SelectObject(&m_pen);
    pDC->MoveTo(i*mode1,0); 
    pDC->LineTo(i*mode1,nY*mode2);  }
    HDC hdc   =pDC->GetSafeHdc();      
    HBITMAP hBitmap =GetSrcBit(hdc,nX*mode1, nY*mode2);        
        m_bmpCtrl.SetBitmap(hBitmap);
    // HBITMAP hBitmap =GetPartOfScreen(0, 0, nX*mode1*2, nY*mode2*2);
    // m_bmpCtrl.SetBitmap(hBitmap);
    }
    // 附:得到一个DC位图的代码HBITMAP CEditBMP::GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight){

    HDC hBufDC;

    HBITMAP hBitmap, hBitTemp;

    hBufDC = CreateCompatibleDC(hDC);

    hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);

    hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);

    CDC *pDC=m_bmpCtrl.GetDC(); 
     StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
         
    hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

    ::DeleteDC(hBufDC);

    return hBitmap;

    }onok是放大用的.但是这样不光有放大的原来的图,连屏幕中别的部分都被显示进去了.我感觉是某个地方区域选错了.请问应该怎么改呢
      

  2.   

    可以,静态控件有个SetBitmap()的方法,用来加载bitmap的
      

  3.   

    这个如果想把图片放大是用loadimage,这种放大两种颜色中间会有中间过渡色,我不想要这种结果,所以比较麻烦,呵呵.
      

  4.   

    好把。。对不起我错了 。就是说我在内存里用StretchBlt将位图放大后如何截取成HBITMAP?