GDI+双缓冲的有关问题. 怎么将一个JPG图片作为视图的背景
GDI+双缓冲的问题. 如何将一个JPG图片作为视图的背景
我是想将一个JPG图片作为视图的背景.考虑到GDI+对JPG文件支持要比GDI好一些.所以选用了GDI+.但问题是当窗口第一次显示的时候,背景图画上去了.但是将这个窗口最大化之后背景图没有画上去.
请教各位,是不是我这个双缓冲哪里写得不对.
我用GDI画一个BMP文件作为背景是成功的.困扰几天的问题了,高手帮忙看一下.谢谢
BOOL CLotteryView::OnEraseBkgnd(CDC* pDC)
{
CRect rectClient;
GetClientRect(rectClient);
CDC MemDC;
MemDC.CreateCompatibleDC (NULL);
Bitmap MemBitmap(rectClient.Width(),rectClient.Height());
Graphics memGph(&MemBitmap);
//pImage在构造函数中已经加载了一个图片
memGph.DrawImage(pImage,rectClient.left, rectClient.top,rectClient.Width(),rectClient.Height());
Graphics graphics(pDC-> m_hDC);
graphics.DrawImage(&MemBitmap,rectClient.left, rectClient.top,rectClient.Width(),rectClient.Height());
//pDC-> BitBlt(0,0,rectClient.Width(),rectClient.Height(),MemBitmap,0,0,SRCCOPY);
MemDC.DeleteDC();
return TRUE;
}
------解决方案--------------------
把你的OEraseBkgnd(CDC* pDC)
返回为true,我项目中的
BOOL CIDPhotoView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
然后在OnDraw(CDC* pDC)去画吧!
void CIDPhotoView::OnDraw(CDC* pDC)
{
if(pOriginal)
{
Graphics g(pDC-> GetSafeHdc());
g.SetInterpolationMode(InterpolationModeHighQualityBicubic); //设置图像质量
CRect rcImage(CPoint(0, 0), CSize(pDisplay-> GetWidth(),pDisplay-> GetHeight()));
CSize szOffset = GetPageSize().CenterPoint() - rcImage.CenterPoint();
rectDisplay.X = szOffset.cx;
rectDisplay.Y = szOffset.cy;
rectDisplay.Width = pDisplay-> GetWidth();
rectDisplay.Height = pDisplay-> GetHeight();
DrawBackground(pDC,rectDisplay);
DrawBorder(pDC,rectDisplay); //画边框
g.DrawImage(pDisplay,rectDisplay); //画相片
//显示裁剪框
if(m_bIsTracker)
m_Tracker.Draw(pDC);
}
else
{
CGdiObject * pOldFont = pDC-> SelectStockObject(DEFAULT_GUI_FONT);
CRect rcClient;
GetClientRect(rcClient);
pDC-> FillSolidRect(rcClient, RGB(125,125,125)); //画背景色
CString s = "当前程序中没有相片!\nWWW.A708.COM ";
CPoint center = rcClient.CenterPoint();
// 高亮度显示字符
int bgLum = 31 * GetRValue(RGB(125,125,125))
+ 61 * GetGValue(RGB(125,125,125))
+ 8 * GetBValue(RGB(125,125,125));
COLORREF colPen = bgLum > (60 * 255) ? RGB(0, 0, 0) : RGB(255, 255, 255);
COLORREF colOld = pDC-> SetTextColor(colPen);
pDC-> SetBkMode(TRANSPARENT);
pDC-> SetTextAlign(TA_CENTER | TA_BASELINE);
pDC-> TextOut(center.x, center.y, s);
pDC-> SetTextColor(colOld);
if (pOldFont) pDC-> SelectObject(pOldFont);//写字
}
}
------解决方案--------------------
1) Add more error checking code.
2) Debug your code.
我是想将一个JPG图片作为视图的背景.考虑到GDI+对JPG文件支持要比GDI好一些.所以选用了GDI+.但问题是当窗口第一次显示的时候,背景图画上去了.但是将这个窗口最大化之后背景图没有画上去.
请教各位,是不是我这个双缓冲哪里写得不对.
我用GDI画一个BMP文件作为背景是成功的.困扰几天的问题了,高手帮忙看一下.谢谢
BOOL CLotteryView::OnEraseBkgnd(CDC* pDC)
{
CRect rectClient;
GetClientRect(rectClient);
CDC MemDC;
MemDC.CreateCompatibleDC (NULL);
Bitmap MemBitmap(rectClient.Width(),rectClient.Height());
Graphics memGph(&MemBitmap);
//pImage在构造函数中已经加载了一个图片
memGph.DrawImage(pImage,rectClient.left, rectClient.top,rectClient.Width(),rectClient.Height());
Graphics graphics(pDC-> m_hDC);
graphics.DrawImage(&MemBitmap,rectClient.left, rectClient.top,rectClient.Width(),rectClient.Height());
//pDC-> BitBlt(0,0,rectClient.Width(),rectClient.Height(),MemBitmap,0,0,SRCCOPY);
MemDC.DeleteDC();
return TRUE;
}
------解决方案--------------------
把你的OEraseBkgnd(CDC* pDC)
返回为true,我项目中的
BOOL CIDPhotoView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
然后在OnDraw(CDC* pDC)去画吧!
void CIDPhotoView::OnDraw(CDC* pDC)
{
if(pOriginal)
{
Graphics g(pDC-> GetSafeHdc());
g.SetInterpolationMode(InterpolationModeHighQualityBicubic); //设置图像质量
CRect rcImage(CPoint(0, 0), CSize(pDisplay-> GetWidth(),pDisplay-> GetHeight()));
CSize szOffset = GetPageSize().CenterPoint() - rcImage.CenterPoint();
rectDisplay.X = szOffset.cx;
rectDisplay.Y = szOffset.cy;
rectDisplay.Width = pDisplay-> GetWidth();
rectDisplay.Height = pDisplay-> GetHeight();
DrawBackground(pDC,rectDisplay);
DrawBorder(pDC,rectDisplay); //画边框
g.DrawImage(pDisplay,rectDisplay); //画相片
//显示裁剪框
if(m_bIsTracker)
m_Tracker.Draw(pDC);
}
else
{
CGdiObject * pOldFont = pDC-> SelectStockObject(DEFAULT_GUI_FONT);
CRect rcClient;
GetClientRect(rcClient);
pDC-> FillSolidRect(rcClient, RGB(125,125,125)); //画背景色
CString s = "当前程序中没有相片!\nWWW.A708.COM ";
CPoint center = rcClient.CenterPoint();
// 高亮度显示字符
int bgLum = 31 * GetRValue(RGB(125,125,125))
+ 61 * GetGValue(RGB(125,125,125))
+ 8 * GetBValue(RGB(125,125,125));
COLORREF colPen = bgLum > (60 * 255) ? RGB(0, 0, 0) : RGB(255, 255, 255);
COLORREF colOld = pDC-> SetTextColor(colPen);
pDC-> SetBkMode(TRANSPARENT);
pDC-> SetTextAlign(TA_CENTER | TA_BASELINE);
pDC-> TextOut(center.x, center.y, s);
pDC-> SetTextColor(colOld);
if (pOldFont) pDC-> SelectObject(pOldFont);//写字
}
}
------解决方案--------------------
1) Add more error checking code.
2) Debug your code.