diff options
author | Aleksoid <aleksoid@users.sourceforge.net> | 2009-12-19 14:01:29 +0300 |
---|---|---|
committer | Aleksoid <aleksoid@users.sourceforge.net> | 2009-12-19 14:01:29 +0300 |
commit | 90dafc23010af38115b0e153c82698e93c5f23a1 (patch) | |
tree | de83d82438c4addf9abb710b3ad14985d75dd2f9 /src/apps/mplayerc/CGdiPlusBitmap.h | |
parent | 68b5161166b148bcb89c4456f53ffe5c4ec7e718 (diff) |
NEW : ADD support Windows 7 taskbar and thumbnails features, like Progress bar, Status Icon, Toolbar control(button)
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@1423 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/apps/mplayerc/CGdiPlusBitmap.h')
-rw-r--r-- | src/apps/mplayerc/CGdiPlusBitmap.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/apps/mplayerc/CGdiPlusBitmap.h b/src/apps/mplayerc/CGdiPlusBitmap.h new file mode 100644 index 000000000..dd46ac2d0 --- /dev/null +++ b/src/apps/mplayerc/CGdiPlusBitmap.h @@ -0,0 +1,107 @@ +#pragma once
+
+class CGdiPlusBitmap
+{
+public:
+ Gdiplus::Bitmap* m_pBitmap;
+
+public:
+ CGdiPlusBitmap() { m_pBitmap = NULL; }
+ CGdiPlusBitmap(LPCWSTR pFile) { m_pBitmap = NULL; Load(pFile); }
+ virtual ~CGdiPlusBitmap() { Empty(); }
+
+ void Empty() { delete m_pBitmap; m_pBitmap = NULL; }
+
+ bool Load(LPCWSTR pFile)
+ {
+ Empty();
+ m_pBitmap = Gdiplus::Bitmap::FromFile(pFile);
+ return m_pBitmap->GetLastStatus() == Gdiplus::Ok;
+ }
+
+ operator Gdiplus::Bitmap*() const { return m_pBitmap; }
+};
+
+
+class CGdiPlusBitmapResource : public CGdiPlusBitmap
+{
+protected:
+ HGLOBAL m_hBuffer;
+
+public:
+ CGdiPlusBitmapResource() { m_hBuffer = NULL; }
+ CGdiPlusBitmapResource(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
+ { m_hBuffer = NULL; Load(pName, pType, hInst); }
+ CGdiPlusBitmapResource(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
+ { m_hBuffer = NULL; Load(id, pType, hInst); }
+ CGdiPlusBitmapResource(UINT id, UINT type, HMODULE hInst = NULL)
+ { m_hBuffer = NULL; Load(id, type, hInst); }
+ virtual ~CGdiPlusBitmapResource() { Empty(); }
+
+ void Empty();
+
+ bool Load(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL);
+ bool Load(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
+ { return Load(MAKEINTRESOURCE(id), pType, hInst); }
+ bool Load(UINT id, UINT type, HMODULE hInst = NULL)
+ { return Load(MAKEINTRESOURCE(id), MAKEINTRESOURCE(type), hInst); }
+};
+
+inline
+void CGdiPlusBitmapResource::Empty()
+{
+ CGdiPlusBitmap::Empty();
+ if (m_hBuffer)
+ {
+ ::GlobalUnlock(m_hBuffer);
+ ::GlobalFree(m_hBuffer);
+ m_hBuffer = NULL;
+ }
+}
+
+inline
+bool CGdiPlusBitmapResource::Load(LPCTSTR pName, LPCTSTR pType, HMODULE hInst)
+{
+ Empty();
+
+ HRSRC hResource = ::FindResource(hInst, pName, pType);
+ if (!hResource)
+ return false;
+
+ DWORD imageSize = ::SizeofResource(hInst, hResource);
+ if (!imageSize)
+ return false;
+
+ const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
+ if (!pResourceData)
+ return false;
+
+ m_hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
+ if (m_hBuffer)
+ {
+ void* pBuffer = ::GlobalLock(m_hBuffer);
+ if (pBuffer)
+ {
+ CopyMemory(pBuffer, pResourceData, imageSize);
+
+ IStream* pStream = NULL;
+ if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
+ {
+ m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
+ pStream->Release();
+ if (m_pBitmap)
+ {
+ if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
+ return true;
+
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ }
+ }
+ ::GlobalUnlock(m_hBuffer);
+ }
+ ::GlobalFree(m_hBuffer);
+ m_hBuffer = NULL;
+ }
+ return false;
+}
|