XTPOffice2007Image.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:27k
源码类别:
对话框与窗口
开发平台:
Visual C++
- // XTPOffice2007Image.cpp: implementation of the CXTPOffice2007Image class.
- //
- // This file is a part of the XTREME TOOLKIT PRO MFC class library.
- // (c)1998-2008 Codejock Software, All Rights Reserved.
- //
- // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
- // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
- // CONSENT OF CODEJOCK SOFTWARE.
- //
- // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
- // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
- // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
- // SINGLE COMPUTER.
- //
- // CONTACT INFORMATION:
- // support@codejock.com
- // http://www.codejock.com
- //
- /////////////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "XTPImageManager.h"
- #include "XTPColorManager.h"
- #include "XTPResourceManager.h"
- #include "XTPDrawHelpers.h"
- #include "XTPVC50Helpers.h"
- #include "XTPVC80Helpers.h"
- #include "XTPOffice2007Image.h"
- #include "XTPNotifyConnection.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- #define TILE_VERTICAL 1
- #define TILE_HORIZONTAL 2
- #define TILE_ALL 3
- //---------------------------------------------------------------------------
- // Should be a prime number:
- // 37, 53, 79 , 101, 127, 199, 503, 1021, 1511, 2003, 3001, 4001, 5003, 6007, 8009, 12007, 16001, 32003, 48017, 64007
- #define XTP_OFFICE2007_IMAGES_HASH_TABLE_SIZE 199
- IMPLEMENT_DYNCREATE(CXTPOffice2007ImageList, CCmdTarget)
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CXTPOffice2007Image::CXTPOffice2007Image(CXTPOffice2007Images* pImages)
- {
- m_bAlpha = FALSE;
- m_bInvert = FALSE;
- m_bMultiply = FALSE;
- m_szExtent = CSize(0, 0);
- m_bImageOrientaionPreserved = FALSE;
- m_pImages = pImages;
- m_pBits = NULL;
- }
- CXTPOffice2007Image::~CXTPOffice2007Image()
- {
- if (m_pBits != NULL)
- {
- free(m_pBits);
- }
- }
- BOOL CXTPOffice2007Image::ConvertToBits(HBITMAP hBitmap)
- {
- CDC dcSrc;
- dcSrc.CreateCompatibleDC(NULL);
- LPVOID pBits = NULL;
- if (m_bAlpha)
- {
- BITMAPINFO bmi;
- memset(&bmi, 0, sizeof(bmi));
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- if (GetDIBits(dcSrc, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmi, DIB_RGB_COLORS) == 0)
- return FALSE;
- if (bmi.bmiHeader.biBitCount != 32)
- return FALSE;
- int nSize = bmi.bmiHeader.biHeight * bmi.bmiHeader.biWidth * 4;
- pBits = malloc(nSize);
- if (pBits == NULL)
- return FALSE;
- PBITMAPINFO pBitmapInfo = (PBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + 3 * sizeof(COLORREF));
- if (pBitmapInfo == NULL)
- {
- free(pBits);
- return FALSE;
- }
- MEMCPY_S(pBitmapInfo, &bmi, sizeof(BITMAPINFOHEADER));
- if (GetDIBits(dcSrc, hBitmap, 0, bmi.bmiHeader.biHeight, pBits, pBitmapInfo, DIB_RGB_COLORS) == NULL)
- {
- free(pBits);
- free(pBitmapInfo);
- return FALSE;
- }
- free(pBitmapInfo);
- }
- else
- {
- LPDWORD lpBits = NULL;
- HBITMAP hDCBitmap = CXTPImageManager::Create32BPPDIBSection(NULL, m_szExtent.cx, m_szExtent.cy, (LPBYTE*)&lpBits);
- if (!lpBits)
- return FALSE;
- HBITMAP hOldBitmap = (HBITMAP)::SelectObject(dcSrc, hDCBitmap);
- dcSrc.DrawState(CPoint(0, 0), m_szExtent, hBitmap, DSS_NORMAL, 0);
- ::SelectObject(dcSrc, hOldBitmap);
- int nSize = m_szExtent.cx * m_szExtent.cy * 4;
- pBits = malloc(nSize);
- if (!pBits)
- return FALSE;
- MEMCPY_S(pBits, lpBits, nSize);
- DeleteObject(hDCBitmap);
- }
- ASSERT(pBits);
- m_pBits = pBits;
- return TRUE;
- }
- void CXTPOffice2007Image::SetBitmap(HBITMAP hBitmap, BOOL bAlpha /*= FALSE*/)
- {
- ASSERT(m_pBits == NULL);
- m_bAlpha = bAlpha;
- m_bInvert = FALSE;
- m_bMultiply = FALSE;
- BITMAP bmpInfo;
- if (!GetObject(hBitmap, sizeof(BITMAP), &bmpInfo))
- return;
- m_szExtent = CSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
- VERIFY(ConvertToBits(hBitmap));
- DeleteObject(hBitmap);
- }
- BOOL CXTPOffice2007Image::LoadFile(HMODULE hModule, LPCTSTR lpszBitmapFileName)
- {
- m_bMultiply = FALSE;
- m_bInvert = FALSE;
- m_bAlpha = FALSE;
- if (m_pBits)
- {
- free(m_pBits);
- m_pBits = NULL;
- }
- if (!hModule)
- return FALSE;
- BOOL bAlpha = FALSE;
- HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromResource(hModule, lpszBitmapFileName, &bAlpha);
- if (!hBmp)
- return FALSE;
- SetBitmap(hBmp, bAlpha);
- return TRUE;
- }
- void CXTPOffice2007Image::Premultiply()
- {
- if (!m_bAlpha || !m_pBits || m_bMultiply)
- return;
- RGBQUAD* lprgbBitmap = (RGBQUAD*)m_pBits;
- int nCount = m_szExtent.cx * m_szExtent.cy;
- for (int i = 0; i < nCount; i++)
- {
- int nAlpha = lprgbBitmap->rgbReserved;
- lprgbBitmap->rgbBlue = BYTE(lprgbBitmap->rgbBlue * nAlpha / 255);
- lprgbBitmap->rgbGreen = BYTE(lprgbBitmap->rgbGreen * nAlpha / 255);
- lprgbBitmap->rgbRed = BYTE(lprgbBitmap->rgbRed * nAlpha / 255);
- lprgbBitmap++;
- }
- m_bMultiply = TRUE;
- }
- void CXTPOffice2007Image::InvertBitmap()
- {
- if (!m_bAlpha || !m_pBits)
- return;
- DWORD* pDest = (DWORD*)malloc(m_szExtent.cx * m_szExtent.cy * 4);
- DWORD* pDestOrig = pDest;
- DWORD* pBits = (DWORD*)m_pBits;
- for (int y = 0; y < m_szExtent.cy; y++)
- {
- DWORD* pBitsRow = &pBits[y * m_szExtent.cx + m_szExtent.cx - 1];
- for (int x = 0; x < m_szExtent.cx; x++)
- {
- *pDest++ = *pBitsRow--;
- }
- }
- free(m_pBits);
- m_pBits = pDestOrig;
- m_bInvert = !m_bInvert;
- }
- BOOL CXTPOffice2007Image::DrawImagePart(CDC* pDCDest, CRect rcDest, CDC* pDCSrc, CRect rcSrc) const
- {
- if (rcDest.Width() <= 0 || rcDest.Height() <= 0 || rcSrc.Width() <= 0 || rcSrc.Height() <= 0)
- return TRUE;
- BOOL bResult = TRUE;
- if (m_bAlpha)
- {
- bResult = XTPImageManager()->AlphaBlend(pDCDest->GetSafeHdc(), rcDest, pDCSrc->GetSafeHdc(), rcSrc);
- }
- else if ((rcSrc.Width() == rcDest.Width()) && (rcSrc.Height() == rcDest.Height()))
- {
- bResult = pDCDest->BitBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
- pDCSrc, rcSrc.left, rcSrc.top, SRCCOPY);
- }
- else
- {
- bResult = pDCDest->StretchBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
- pDCSrc, rcSrc.left, rcSrc.top, rcSrc.Width(), rcSrc.Height(), SRCCOPY);
- }
- return bResult;
- }
- void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, const CRect& rcSizingMargins, COLORREF clrTransparent, DWORD dwFlags)
- {
- if (this == NULL)
- return;
- if (m_pBits == NULL)
- return;
- if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
- return;
- if ((dwFlags & XTP_DI_COMPOSITE) == 0)
- {
- DrawImage(pDC, rcDest, rcSrc, rcSizingMargins, clrTransparent);
- return;
- }
- if (m_bAlpha)
- {
- DrawImage(pDC, rcDest, rcSrc, rcSizingMargins);
- return;
- }
- CSize sz(rcDest.Width(), rcDest.Height());
- CBitmap bmp;
- LPDWORD lpBits;
- bmp.Attach(CXTPImageManager::Create32BPPDIBSection(pDC->GetSafeHdc(), sz.cx, sz.cy, (LPBYTE*)&lpBits));
- CXTPCompatibleDC dc(pDC, &bmp);
- CRect rcDestOrig(0, 0, sz.cx, sz.cy);
- if (clrTransparent != COLORREF_NULL) dc.FillSolidRect(rcDestOrig, clrTransparent);
- DrawImage(&dc, rcDestOrig, rcSrc, rcSizingMargins);
- for (int i = 0; i < sz.cx * sz.cy; i++)
- {
- if (clrTransparent != COLORREF_NULL && lpBits[0] == clrTransparent)
- {
- lpBits[0] = 0;
- }
- else
- {
- lpBits[0] |= 0xFF000000;
- }
- lpBits++;
- }
- XTPImageManager()->AlphaBlend(*pDC, rcDest, dc, rcDestOrig);
- }
- void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, const CRect& rcSizingMargins, COLORREF clrTransparent)
- {
- if (this == NULL)
- return;
- if (m_pBits == NULL)
- return;
- if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
- return;
- if (clrTransparent == COLORREF_NULL || m_bAlpha)
- {
- DrawImage(pDC, rcDest, rcSrc, rcSizingMargins);
- return;
- }
- CBitmap bmp;
- bmp.CreateCompatibleBitmap(pDC, rcDest.Width(), rcDest.Height());
- CXTPCompatibleDC dc(pDC, &bmp);
- //dc.SetLayout(0);
- CRect rcDestOrig(0, 0, rcDest.Width(), rcDest.Height());
- dc.FillSolidRect(rcDestOrig, clrTransparent);
- DrawImage(&dc, rcDestOrig, rcSrc, rcSizingMargins);
- XTPImageManager()->TransparentBlt(*pDC, rcDest, dc, rcDestOrig, clrTransparent);
- }
- void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc)
- {
- DrawImage(pDC, rcDest, rcSrc, CRect(0, 0, 0, 0));
- }
- BOOL CXTPOffice2007Image::GetBitmapPixel(CPoint pt, COLORREF& clrPixel)
- {
- if (pt.x < 0 || pt.x >= m_szExtent.cx ||
- pt.y < 0 || pt.y >= m_szExtent.cy)
- return FALSE;
- // Initialize the surface pointers.
- LPDWORD lprgbBitmap = (LPDWORD)m_pBits + m_szExtent.cx * (m_szExtent.cy - pt.y - 1);
- clrPixel = lprgbBitmap[pt.x];
- return TRUE;
- }
- void CXTPOffice2007Image::DrawImage(CDC* pDC, const CRect& rcDest, CRect rcSrc, CRect rcSizingMargins)
- {
- if (this == NULL)
- return;
- if (m_pBits == NULL)
- return;
- if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
- return;
- ASSERT(m_pImages);
- if (!m_pImages)
- return;
- CXTPLockGuard lock(m_pImages->m_cs);
- if (rcDest.Width() == rcSrc.Width())
- {
- rcSizingMargins.left = 0;
- rcSizingMargins.right = 0;
- }
- if (rcDest.Height() == rcSrc.Height())
- {
- rcSizingMargins.top = 0;
- rcSizingMargins.bottom = 0;
- }
- pDC->SetStretchBltMode(COLORONCOLOR);
- CRect rcDestSizingMargins = rcSizingMargins;
- if (rcDest.left >= rcDest.right || rcDest.top >= rcDest.bottom)
- return;
- BOOL bRtl = CXTPDrawHelpers::IsContextRTL(pDC);
- if (m_bAlpha && m_bImageOrientaionPreserved)
- {
- if ((bRtl && !m_bInvert) || (!bRtl && m_bInvert))
- {
- InvertBitmap();
- }
- }
- if (m_szExtent.cx > 512 || m_szExtent.cy > 512)
- {
- ASSERT(FALSE);
- return;
- }
- CXTPOffice2007Images::CBitmapDC& dcSrc = m_pImages->m_dc;
- if (!dcSrc.GetSafeHdc() || ! m_pImages->m_pLayerBits)
- return;
- LPDWORD lpBitsSrc = ((LPDWORD)m_pBits) + (m_szExtent.cy - rcSrc.bottom) * m_szExtent.cx;
- LPDWORD lpBitsDest = m_pImages->m_pLayerBits + 512 * (512 - rcSrc.Height());
- rcSrc.OffsetRect(0, -rcSrc.top);
- for (int y = 0; y < rcSrc.bottom; y++)
- {
- MEMCPY_S(lpBitsDest, lpBitsSrc, m_szExtent.cx * 4);
- lpBitsSrc += m_szExtent.cx;
- lpBitsDest += 512;
- }
- dcSrc.SetBitmap(m_pImages->m_hbmLayer);
- if ((rcDest.Height() <= rcSizingMargins.top + rcSizingMargins.bottom) || (rcSrc.Height() == rcSizingMargins.top + rcSizingMargins.bottom))
- {
- rcDestSizingMargins.top = MulDiv(rcDest.Height(), rcSizingMargins.top, (rcSizingMargins.top + rcSizingMargins.bottom));
- rcDestSizingMargins.bottom = rcDest.Height() - rcDestSizingMargins.top;
- if (rcDestSizingMargins.bottom > 0 && (rcDestSizingMargins.bottom % 2 != rcSizingMargins.bottom % 2))
- rcDestSizingMargins.bottom++;
- }
- if ((rcDest.Width() <= rcSizingMargins.left + rcSizingMargins.right) || (rcSrc.Width() == rcSizingMargins.left + rcSizingMargins.right))
- {
- rcDestSizingMargins.left= rcDest.Width() * rcSizingMargins.left / (rcSizingMargins.left + rcSizingMargins.right);
- rcDestSizingMargins.right = rcDest.Width() - rcDestSizingMargins.left;
- }
- if (rcSizingMargins.IsRectNull())
- {
- DrawImagePart(pDC, rcDest, &dcSrc, rcSrc);
- }
- else if (bRtl && m_bAlpha)
- {
- DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
- &dcSrc, CRect(rcSrc.left, rcSrc.top, rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top ));
- DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.top, rcDest.right - rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top),
- &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top, rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top ));
- DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.left + rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top),
- &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top ));
- DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top, rcDest.right, rcDest.bottom - rcDestSizingMargins.bottom),
- &dcSrc, CRect(rcSrc.left, rcSrc.top + rcSizingMargins.top , rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom ));
- DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top, rcDest.right - rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom),
- &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top , rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom ));
- DrawImagePart(pDC, CRect(rcDest.left, rcDest.top + rcDestSizingMargins.top, rcDest.left + rcDestSizingMargins.right , rcDest.bottom - rcDestSizingMargins.bottom),
- &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top , rcSrc.right, rcSrc.bottom - rcSizingMargins.bottom));
- DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
- &dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.left + rcSizingMargins.left, rcSrc.bottom ));
- DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right - rcDestSizingMargins.left, rcDest.bottom),
- &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right - rcSizingMargins.right, rcSrc.bottom ));
- DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.left + rcDestSizingMargins.right, rcDest.bottom),
- &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom));
- }
- else
- {
- DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top),
- &dcSrc, CRect(rcSrc.left, rcSrc.top, rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top ));
- DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top, rcDest.right - rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top),
- &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top, rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top ));
- DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
- &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top ));
- DrawImagePart(pDC, CRect(rcDest.left, rcDest.top + rcDestSizingMargins.top, rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom),
- &dcSrc, CRect(rcSrc.left, rcSrc.top + rcSizingMargins.top , rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom ));
- DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top, rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom),
- &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top , rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom ));
- DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right , rcDest.top + rcDestSizingMargins.top, rcDest.right, rcDest.bottom - rcDestSizingMargins.bottom),
- &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top , rcSrc.right, rcSrc.bottom - rcSizingMargins.bottom));
- DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.left + rcDestSizingMargins.left, rcDest.bottom),
- &dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.left + rcSizingMargins.left, rcSrc.bottom ));
- DrawImagePart(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right - rcDestSizingMargins.right, rcDest.bottom),
- &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right - rcSizingMargins.right, rcSrc.bottom ));
- DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
- &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom));
- }
- dcSrc.SetBitmap(NULL);
- }
- CSize CXTPOffice2007Image::GetExtent() const
- {
- return m_szExtent;
- }
- CRect CXTPOffice2007Image::GetSource(int nState, int nCount) const
- {
- if (this == NULL)
- return CRect(0, 0, 0, 0);
- CRect rcImage(0, 0, m_szExtent.cx, m_szExtent.cy / nCount);
- rcImage.OffsetRect(0, nState * rcImage.Height());
- return rcImage;
- }
- int CXTPOffice2007Image::GetHeight() const
- {
- return m_szExtent.cy;
- }
- int CXTPOffice2007Image::GetWidth() const
- {
- return m_szExtent.cx;
- }
- BOOL CXTPOffice2007Image::IsAlphaImage() const
- {
- return m_bAlpha;
- }
- //////////////////////////////////////////////////////////////////////////
- //
- CXTPOffice2007Images::CXTPOffice2007Images()
- {
- m_mapImages.InitHashTable(XTP_OFFICE2007_IMAGES_HASH_TABLE_SIZE, FALSE);
- m_bFreeOnRelease = FALSE;
- m_hResource = 0;
- m_lpTextFile = 0;
- m_lpTextFileEnd = 0;
- m_pConnection = NULL;
- SetHandle(AfxGetInstanceHandle());
- m_pLayerBits = NULL;
- m_hbmLayer = CXTPImageManager::Create32BPPDIBSection(NULL, 512, 512, (LPBYTE*)&m_pLayerBits);
- HDC hdcScreen = ::GetDC(HWND_DESKTOP);
- m_dc.Attach(::CreateCompatibleDC(hdcScreen));
- ReleaseDC(HWND_DESKTOP, hdcScreen);
- ::InitializeCriticalSection(&m_cs);
- }
- CXTPOffice2007Images* AFX_CDECL XTPOffice2007Images()
- {
- static CXTPOffice2007Images images;
- return &images;
- }
- CXTPOffice2007Images::~CXTPOffice2007Images()
- {
- CMDTARGET_RELEASE(m_pConnection);
- RemoveAll();
- if (m_hResource && m_bFreeOnRelease)
- {
- FreeLibrary(m_hResource);
- }
- if (m_hbmLayer)
- {
- DeleteObject(m_hbmLayer);
- }
- ::DeleteCriticalSection(&m_cs);
- }
- CXTPNotifyConnection* CXTPOffice2007Images::GetConnection()
- {
- if (!m_pConnection)
- m_pConnection = new CXTPNotifyConnection();
- return m_pConnection;
- }
- void CXTPOffice2007Images::RemoveAll()
- {
- CString strImageFile;
- CXTPOffice2007Image* pImage;
- POSITION pos = m_mapImages.GetStartPosition();
- while (pos != NULL)
- {
- m_mapImages.GetNextAssoc( pos, strImageFile, (void*&)pImage);
- CMDTARGET_RELEASE(pImage);
- }
- m_mapImages.RemoveAll();
- }
- CString CXTPOffice2007Images::_ImageNameToResourceName(CString strImageFile)
- {
- CString strImage = GetImageString(_T("Images"), strImageFile);
- if (!strImage.IsEmpty())
- {
- strImageFile = strImage;
- }
- REPLACE_S(strImageFile, _T('.'), _T('_'));
- REPLACE_S(strImageFile, _T('\'), _T('_'));
- return strImageFile;
- }
- CXTPOffice2007Image* CXTPOffice2007Images::LoadImage(CString strImageFile)
- {
- strImageFile = _ImageNameToResourceName(strImageFile);
- CXTPOffice2007Image* pImage = new CXTPOffice2007Image(this);
- if (!pImage->LoadFile(m_hResource, strImageFile))
- {
- delete pImage;
- return NULL;
- }
- return pImage;
- }
- CXTPOffice2007Image* CXTPOffice2007Images::LoadFile(LPCTSTR lpszImageFile)
- {
- CXTPLockGuard lock(m_cs);
- if (!m_hResource)
- return NULL;
- if (lpszImageFile == NULL)
- return NULL;
- CXTPOffice2007Image* pImage = 0;
- if (m_mapImages.Lookup(lpszImageFile, (void*&)pImage))
- return pImage;
- pImage = LoadImage(lpszImageFile);
- if (!pImage)
- return NULL;
- m_mapImages.SetAt(lpszImageFile, pImage);
- return pImage;
- }
- BOOL CXTPOffice2007Images::SetHandle(LPCTSTR lpszFile, LPCTSTR lpszIniFileName)
- {
- HMODULE hModule = LoadLibrary(lpszFile);
- if (hModule)
- {
- m_strHandle = lpszFile;
- return SetHandle(hModule, lpszIniFileName, TRUE);
- }
- return SetHandle(AfxGetInstanceHandle(), lpszIniFileName);
- }
- BOOL CXTPOffice2007Images::IsValid() const
- {
- return m_lpTextFile != NULL;
- }
- BOOL CALLBACK CXTPOffice2007Images::EnumResNameProc(HMODULE /*hModule*/,
- LPCTSTR /*lpszType*/, LPTSTR lpszName, LONG_PTR lParam)
- {
- CString* pIniFileName = (CString*)lParam;
- *pIniFileName = lpszName;
- return FALSE;
- }
- HRSRC CXTPOffice2007Images::FindResourceIniFile(HMODULE hResource)
- {
- CString strIniFileName;
- EnumResourceNames(hResource, _T("TEXTFILE"), &CXTPOffice2007Images::EnumResNameProc, (LONG_PTR)&strIniFileName);
- if (strIniFileName.IsEmpty())
- return 0;
- return FindResource(m_hResource, strIniFileName, _T("TEXTFILE"));
- }
- BOOL CXTPOffice2007Images::SetHandle(HMODULE hResource, LPCTSTR lpszIniFileName, BOOL bFreeOnRelease)
- {
- if (m_hResource && m_bFreeOnRelease)
- {
- FreeLibrary(m_hResource);
- }
- CString strIniFileName(lpszIniFileName);
- if (strIniFileName.IsEmpty())
- strIniFileName = _T("OFFICE2007BLUE_INI");
- REPLACE_S(strIniFileName, _T('.'), _T('_'));
- m_hResource = hResource;
- m_bFreeOnRelease = bFreeOnRelease;
- m_lpTextFile = m_lpTextFileEnd = NULL;
- RemoveAll();
- HRSRC hRsrc = FindResource(m_hResource, strIniFileName, _T("TEXTFILE"));
- if (!hRsrc && lpszIniFileName == NULL)
- {
- hRsrc = FindResourceIniFile(hResource);
- }
- BOOL bResult = FALSE;
- if (hRsrc)
- {
- HGLOBAL hResData = LoadResource(m_hResource, hRsrc);
- if (hResData)
- {
- m_lpTextFile = (LPSTR)LockResource(hResData);
- m_lpTextFileEnd = m_lpTextFile + SizeofResource(m_hResource, hRsrc);
- bResult = TRUE;
- }
- }
- if (m_pConnection)
- m_pConnection->SendEvent(XTP_NC_COMMON_OFFICE2007IMAGES_CHANGED, 0, 0);
- return bResult;
- }
- BOOL CXTPOffice2007Images::InitResourceHandle(LPCTSTR lpszTestImageFile, LPCTSTR lpResType)
- {
- CString strResourceName = _ImageNameToResourceName(lpszTestImageFile);
- HMODULE hResource = XTPResourceManager()->GetResourceHandle();
- if (hResource == 0)
- hResource = AfxGetInstanceHandle();
- if (!::FindResource(hResource, strResourceName, lpResType))
- {
- hResource = AfxFindResourceHandle(strResourceName, lpResType);
- if (!hResource)
- return FALSE;
- }
- SetHandle(hResource);
- return TRUE;
- }
- BOOL CXTPOffice2007Images::ReadString(CString& str, LPSTR& lpTextFile)
- {
- ASSERT(lpTextFile);
- if (!lpTextFile)
- return FALSE;
- LPSTR pNextLine = strchr(lpTextFile, 'r');
- if (pNextLine == NULL || pNextLine > m_lpTextFileEnd)
- return FALSE;
- str = CONSTRUCT_S(lpTextFile, (int)(pNextLine - lpTextFile));
- lpTextFile = pNextLine + 1;
- if (lpTextFile[0] == 'n') lpTextFile = lpTextFile + 1;
- return TRUE;
- }
- COLORREF CXTPOffice2007Images::GetImageColor(CString strSectionName, CString strKeyName)
- {
- CString strValue = GetImageValue(strSectionName, strKeyName);
- if (strValue.IsEmpty())
- return COLORREF_NULL;
- int r = 0, g = 0, b = 0;
- SCANF_S(strValue, _T("%i %i %i"), &r, &g, &b);
- COLORREF clrVal = RGB(r, g, b);
- return clrVal;
- }
- CString CXTPOffice2007Images::GetImageString(CString strSectionName, CString strKeyName)
- {
- return GetImageValue(strSectionName, strKeyName);
- }
- CString CXTPOffice2007Images::GetImageValue(CString strSectionName, CString strKeyName)
- {
- if (m_lpTextFile == NULL)
- return _T("");
- strSectionName.MakeUpper();
- strKeyName.MakeUpper();
- LPSTR lpTextFile = m_lpTextFile;
- CString str;
- BOOL bSectionFound = FALSE;
- while (ReadString(str, lpTextFile))
- {
- str.TrimLeft();
- int nCommentIndex = str.Find(_T(';'));
- if (nCommentIndex == 0)
- continue;
- if (nCommentIndex > 0)
- {
- str = str.Left(nCommentIndex);
- }
- if (str.IsEmpty())
- continue;
- str.MakeUpper();
- if (str[0] == _T('['))
- {
- if (bSectionFound)
- {
- return _T("");
- }
- CString strSchemaPart = str.Mid(1, str.GetLength() - 2);
- if (strSchemaPart == strSectionName)
- {
- bSectionFound = TRUE;
- }
- }
- else if (bSectionFound)
- {
- int nPos = str.Find(_T('='));
- if (nPos <= 0)
- continue;
- CString strProperty = str.Left(nPos);
- strProperty.TrimRight();
- if (strProperty != strKeyName)
- continue;
- CString strValue = str.Mid(nPos + 1);
- strValue.TrimLeft();
- strValue.TrimRight();
- return strValue;
- }
- }
- return _T("");
- }
- void CXTPOffice2007Images::RefreshSettings()
- {
- CString str;
- LPSTR lpTextFile = m_lpTextFile;
- while (ReadString(str, lpTextFile))
- {
- str.TrimLeft();
- int nCommentIndex = str.Find(_T(';'));
- if (nCommentIndex == 0)
- continue;
- if (nCommentIndex > 0)
- {
- str = str.Left(nCommentIndex);
- }
- if (str.IsEmpty())
- continue;
- str.MakeUpper();
- }
- }
- //////////////////////////////////////////////////////////////////////////
- CXTPOffice2007ImageList::CXTPOffice2007ImageList()
- {
- }
- CXTPOffice2007ImageList::~CXTPOffice2007ImageList()
- {
- RemoveAll();
- }
- CXTPOffice2007Image* CXTPOffice2007ImageList::SetBitmap(HBITMAP hBitmap, UINT nID, BOOL bAlptha, BOOL bCopyBitmap)
- {
- ASSERT(hBitmap);
- if (!hBitmap)
- return NULL;
- HBITMAP hBmp2 = hBitmap;
- if (bCopyBitmap)
- {
- // HBITMAP CXTPImageManagerIcon::CopyAlphaBitmap(HBITMAP hBitmap)
- hBmp2 = (HBITMAP)::CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
- ASSERT(hBmp2);
- if (!hBmp2)
- return NULL;
- }
- BITMAP bmpinfo;
- if (!::GetObject(hBmp2, sizeof(bmpinfo), &bmpinfo))
- {
- ASSERT(FALSE);
- ::DeleteObject(hBmp2);
- return NULL;
- }
- CXTPOffice2007Image* pImage = new CXTPOffice2007Image(this);
- if (!pImage)
- return NULL;
- pImage->SetBitmap(hBmp2, bAlptha);
- SetBitmap(pImage, nID, FALSE);
- return pImage;
- }
- BOOL CXTPOffice2007ImageList::SetBitmap(CXTPOffice2007Image* pImage, UINT nID, BOOL bCallAddRef)
- {
- ASSERT(pImage);
- if (!pImage)
- return FALSE;
- if (bCallAddRef)
- CMDTARGET_ADDREF(pImage);
- // free prev. image if such exists
- CXTPOffice2007Image* pImage_old = GetBitmap(nID);
- CMDTARGET_RELEASE(pImage_old);
- m_mapID2Image.SetAt(nID, pImage);
- return TRUE;
- }
- CXTPOffice2007Image* CXTPOffice2007ImageList::GetBitmap(UINT nID)
- {
- CXTPOffice2007Image* pImage = NULL;
- if (!m_mapID2Image.Lookup(nID, pImage))
- return NULL;
- return pImage;
- }
- BOOL CXTPOffice2007ImageList::Remove(UINT nID)
- {
- CString strImageFile;
- CXTPOffice2007Image* pImage = NULL;
- //-------------------------------------------------
- if (!m_mapID2Image.Lookup(nID, pImage))
- return FALSE;
- m_mapID2Image.RemoveKey(nID);
- CMDTARGET_RELEASE(pImage);
- return TRUE;
- }
- void CXTPOffice2007ImageList::RemoveAll()
- {
- UINT nID;
- CXTPOffice2007Image* pImage;
- POSITION pos = m_mapID2Image.GetStartPosition();
- while (pos != NULL)
- {
- m_mapID2Image.GetNextAssoc( pos, nID, pImage);
- CMDTARGET_RELEASE(pImage);
- }
- m_mapID2Image.RemoveAll();
- }
- BOOL CXTPOffice2007ImageList::LoadBitmap(LPCTSTR lpcszPath, UINT nID)
- {
- BOOL bAlphaBitmap = FALSE;
- HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromFile(lpcszPath, &bAlphaBitmap);
- CXTPOffice2007Image* pImage = NULL;
- if (hBmp)
- {
- pImage = SetBitmap(hBmp, nID, bAlphaBitmap, FALSE);
- }
- return !!pImage;
- }
- /////////////////////////////////////////////////////////////////////////////