MFC基于单文档的程序读取一幅bmp图片并显示,有一些代码看不懂,求高手指教
在OnDraw函数中,有下列代码:voidCMy20143190View::OnDraw(CDC*pDC){//TODO:Addyourspecializedcodehe...
在OnDraw函数中,有下列代码:
void CMy20143190View::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
CMy20143190Doc* pDoc= GetDocument();
ASSERT_VALID(pDoc);
HBITMAP hBitmap= (HBITMAP)LoadImage(NULL,BmpName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); // ???
m_bitmap.Detach(); // ???
m_bitmap.Attach(hBitmap); // ???
CDC dcImage;
BOOL flag=dcImage.CreateCompatibleDC(pDC); // ???
if (!flag)
{
return;
}
BITMAP bitmap;
m_bitmap.GetBitmap(&bitmap);
dcImage.SelectObject(m_bitmap);
pDC->BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcImage,0,0,SRCCOPY); // ???
}
}
}
上面的代码中,带“???”的都不是很明白,特别是1. Detach、Attach函数的作用
2.OnDraw函数已经传入一个pDC了,为什么还要定义一个 dcImage ?
3.位图显示程序,为什么要调用CreateCompatibleDC、BitBlt等函数?
4.申请的 hBitmap、m_hBitmpap、bitmap这些句柄会对象都有什么作用?他们和实际位图是怎样关联的?
问题较多,希望对这方面有了解的朋友多帮帮我\(^o^)/~ 展开
void CMy20143190View::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
CMy20143190Doc* pDoc= GetDocument();
ASSERT_VALID(pDoc);
HBITMAP hBitmap= (HBITMAP)LoadImage(NULL,BmpName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); // ???
m_bitmap.Detach(); // ???
m_bitmap.Attach(hBitmap); // ???
CDC dcImage;
BOOL flag=dcImage.CreateCompatibleDC(pDC); // ???
if (!flag)
{
return;
}
BITMAP bitmap;
m_bitmap.GetBitmap(&bitmap);
dcImage.SelectObject(m_bitmap);
pDC->BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcImage,0,0,SRCCOPY); // ???
}
}
}
上面的代码中,带“???”的都不是很明白,特别是1. Detach、Attach函数的作用
2.OnDraw函数已经传入一个pDC了,为什么还要定义一个 dcImage ?
3.位图显示程序,为什么要调用CreateCompatibleDC、BitBlt等函数?
4.申请的 hBitmap、m_hBitmpap、bitmap这些句柄会对象都有什么作用?他们和实际位图是怎样关联的?
问题较多,希望对这方面有了解的朋友多帮帮我\(^o^)/~ 展开
2个回答
展开全部
这是双缓冲绘图。
双缓冲绘图步骤:
1、加载图像
代码中是用的HBITMAP方式,就是下面这段。(还可以是GDI+等等)
HBITMAP hBitmap= (HBITMAP)LoadImage(NULL,BmpName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); // ???
m_bitmap.Detach(); // ???
m_bitmap.Attach(hBitmap); // ???
2、创建内存绘图DC
CDC dcImage;
BOOL flag=dcImage.CreateCompatibleDC(pDC); 其中的dcImage就是内存DC。
3、将图像一次绘制在内存DC上。
dcImage.SelectObject(m_bitmap);
2、将内存DC的图像按尺寸绘制在窗口中。
pDC->BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcImage,0,0,SRCCOPY);
建议你网上搜搜双缓冲绘图的实现。
双缓冲绘图步骤:
1、加载图像
代码中是用的HBITMAP方式,就是下面这段。(还可以是GDI+等等)
HBITMAP hBitmap= (HBITMAP)LoadImage(NULL,BmpName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); // ???
m_bitmap.Detach(); // ???
m_bitmap.Attach(hBitmap); // ???
2、创建内存绘图DC
CDC dcImage;
BOOL flag=dcImage.CreateCompatibleDC(pDC); 其中的dcImage就是内存DC。
3、将图像一次绘制在内存DC上。
dcImage.SelectObject(m_bitmap);
2、将内存DC的图像按尺寸绘制在窗口中。
pDC->BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcImage,0,0,SRCCOPY);
建议你网上搜搜双缓冲绘图的实现。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询