我想让程序运行后,在主框架的客户区显示一张图片,具体做法如下:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BITMAP bm;
CBitmap *m_pBitmap;
CDC *m_pdcMem;
CSize m_sizeSource;
m_pBitmap->LoadBitmap(IDB_BITMAP1);
m_pdcMem ->CreateCompatibleDC(pDC);
m_pdcMem ->SelectObject(m_pBitmap);
m_pBitmap->GetObject(sizeof(bm),&bm);
m_sizeSource.cx=bm.bmWidth;
m_sizeSource.cy=bm.bmHeight;
m_sizeDest=m_sizeSource;
pDC->StretchBlt(0,0,m_sizeSource.cx,m_sizeSource.cy,
m_pdcMem,0,0,m_sizeSource.cx,m_sizeSource.cy,SRCCOPY);
}
图片可以显示出来,但发现有两个问题:
(1)主框架不可以随意放大、缩小,会出错;
(2)为什么不能用m_pBitmap->GetBitmap(&bm)呢?
请各位多多帮忙!!!
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BITMAP bm;
CBitmap *m_pBitmap;
CDC *m_pdcMem;
CSize m_sizeSource;
m_pBitmap->LoadBitmap(IDB_BITMAP1);
m_pdcMem ->CreateCompatibleDC(pDC);
m_pdcMem ->SelectObject(m_pBitmap);
m_pBitmap->GetObject(sizeof(bm),&bm);
m_sizeSource.cx=bm.bmWidth;
m_sizeSource.cy=bm.bmHeight;
m_sizeDest=m_sizeSource;
pDC->StretchBlt(0,0,m_sizeSource.cx,m_sizeSource.cy,
m_pdcMem,0,0,m_sizeSource.cx,m_sizeSource.cy,SRCCOPY);
}
图片可以显示出来,但发现有两个问题:
(1)主框架不可以随意放大、缩小,会出错;
(2)为什么不能用m_pBitmap->GetBitmap(&bm)呢?
请各位多多帮忙!!!
CDC *m_pdcMem;
CSize m_sizeSource;
m_pBitmap->LoadBitmap(IDB_BITMAP1); // u declare a pointer m_pBitmap, but not alloc memory for it , will cause error
使用CStatic 类显示位图
在OnSize()中重设实例的位置
{
if(m_hBitmap) //已经载入过位图,HBITMAP m_hBitmap;
{
m_Bitmap.Detach();//CBitmap m_Bitmap
DeleteObject(m_hBitmap);
m_hBitmap=NULL;
}
m_hBitmap=(HBITMAP)::LoadImage(NULL,lpszPathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); if(m_hBitmap==NULL)
{ TRACE("Load Bitmap Error");
return false;
}
m_Bitmap.Attach(m_hBitmap);
return true;}
void CLogView::OnDraw(CDC* pDC)
{
CLogDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here if(!memDC.m_hDC)
{
memDC.CreateCompatibleDC(pDC);
}
CWrapBitmap* pWrapBitmap=pDoc->GetWrapBitmap();
if(!pWrapBitmap->GetpBitmap())//得到CBitmap类指针
return;
memDC.SelectObject(pWrapBitmap->GetpBitmap());
pDC->BitBlt(0,0,pWrapBitmap->GetWidth(),pWrapBitmap->GetHeight(),&memDC,0,0,SRCCOPY);
}
{
CPaintDC dc(this); // device context for painting if (m_bitmap.GetSafeHandle())
{
CDC dcMem; if (dcMem.CreateCompatibleDC(&dc))
{
CBitmap* pOldBM = dcMem.SelectObject(&m_bitmap);
BITMAP BM; m_bitmap.GetBitmap(&BM); dc.BitBlt(0, 0, BM.bmWidth, BM.bmHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBM);
}
}
}。
CFileDialog dialog(TRUE, NULL, m_sFilename, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Images (*.bmp, *.gif, *.jpeg)|*.bmp;*.gif;*.jpeg||"); if (IDOK == dialog.DoModal())
{
CEnBitmap bitmap; if (bitmap.LoadImage(dialog.GetPathName()))
{
m_bitmap.DeleteObject();
m_bitmap.Attach(bitmap.Detach());
Invalidate(); m_sFilename = dialog.GetPathName();
UpdateData(FALSE);
}
}
(1). ttzzgg_80713(≈(⊙ā⊙)≈) ,
你说的问题我考虑到了,只是在上面没写出来,应该这应定义:CBitmap *m_pBitmap; CDC *m_pdcMem;
然后这样初始化:m_pBitmap=new Cbitmap; m_pdcMem=new CDC;
(2) jingjing8178(晶晶)
能说一下怎样在OnSize()中重设实例的位置
(3)foxmail(萧遥)
你写的更不明白了,CWrapBitmap::Load(LPCTSTR lpszPathName)函数从那来的,怎么与void CLogView::OnDraw(CDC* pDC)联系起来呢
(4).xinuisuo(xinyisuo)
你的意思我大体明白,但:
CFileDialog dialog(TRUE, NULL, m_sFilename, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Images (*.bmp, *.gif, *.jpeg)|*.bmp;*.gif;*.jpeg||"); if (IDOK == dialog.DoModal())
{
}
以上这段究竟该放在程序那块呢?
还有:CextendedBitmapDlg对话框怎样调用呢?
{
if( m_bmp == NULL ) return; CDC* pDoc = GetDocument();
ASSERT_VALID( pDoc ); SIZE sizes = pDoc->GetImageDims(); CRect rectClient;
GetClientRect( &rectClient ); CRect rectTo;
rectTo.left = rectTo.top = 0; if( m_bCenterInWindow && !m_bResizeWithImage )
{
rectTo.left = rectClient.Width() >> 1;
rectTo.left -= sizes.cx >> 1;
if( rectTo.left < 0 ) rectTo.left = 0; rectTo.top = rectClient.Height() >> 1;
rectTo.top -= sizes.cy >> 1;
if( rectTo.top < 0 ) rectTo.top = 0;
} rectTo.right = rectTo.left + sizes.cx;
rectTo.bottom = rectTo.top + sizes.cy; TRACE( "Client rectangle: %d %d\nFinal rectangle: %d %d %d %d w=%d h=%d\n",
rectClient.Width(), rectClient.Height(),
rectTo.left, rectTo.top, rectTo.right, rectTo.bottom,
rectTo.Width(), rectTo.Height() ); if( pDC->IsPrinting() )
{
int cxPage = pDC->GetDeviceCaps( HORZRES );
int cyPage = pDC->GetDeviceCaps( VERTRES ); int cxInch = pDC->GetDeviceCaps( LOGPIXELSX );
int cyInch = pDC->GetDeviceCaps( LOGPIXELSY ); if( m_bScaleToFit )
{
rectTo.left = rectTo.top = 0;
rectTo.right = cxPage;
rectTo.bottom = (int)( ((double)sizes.cy * cxPage * cyInch) /
((double)sizes.cx * cxInch) );
}
else
{
CDC dc;
BOOL bResult = dc.CreateCompatibleDC( NULL );
if( bResult )
{
int cxDisplay = dc.GetDeviceCaps( LOGPIXELSX );
int cyDisplay = dc.GetDeviceCaps( LOGPIXELSY );
dc.DeleteDC(); rectTo.right = rectTo.left +
(int)((double)rectTo.Width()*cxInch/cxDisplay);
rectTo.bottom = rectTo.top +
(int)((double)rectTo.Height()*cyInch/cyDisplay); if( m_bCenterOnPage )
{
int prtcx = (int)((double)sizes.cx*cxInch/cxDisplay);
int prtcy = (int)((double)sizes.cy*cyInch/cyDisplay); rectTo.left = cxPage>>1;
rectTo.left -= prtcx>>1; rectTo.top = cyPage>>1;
rectTo.top -= prtcy>>1; rectTo.right = rectTo.left + prtcx;
rectTo.bottom = rectTo.top + prtcy;
}
}
}
} ::StretchDIBits( pDC->m_hDC,
rectTo.left, rectTo.top, rectTo.Width(), rectTo.Height(),
0, 0, sizes.cx, sizes.cy,
m_bmp, &m_bmi, DIB_RGB_COLORS, SRCCOPY );}
在OnDraw函数中根据当前的客户区域来显示(GetClientRect取得);
在类虚构中释放位图资源。