有关位图显示的问题,高分相赠--100分

wmjcom 2002-12-10 11:47:47
我想让程序运行后,在主框架的客户区显示一张图片,具体做法如下:
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)呢?
请各位多多帮忙!!!
...全文
50 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoqiqixiao 2002-12-27
  • 打赏
  • 举报
回复
同上,既然都m_XXX了,那就作为类的成员变量呀,在InitualUpdate或其它的初始化里调用一次LoadBitmap就行了
hacke 2002-12-27
  • 打赏
  • 举报
回复
不要在Ondraw()中调用 LoadBitmap() function
River_H 2002-12-27
  • 打赏
  • 举报
回复
你绘图的时候,矩形区域回超出范围,造成出错。

你可以在初始化函数中调入位图;
在OnDraw函数中根据当前的客户区域来显示(GetClientRect取得);
在类虚构中释放位图资源。
yydyqy 2002-12-27
  • 打赏
  • 举报
回复
gz
romanticist 2002-12-12
  • 打赏
  • 举报
回复
OnDraw( CDC* pDC )
{
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 );

}
戴晶晶jjyyis 2002-12-11
  • 打赏
  • 举报
回复
建议:
使用CStatic 类显示位图
在OnSize()中重设实例的位置
wmjcom 2002-12-11
  • 打赏
  • 举报
回复
各位写的我怎么都不明白呢?还请在解释一下。
(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对话框怎样调用呢?
xinuisuo 2002-12-11
  • 打赏
  • 举报
回复
void CExtendedBitmapDlg::OnPaint()
{
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);
}
}

foxmail 2002-12-11
  • 打赏
  • 举报
回复
BOOL CWrapBitmap::Load(LPCTSTR lpszPathName)
{
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);
}
ttzzgg_80713 2002-12-10
  • 打赏
  • 举报
回复
CBitmap *m_pBitmap;
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

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧