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;
}
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;
}
相关文章推荐
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- VC利用GDI+显示透明的PNG图片
- VC中GDI+双缓冲实现Picture控件中显示png图片
- VC2010使用GDI+在picture control控件里面显示图片
- win10系统eclipse中png图片怎么显示的是乱码
- VC中GDI+双缓冲实现Picture控件中显示png图片
- 【VS开发】GDI+ 用CImage类来显示PNG、JPG等图片
- VC++图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的方法
- 使用GDI+显示PNG图片
- VC中GDI+双缓冲实现Picture控件中显示png图片
- vc++加载透明png图片方法——GDI+和CImage两种
- IE浏览器中png图片无法显示,该怎么办?
- vc++加载透明png图片方法-GDI+和CImage两种
- VC中使用GDI+显示图片