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);
//
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);
//#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是放大用的.但是这样不光有放大的原来的图,连屏幕中别的部分都被显示进去了.我感觉是某个地方区域选错了.请问应该怎么改呢