您的位置:首页 > 其它

vc win32 gdi+ 怎么显示PNG图片

2010-07-21 16:18 337 查看
各位大哥看看,为什么我显示的PNG图片有黑框???PNG图片的边缘为渐变透明的。渐变透明的地方变成了黑框

BOOL OnEraseBkgnd()
{

 HBITMAP hBitmap;
 BITMAP m_bitmap;

 hBitmap=LoadImgFormRs(IDR_PNG_StatusBar,L"PNG");
 GetObject(hBitmap,sizeof(BITMAP),&m_bitmap);

 HDC hDC,hDCmem;
 PAINTSTRUCT ps;

 hDC=BeginPaint(g_hWnd,&ps);
 hDCmem=CreateCompatibleDC(hDC);
 SelectObject(hDCmem,hBitmap);

 RECT rc;
 GetClientRect(g_hWnd,&rc);

 StretchBlt(hDC,0,0,rc.right,rc.bottom,hDCmem,0,0,m_bitmap.bmWidth,m_bitmap.bmHeight,SRCCOPY); 
 EndPaint(g_hWnd,&ps);
 DeleteDC(hDCmem);
 DeleteObject(hBitmap);
 return TRUE;
}

 

 

LoadImgFormRs函数返回HBITMAP 

 

HBITMAP  LoadImgFormRs(UINT pResourceID,LPCTSTR pResourceType)
{
 GdiplusStartupInput gdiplusStartupInput;
 ULONG_PTR  m_gdiplusToken;
 Gdiplus::GdiplusStartup(&m_gdiplusToken,&gdiplusStartupInput,NULL);//初始化GDI

 

 HBITMAP     hBitmap=NULL;
 HINSTANCE      hInstance;
 HRSRC          hResource;
 DWORD           dwRsSize;
 HGLOBAL           hRsBuf;
 const void*      pRsData;
 IStream* pIStream = NULL;

 hInstance=::LoadLibrary(L"Resources.dll");

  if(!hInstance)
  return NULL;

 

 hResource=FindResource(hInstance,MAKEINTRESOURCE(pResourceID),pResourceType);
 if(!hResource)
  return NULL;

 

 dwRsSize=SizeofResource(hInstance,hResource);
 if(!dwRsSize)
  return NULL;

 

 pRsData=LockResource(LoadResource(hInstance,hResource));
 if(!pRsData)
  return NULL;

 

 hRsBuf=GlobalAlloc(GMEM_MOVEABLE,dwRsSize);
 if (!hRsBuf)
 {
  GlobalFree(hRsBuf);
  return NULL;
 }

 void* pRsBuf = GlobalLock(hRsBuf);
 if(!pRsBuf)
 {
  GlobalUnlock(hRsBuf);
  GlobalFree(hRsBuf);
  return NULL;
 }

 

 CopyMemory(pRsBuf, pRsData, dwRsSize);

 

 if(CreateStreamOnHGlobal(hRsBuf, FALSE, &pIStream)==S_OK)
 {
  Gdiplus::Image *pImage = Gdiplus::Image::FromStream(pIStream);
  Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromStream(pIStream);

  pIStream->Release();
  GlobalUnlock(hRsBuf);
  GlobalFree(hRsBuf);
  Gdiplus::Status result = pBitmap->GetLastStatus();

  if(result==Gdiplus::Ok)
  {
    pBitmap->GetHBITMAP(NULL, &hBitmap);

    
  }
  delete pBitmap;
 }
 GlobalUnlock(hRsBuf);
 GlobalFree(hRsBuf);
 FreeLibrary(hInstance);
 GdiplusShutdown(m_gdiplusToken);
 return hBitmap;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gdi+ null image delete