瀏覽代碼

png supported in viewer and thumbnail images

scott brogden 8 年之前
父節點
當前提交
cfed5a86d8
共有 10 個文件被更改,包括 175 次插入154 次删除
  1. 28 63
      BitmapHelper.cpp
  2. 74 1
      Clip.cpp
  3. 4 0
      Clip.h
  4. 3 1
      ClipFormatQListCtrl.cpp
  5. 17 28
      ImageViewer.cpp
  6. 2 1
      ImageViewer.h
  7. 14 27
      QListCtrl.cpp
  8. 15 3
      QPasteWndThread.cpp
  9. 15 29
      ToolTipEx.cpp
  10. 3 1
      ToolTipEx.h

+ 28 - 63
BitmapHelper.cpp

@@ -42,85 +42,50 @@ int CBitmapHelper::GetCBitmapHeight(const CBitmap & cbm)
 
 BOOL CBitmapHelper::GetCBitmap(void	*pClip2, CDC *pDC, CBitmap *pBitMap, int nMaxHeight)
 {
-	LPBITMAPINFO	lpBI ;
-	void*           pDIBBits;
 	BOOL bRet = FALSE;
 
 	CClipFormat		*pClip = (CClipFormat *)pClip2;
 
-	switch(pClip->m_cfType)
+	if(pClip->m_cfType == CF_DIB ||
+		pClip->m_cfType == theApp.m_PNG_Format)
 	{
-	case CF_DIB:
-	{
-		lpBI = (LPBITMAPINFO)GlobalLock(pClip->m_hgData);
-		if(lpBI)
-		{
-			int nColors = lpBI->bmiHeader.biClrUsed ? lpBI->bmiHeader.biClrUsed : 1 << lpBI->bmiHeader.biBitCount;
-
-			if( lpBI->bmiHeader.biBitCount > 8 )
-			{
-				pDIBBits = (LPVOID)((LPDWORD)(lpBI->bmiColors + lpBI->bmiHeader.biClrUsed) + 
-					((lpBI->bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
-			}
-			else
-			{
-				pDIBBits = (LPVOID)(lpBI->bmiColors + nColors);
-			}
-
-
-			int nHeight = min(nMaxHeight, lpBI->bmiHeader.biHeight);
-			int nWidth = (nHeight * lpBI->bmiHeader.biWidth) / lpBI->bmiHeader.biHeight;
-			
 			if(pBitMap)
 			{
 				if (nMaxHeight < INT_MAX)
 				{
-					//first create a bitmap of the real size, this is used to pass into Gdiplus::Bitmap to resize more accuratly
-					CBitmap tmp;
-					tmp.CreateCompatibleBitmap(pDC, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight);
-					ASSERT(tmp.m_hObject != NULL);
-
-					CDC MemDc;
-					MemDc.CreateCompatibleDC(pDC);
+					Gdiplus::Bitmap *gdipBitmap = pClip->CreateGdiplusBitmap();
 
-					CBitmap* oldBitmap = MemDc.SelectObject(&tmp);			
-				
-					::StretchDIBits(MemDc.m_hDC,
-						0, 0, 
-						lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight,
-						0, 0, lpBI->bmiHeader.biWidth, 
-						lpBI->bmiHeader.biHeight,
-						pDIBBits, lpBI, DIB_PAL_COLORS, SRCCOPY);
-
-					MemDc.SelectObject(oldBitmap);
-
-				
-					//do the resize
-					pBitMap->CreateCompatibleBitmap(pDC, nWidth, nHeight);
-					ASSERT(pBitMap->m_hObject != NULL);
+					if (gdipBitmap != NULL &&
+						gdipBitmap->GetHeight() > 0 &&
+						gdipBitmap->GetWidth() > 0)
+					{
+						int nHeight = min(nMaxHeight, gdipBitmap->GetHeight());
+						int nWidth = (nHeight * gdipBitmap->GetWidth()) / gdipBitmap->GetHeight();
 
-					CDC MemDc2;
-					MemDc2.CreateCompatibleDC(pDC);
+						//do the resize
+						pBitMap->CreateCompatibleBitmap(pDC, nWidth, nHeight);
+						ASSERT(pBitMap->m_hObject != NULL);
 
-					CBitmap* oldBitmap2 = MemDc2.SelectObject(pBitMap);
+						CDC MemDc2;
+						MemDc2.CreateCompatibleDC(pDC);
 
-					HBITMAP h = (HBITMAP)tmp;
-					Gdiplus::Bitmap gdipBitmap(h, NULL);
+						CBitmap* oldBitmap2 = MemDc2.SelectObject(pBitMap);
 
-					Gdiplus::ImageAttributes attrs;
-					Gdiplus::Rect dest(0, 0, nWidth, nHeight);
+						Gdiplus::ImageAttributes attrs;
+						Gdiplus::Rect dest(0, 0, nWidth, nHeight);
 
-					Gdiplus::Graphics graphics(MemDc2);
-					graphics.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
-					graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);
+						Gdiplus::Graphics graphics(MemDc2);
+						graphics.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
+						graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);
 
-					graphics.DrawImage(&gdipBitmap, dest, 0, 0, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight, Gdiplus::UnitPixel, &attrs);
+						graphics.DrawImage(gdipBitmap, dest, 0, 0, gdipBitmap->GetWidth(), gdipBitmap->GetHeight(), Gdiplus::UnitPixel, &attrs);
 
-					MemDc2.SelectObject(oldBitmap2);
+						MemDc2.SelectObject(oldBitmap2);
+					}
 
-					tmp.DeleteObject();
+					delete gdipBitmap;
 				}
-				else
+				/*else
 				{
 					pBitMap->CreateCompatibleBitmap(pDC, nWidth, nHeight);
 					ASSERT(pBitMap->m_hObject != NULL);
@@ -130,6 +95,7 @@ BOOL CBitmapHelper::GetCBitmap(void	*pClip2, CDC *pDC, CBitmap *pBitMap, int nMa
 
 					CBitmap* oldBitmap = MemDc.SelectObject(pBitMap);
 
+
 					::StretchDIBits(MemDc.m_hDC,
 						0, 0,
 						lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight,
@@ -138,13 +104,12 @@ BOOL CBitmapHelper::GetCBitmap(void	*pClip2, CDC *pDC, CBitmap *pBitMap, int nMa
 						pDIBBits, lpBI, DIB_PAL_COLORS, SRCCOPY);
 
 					MemDc.SelectObject(oldBitmap);
-				}
+				}*/
 
 				bRet = TRUE;
 			}
-		}
-	}
 	}
+	
 
 	return bRet;
 }

+ 74 - 1
Clip.cpp

@@ -134,6 +134,56 @@ void CClipFormat::Free()
 	}
 }
 
+Gdiplus::Bitmap *CClipFormat::CreateGdiplusBitmap()
+{
+	Gdiplus::Bitmap *gdipBitmap = NULL;
+	IStream* pIStream = NULL;
+
+	if (CreateStreamOnHGlobal(NULL, TRUE, (LPSTREAM*)&pIStream) == S_OK)
+	{
+		if (this->m_cfType == CF_DIB)
+		{
+			LPVOID pvData = GlobalLock(this->m_hgData);
+			ULONG size = (ULONG)GlobalSize(this->m_hgData);
+
+			BITMAPINFO *lpBI = (BITMAPINFO *)pvData;
+
+			int nPaletteEntries = 1 << lpBI->bmiHeader.biBitCount;
+			if (lpBI->bmiHeader.biBitCount > 8)
+				nPaletteEntries = 0;
+			else if (lpBI->bmiHeader.biClrUsed != 0)
+				nPaletteEntries = lpBI->bmiHeader.biClrUsed;
+
+			BITMAPFILEHEADER BFH;
+			memset(&BFH, 0, sizeof(BITMAPFILEHEADER));
+			BFH.bfType = 'MB';
+			BFH.bfSize = sizeof(BITMAPFILEHEADER) + size;
+			BFH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nPaletteEntries * sizeof(RGBQUAD);
+
+			pIStream->Write(&BFH, sizeof(BITMAPFILEHEADER), NULL);
+			pIStream->Write(pvData, size, NULL);
+
+			GlobalUnlock(this->m_hgData);
+
+			gdipBitmap = Gdiplus::Bitmap::FromStream(pIStream);
+		}
+		else if (this->m_cfType == theApp.m_PNG_Format)
+		{
+			LPVOID pvData = GlobalLock(this->m_hgData);
+			ULONG size = (ULONG)GlobalSize(this->m_hgData);
+			pIStream->Write(pvData, size, NULL);
+
+			GlobalUnlock(this->m_hgData);
+
+			gdipBitmap = Gdiplus::Bitmap::FromStream(pIStream);
+		}
+
+		pIStream->Release();
+	}
+
+	return gdipBitmap;
+}
+
 
 
 /*----------------------------------------------------------------------------*\
@@ -156,6 +206,8 @@ CClipFormat* CClipFormats::FindFormat(UINT cfType)
 }
 
 
+
+
 /*----------------------------------------------------------------------------*\
 CClip - holds multiple CClipFormats and CopyClipboard() statistics
 \*----------------------------------------------------------------------------*/
@@ -1876,6 +1928,27 @@ bool CClip::AddFileDataToData(CString &errorMessage)
 	return addedFileData;
 }
 
+Gdiplus::Bitmap *CClip::CreateGdiplusBitmap()
+{
+	Gdiplus::Bitmap *gdipBitmap = NULL;
+
+	CClipFormat *png = this->m_Formats.FindFormat(GetFormatID(_T("PNG")));
+	if (png != NULL)
+	{
+		gdipBitmap = png->CreateGdiplusBitmap();
+	}
+	else
+	{
+		CClipFormat *dib = this->m_Formats.FindFormat(CF_DIB);
+		if (dib != NULL)
+		{
+			gdipBitmap = dib->CreateGdiplusBitmap();
+		}
+	}
+
+	return gdipBitmap;
+}
+
 /*----------------------------------------------------------------------------*\
 CClipList
 \*----------------------------------------------------------------------------*/
@@ -1954,4 +2027,4 @@ const CClipList& CClipList::operator=(const CClipList &cliplist)
 	}
 	
 	return *this;
-}
+}

+ 4 - 0
Clip.h

@@ -53,6 +53,8 @@ public:
 	virtual void Data(HGLOBAL data) { m_hgData = data; }
 	virtual void AutoDeleteData(bool autoDeleteData) { m_autoDeleteData = autoDeleteData; }
 	virtual bool AutoDeleteData()	{ return m_autoDeleteData; }
+
+	Gdiplus::Bitmap *CreateGdiplusBitmap();
 };
 
 /*----------------------------------------------------------------------------*\
@@ -164,6 +166,8 @@ public:
 	static double GetNewLastSticky(int parentId, int clipId);
 
 	bool AddFileDataToData(CString &errorMessage);
+
+	Gdiplus::Bitmap *CreateGdiplusBitmap();
 	
 protected:
 	bool AddToMainTable();

+ 3 - 1
ClipFormatQListCtrl.cpp

@@ -1,6 +1,7 @@
 #include "stdafx.h"
 #include "ClipFormatQListCtrl.h"
 #include "BitmapHelper.h"
+#include "CP_Main.h"
 
 CClipFormatQListCtrl::CClipFormatQListCtrl(void)
 {
@@ -16,7 +17,8 @@ CClipFormatQListCtrl::~CClipFormatQListCtrl(void)
 
 HGLOBAL CClipFormatQListCtrl::GetDibFittingToHeight(CDC *pDc, int height)
 {
-	if(m_cfType != CF_DIB)
+	if(m_cfType != CF_DIB &&
+		m_cfType != theApp.m_PNG_Format)
 	{
 		return NULL;
 	}

+ 17 - 28
ImageViewer.cpp

@@ -13,13 +13,14 @@ IMPLEMENT_DYNAMIC(CImageViewer, CWnd)
 
 CImageViewer::CImageViewer()
 {
-	m_pBitmap = NULL;
 	m_scrollHelper.AttachWnd(this);
 	m_hoveringOverImage = false;
+	m_pGdiplusBitmap = NULL;
 }
 
 CImageViewer::~CImageViewer()
 {
+	delete m_pGdiplusBitmap;
 }
 
 
@@ -68,7 +69,7 @@ BOOL CImageViewer::Create(CWnd* pParent)
 
 void CImageViewer::UpdateBitmapSize()
 {
-	if (m_pBitmap != NULL)
+	if (m_pGdiplusBitmap != NULL)
 	{
 		if (CGetSetOptions::GetScaleImagesToDescWindow())
 		{
@@ -81,10 +82,8 @@ void CImageViewer::UpdateBitmapSize()
 		}
 		else
 		{
-			int nWidth = CBitmapHelper::GetCBitmapWidth(*m_pBitmap);
-			int nHeight = CBitmapHelper::GetCBitmapHeight(*m_pBitmap);
 			m_scrollHelper.AttachWnd(this);
-			m_scrollHelper.SetDisplaySize(nWidth, nHeight);
+			m_scrollHelper.SetDisplaySize(m_pGdiplusBitmap->GetWidth(), m_pGdiplusBitmap->GetHeight());
 		}
 	}
 }
@@ -103,21 +102,13 @@ void CImageViewer::OnPaint()
 
 	dc.FillRect(&rect, &Brush);
 
-	if (m_pBitmap)
+	if (m_pGdiplusBitmap)
 	{
-		CDC MemDc;
-		MemDc.CreateCompatibleDC(&dc);
-
-		CBitmap *oldBitmap = MemDc.SelectObject(m_pBitmap);
-
-		int width = CBitmapHelper::GetCBitmapWidth(*m_pBitmap);
-		int height = CBitmapHelper::GetCBitmapHeight(*m_pBitmap);
+		int width = m_pGdiplusBitmap->GetWidth();
+		int height = m_pGdiplusBitmap->GetHeight();
 		
 		if (CGetSetOptions::GetScaleImagesToDescWindow())
 		{
-			HBITMAP h = (HBITMAP)*m_pBitmap;
-			Gdiplus::Bitmap gdipBitmap(h, NULL);
-
 			double newWidth = rect.Width();
 			double newHeight = rect.Height();
 
@@ -146,21 +137,19 @@ void CImageViewer::OnPaint()
 			graphics.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
 			graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);
 
-			graphics.DrawImage(&gdipBitmap, dest, 0, 0, width, height, Gdiplus::UnitPixel, &attrs);
-			
-			//dc.StretchBlt(rect.left, rect.top, newWidth, newHeight, &MemDc, 0, 0, width, height, SRCCOPY);
-			//OutputDebugString(StrF(_T("scaling image, window size %d/%d, image %d/%d\n"), min(nWidth, rect.Width()), min(nHeight, rect.Height()), nWidth, nHeight));
+			graphics.DrawImage(m_pGdiplusBitmap, dest, 0, 0, width, height, Gdiplus::UnitPixel, &attrs);
+
+
 		}
 		else
 		{
 			CSize s = m_scrollHelper.GetScrollPos();
-			dc.BitBlt(rect.left, rect.top, width, height, &MemDc, s.cx, s.cy, SRCCOPY);
-		}
-
-		//dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDc, 0, 0, nWidth, nHeight, SRCCOPY);
-
-		MemDc.SelectObject(oldBitmap);
+			Gdiplus::Graphics graphics(dc);
+			graphics.DrawImage(m_pGdiplusBitmap, rect.left, rect.top, s.cx, s.cy, width, height, Gdiplus::UnitPixel);
 
+			//dc.BitBlt(rect.left, rect.top, width, height, &MemDc, s.cx, s.cy, SRCCOPY);
+		}
+		
 		rect.top += height;
 	}
 	
@@ -193,7 +182,7 @@ void CImageViewer::OnSize(UINT nType, int cx, int cy)
 
 BOOL CImageViewer::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
 {
-	if (this->m_pBitmap &&
+	if (this->m_pGdiplusBitmap &&
 		pWnd->m_hWnd == this->m_hWnd &&
 		nHitTest == HTCLIENT)
 	{
@@ -219,7 +208,7 @@ BOOL CImageViewer::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
 
 void CImageViewer::OnLButtonUp(UINT nFlags, CPoint point)
 {
-	if (this->m_pBitmap &&
+	if (this->m_pGdiplusBitmap &&
 		m_hoveringOverImage)
 	{
 		CGetSetOptions::SetScaleImagesToDescWindow(!CGetSetOptions::GetScaleImagesToDescWindow());

+ 2 - 1
ImageViewer.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "ScrollHelper.h"
+#include "Clip.h"
 
 
 
@@ -12,7 +13,7 @@ public:
 	CImageViewer();
 	virtual ~CImageViewer();
 
-	CBitmap *m_pBitmap;
+	Gdiplus::Bitmap *m_pGdiplusBitmap;
 	CScrollHelper m_scrollHelper;
 
 	void UpdateBitmapSize();

+ 14 - 27
QListCtrl.cpp

@@ -1006,7 +1006,7 @@ bool CQListCtrl::ShowFullDescription(bool bFromAuto, bool fromNextPrev)
 		m_pToolTip->GetWindowRectEx(r);
 		pt = r.TopLeft();
 
-		m_pToolTip->SetBitmap(NULL);
+		m_pToolTip->SetGdiplusBitmap(NULL);
 		m_pToolTip->SetRTFText("");
 		m_pToolTip->SetToolTipText(_T(""));
 		
@@ -1023,8 +1023,8 @@ bool CQListCtrl::ShowFullDescription(bool bFromAuto, bool fromNextPrev)
 		m_pToolTip->SetToolTipText(_T(""));  
 		m_pToolTip->SetRTFText("    ");
 		bool bSetPlainText = false;
-		CClipFormat Clip;
 
+		CClipFormat Clip;
 
 		try
 		{
@@ -1086,10 +1086,6 @@ bool CQListCtrl::ShowFullDescription(bool bFromAuto, bool fromNextPrev)
 			}
 		}
 		CATCH_SQLITE_EXCEPTION
-
-
-
-
 		
 		Clip.m_cfType = CF_UNICODETEXT;
 		if(GetClipData(nItem, Clip) && Clip.m_hgData)
@@ -1148,31 +1144,22 @@ bool CQListCtrl::ShowFullDescription(bool bFromAuto, bool fromNextPrev)
 
 			Clip.Free();
 			Clip.Clear();
-		}	
-			
-		Clip.m_cfType = CF_DIB;
-				
+		}				
+
+		Clip.m_cfType = CF_DIB;				
 		if(GetClipData(nItem, Clip) && Clip.m_hgData)
-		{			
-			CBitmap *pBitMap = new CBitmap;
-			if(pBitMap)
+		{
+			m_pToolTip->SetGdiplusBitmap(Clip.CreateGdiplusBitmap());
+		}
+		else
+		{
+			Clip.m_cfType = theApp.m_PNG_Format;
+			if (GetClipData(nItem, Clip) && Clip.m_hgData)
 			{
-				CRect rcItem;
-				GetWindowRect(rcItem);
-				
-				CDC *pDC = GetDC();;
-
-				CBitmapHelper::GetCBitmap(&Clip, pDC, pBitMap, MAXINT);
 
-				ReleaseDC(pDC);
-
-				//Tooltip wnd will release
-				m_pToolTip->SetBitmap(pBitMap);
+				m_pToolTip->SetGdiplusBitmap(Clip.CreateGdiplusBitmap());
 			}
-
-			Clip.Free();
-			Clip.Clear();
-		}			
+		}
 		
 		m_pToolTip->Show(pt);
 	}

+ 15 - 3
QPasteWndThread.cpp

@@ -348,7 +348,17 @@ void CQPasteWndThread::OnLoadExtraData(void *param)
 		{
 			DWORD startLoadClipData = GetTickCount();
 
-			if (theApp.GetClipData(it->m_parentId, *it))
+			BOOL foundClipData = theApp.GetClipData(it->m_parentId, *it);
+			if (foundClipData == false &&
+				it->m_cfType == CF_DIB)
+			{
+				it->Free();
+				it->m_cfType = theApp.m_PNG_Format;
+
+				foundClipData = theApp.GetClipData(it->m_parentId, *it);
+			}
+
+			if (foundClipData)
 			{
 				DWORD timeTook = GetTickCount() - startLoadClipData;
 				if (timeTook > 20)
@@ -356,7 +366,8 @@ void CQPasteWndThread::OnLoadExtraData(void *param)
 					Log(StrF(_T("GetClipData for clip %d, took: %d"), it->m_parentId, timeTook));
 				}
 
-				if (it->m_cfType == CF_DIB)
+				if (it->m_cfType == CF_DIB ||
+					it->m_cfType == theApp.m_PNG_Format)
 				{
 					DWORD startConvertImage = GetTickCount();
 
@@ -394,7 +405,8 @@ void CQPasteWndThread::OnLoadExtraData(void *param)
 			{
 				ATL::CCritSecLock csLock(pasteWnd->m_CritSection.m_sect);
 
-				if (it->m_cfType == CF_DIB)
+				if (it->m_cfType == CF_DIB ||
+					it->m_cfType == theApp.m_PNG_Format)
 				{
 					pasteWnd->m_cf_NO_dibCache[it->m_parentId] = true;
 				}

+ 15 - 29
ToolTipEx.cpp

@@ -12,13 +12,6 @@
     static char THIS_FILE[] = __FILE__;
 #endif 
 
-#define DELETE_BITMAP	if(m_imageViewer.m_pBitmap)					\
-{								\
-m_imageViewer.m_pBitmap->DeleteObject();	\
-delete m_imageViewer.m_pBitmap;		\
-m_imageViewer.m_pBitmap = NULL;		\
-}
-
 #define HIDE_WINDOW_TIMER 1
 #define SAVE_SIZE 2
 #define TIMER_BUTTON_UP 3
@@ -39,7 +32,6 @@ CToolTipEx::CToolTipEx(): m_dwTextStyle(DT_EXPANDTABS | DT_EXTERNALLEADING |
 
 CToolTipEx::~CToolTipEx()
 {
-    DELETE_BITMAP 
     m_Font.DeleteObject();
 	m_clipDataFont.DeleteObject();
 }
@@ -132,7 +124,7 @@ BOOL CToolTipEx::Create(CWnd *pParentWnd)
 BOOL CToolTipEx::Show(CPoint point)
 {
 	m_reducedWindowSize = false;
-    if(m_imageViewer.m_pBitmap)
+    if(m_imageViewer.m_pGdiplusBitmap)
     {
         m_RichEdit.ShowWindow(SW_HIDE);
 		m_imageViewer.ShowWindow(SW_SHOW);
@@ -166,10 +158,10 @@ BOOL CToolTipEx::Show(CPoint point)
 		rect.right += 20;
 		rect.bottom += 20;
 
-		if (m_imageViewer.m_pBitmap)
+		if (m_imageViewer.m_pGdiplusBitmap)
 		{
-			int nWidth = CBitmapHelper::GetCBitmapWidth(*m_imageViewer.m_pBitmap) + ::GetSystemMetrics(SM_CXVSCROLL);
-			int nHeight = CBitmapHelper::GetCBitmapHeight(*m_imageViewer.m_pBitmap) + ::GetSystemMetrics(SM_CYHSCROLL);
+			int nWidth = m_imageViewer.m_pGdiplusBitmap->GetWidth() + ::GetSystemMetrics(SM_CXVSCROLL);
+			int nHeight = m_imageViewer.m_pGdiplusBitmap->GetHeight() + ::GetSystemMetrics(SM_CYHSCROLL);
 
 			rect.right = rect.left + nWidth;
 			rect.bottom = rect.top + nHeight;
@@ -265,7 +257,8 @@ void CToolTipEx::GetWindowRectEx(LPRECT lpRect)
 
 BOOL CToolTipEx::Hide()
 {
-	DELETE_BITMAP
+	delete m_imageViewer.m_pGdiplusBitmap;
+	m_imageViewer.m_pGdiplusBitmap = NULL;
 
 	SaveWindowSize();
 
@@ -457,7 +450,7 @@ BOOL CToolTipEx::OnMsg(MSG *pMsg)
 
 		case WM_MOUSEWHEEL:
 		{
-			if (m_imageViewer.m_pBitmap)
+			if (m_imageViewer.m_pGdiplusBitmap)
 			{
 				m_imageViewer.PostMessageW(pMsg->message, pMsg->wParam, pMsg->lParam);
 				return TRUE;
@@ -529,10 +522,10 @@ CRect CToolTipEx::GetBoundsRect()
     rect.bottom += m_rectMargin.top + m_rectMargin.bottom;
     rect.right += m_rectMargin.left + m_rectMargin.right + 2;
 
-    if(m_imageViewer.m_pBitmap)
+    if(m_imageViewer.m_pGdiplusBitmap)
     {
-        int nWidth = CBitmapHelper::GetCBitmapWidth(*m_imageViewer.m_pBitmap);
-        int nHeight = CBitmapHelper::GetCBitmapHeight(*m_imageViewer.m_pBitmap);
+		int nWidth = m_imageViewer.m_pGdiplusBitmap->GetWidth();
+		int nHeight = m_imageViewer.m_pGdiplusBitmap->GetHeight();
 
         rect.bottom += nHeight;
         if((rect.left + nWidth) > rect.right)
@@ -631,21 +624,14 @@ BOOL CToolTipEx::SetLogFont(LPLOGFONT lpLogFont, BOOL bRedraw /*=TRUE*/)
     return TRUE;
 }
 
-void CToolTipEx::SetBitmap(CBitmap *pBitmap)
+void CToolTipEx::SetGdiplusBitmap(Gdiplus::Bitmap *gdiplusBitmap)
 {
-    DELETE_BITMAP 
-
-	m_imageViewer.m_pBitmap = pBitmap;
+	delete m_imageViewer.m_pGdiplusBitmap;
+	m_imageViewer.m_pGdiplusBitmap = NULL;
 
+	m_imageViewer.m_pGdiplusBitmap = gdiplusBitmap;
 	m_imageViewer.UpdateBitmapSize();
-
-	if (m_imageViewer.m_pBitmap != NULL)
-	{
-		int nWidth = CBitmapHelper::GetCBitmapWidth(*m_imageViewer.m_pBitmap);
-		int nHeight = CBitmapHelper::GetCBitmapHeight(*m_imageViewer.m_pBitmap);
-
-		Invalidate();
-	}
+	Invalidate();
 }
 
 void CToolTipEx::OnSize(UINT nType, int cx, int cy)

+ 3 - 1
ToolTipEx.h

@@ -25,7 +25,7 @@ public:
 	BOOL Hide();
 	void SetToolTipText(const CString &csText);
 	void SetRTFText(const char *pRTF);
-	void SetBitmap(CBitmap *pBitmap);
+	void SetGdiplusBitmap(Gdiplus::Bitmap *gdiplusBitmap);
 	void SetNotifyWnd(CWnd *pNotify)		{ m_pNotifyWnd = pNotify;	}
 	void HideWindowInXMilliSeconds(long lms);
 	CRect GetBoundsRect();
@@ -51,6 +51,7 @@ public:
 
 	void DoSearch();
 
+
 // Overrides
 	// ClassWizard generated virtual function overrides
 	//{{AFX_VIRTUAL(CToolTipEx)
@@ -88,6 +89,7 @@ protected:
 	CAccels *m_pToolTipActions;
 	bool m_bMaxSetTimer;
 	int m_lDelayMaxSeconds;
+	
 
 protected:
 	CString GetFieldFromString(CString ref, int nIndex, TCHAR ch);