png图片加载问题?

mirroatl215 2013-02-05 01:05:53

m_image2 = Image::FromFile(L"res/10.png");
Graphics graphics(dc.m_hDC);
graphics.DrawImage(m_image,10,10);
//显示正常

但是,我有一个Png按钮类,只把背景图片拷贝出来与png按钮的不同状态png图片放一个HDC里,然后,把HDC的拷贝到OnEraseBkgnd(CDC *pDC)的pDC里。
//不把背景拷贝到按钮类的CopyFrom里,半透明效果出不来呢。是哪一步造成的;去掉就好了。


void GdipButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
int i = 0;
if(lpDIS->itemState & ODS_DISABLED) i = 3;
else if (lpDIS->itemState & ODS_SELECTED) i = 2;
else if (hovering) i = 1;
//else index = 0;

CRect rect;
if(gdipDraw[i] == NULL && image[i] != NULL)
{
GetWindowRect(rect);
GetParent()->ScreenToClient(rect);
gdipDraw[i] = new GdipDraw(lpDIS->hDC,rect.Width(),rect.Height());
gdipDraw[i]->CopyFrom(hBackDC,rect.left,rect.top);//拷入背景图片的HDC hBackDC//加载是在对话框程序里通过按钮类接口函数进行加载的 代码就不复制了
gdipDraw[i]->DrawImage(image[i]);
CString text;
GetWindowText(text);
if(!text.IsEmpty())
{
rect.left = lpDIS->rcItem.left + textRect.left;
rect.right = lpDIS->rcItem.right - textRect.right/*-rect.left*/;
rect.top = lpDIS->rcItem.top + textRect.top;
rect.bottom = lpDIS->rcItem.bottom - textRect.bottom/*-rect.top*/;
gdipDraw[i]->DrawText(text,rect,textFont,textColor,textFormat);
}
}
if(gdipDraw[i] != NULL)
{
::GetClipBox(lpDIS->hDC,rect);
gdipDraw[i]->CopyTo(lpDIS->hDC,rect);//把Png图片画到lpDIS->hdc里
}
}




bool GdipDraw::CopyFrom(HDC hDC,int x /*= 0*/,int y /*= 0*/)
{
if(hDC == 0 || hMemDC == 0)
return false;

return ::BitBlt(hMemDC,0,0,width,height,hDC,x,y,SRCCOPY) == TRUE;
}


bool GdipDraw::DrawImage( Image *image )
{
if(image == 0 || hMemDC == 0)
return false;

Gdiplus::Graphics graphics(hMemDC);
return graphics.DrawImage(image,0,0,width,height) == Gdiplus::Ok;
}





BOOL CGButtonTestDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
pDC->GetClipBox(rect);
gd.CopyTo(pDC->m_hDC,rect);//对话框类的把按钮类把背景图片与png按钮的不同状态png图片处理完成一张图片之后,拷贝到CDC*pDC里
return TRUE;
//是这个步的问题?????
}



bool GdipDraw::CopyTo( HDC hDC,LPRECT rect )
{
if(hDC == 0 || hMemDC == 0 || rect == 0)
return false;

return ::BitBlt(hDC,
rect->left,rect->top,
rect->right - rect->left,
rect->bottom - rect->top,
hMemDC,rect->left,rect->top,SRCCOPY) == TRUE;
}
...全文
396 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mirro187_ 2013-02-08
  • 打赏
  • 举报
回复
bool GdipDraw::DrawImage( Image *image ) { if(image == 0 || hMemDC == 0) return false; Gdiplus::Graphics graphics(hMemDC); return graphics.DrawImage(image,0,0,width,height) == Gdiplus::Ok; }
引用 5 楼 redui 的回复:
DrawImage时的工作模式是COPY还是OVER?只有OVER模式才执行混合,否则就是直接覆盖
redui 2013-02-06
  • 打赏
  • 举报
回复
DrawImage时的工作模式是COPY还是OVER?只有OVER模式才执行混合,否则就是直接覆盖
mirroatl215 2013-02-06
  • 打赏
  • 举报
回复
是呀!!!!!!!!
mirro187_ 2013-02-06
  • 打赏
  • 举报
回复
bool GdipDraw::DrawImage( Image *image ) { if(image == 0 || hMemDC == 0) return false; Gdiplus::Graphics graphics(hMemDC); return graphics.DrawImage(image,0,0,width,height) == Gdiplus::Ok; }
引用 5 楼 redui 的回复:
DrawImage时的工作模式是COPY还是OVER?只有OVER模式才执行混合,否则就是直接覆盖
jimette 2013-02-05
  • 打赏
  • 举报
回复
我有一个Png按钮类,只把背景图片拷贝出来与png按钮的不同状态png图片放一个HDC里,然后,把HDC的拷贝到OnEraseBkgnd(CDC *pDC)的pDC里。 是吧 png图片考到按钮上? 按钮也不是透明的!
  • 打赏
  • 举报
回复
什么东西,还用得着那样麻烦呀,你用cximage就不用那样麻烦了。 http://blog.csdn.net/sadasasdasd/article/details/8510691#comments
mirro187_ 2013-02-05
  • 打赏
  • 举报
回复
bool GdipImage::Load( UINT id,LPCSTR type)
{
Clear();
ASSERT(type != 0);

HRSRC res = ::FindResource(NULL, MAKEINTRESOURCE(id), "PNG");
if ( res == NULL) return false;

DWORD size = ::SizeofResource(NULL, res);
if (size == 0) return false;

LPCVOID data = ::LockResource(::LoadResource(NULL, res));
if (data == NULL) return false;

hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, size);
if(hBuffer == NULL) return false;

void* buff = ::GlobalLock(hBuffer);
if (buff != NULL)
{
CopyMemory(buff, data, size);
IStream* pstream = NULL;
if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pstream) == S_OK)
{
image = Gdiplus::Bitmap::FromStream(pstream);
pstream->Release();
if (image != NULL)
{
if (image->GetLastStatus() == Gdiplus::Ok)
return true;

delete image;
image = NULL;
}
}
::GlobalUnlock(hBuffer);
}
::GlobalFree(hBuffer);
hBuffer = NULL;

return false;
}

//加载方式问题??????????????不是吧

15,979

社区成员

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

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