DialogBitmapExport.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:12k
源码类别:
对话框与窗口
开发平台:
Visual C++
- // DialogBitmapExport.cpp : implementation file
- //
- // 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 "resource.h"
- #include "DialogBitmapExport.h"
- #include "ResourceManager.h"
- #define BFT_BITMAP 0x4d42 /* 'BM' */
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- CString GetStringID(CResourceManager* pResourceManager, int nID)
- {
- if (pResourceManager)
- return pResourceManager->GetStringID(nID);
- CString str;
- str.Format(_T("%i"), nID);
- return str;
- }
- CXTPImageManagerIconHandle& CImage::GetHandle()
- {
- XTPImageState state = imageState == -1? pParent->m_imageState: imageState;
- return state == xtpImageNormal? pIcon->GetIcon(): state == xtpImageHot? pIcon->GetHotIcon():
- state == xtpImageChecked? pIcon->GetCheckedIcon(): pIcon->GetDisabledIcon();
- }
- LRESULT CComboBoxMask::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
- {
- switch (message)
- {
- case WM_KILLFOCUS:
- {
- LRESULT lResult = CComboBox::WindowProc(message, wParam, lParam);
- Invalidate(FALSE);
- return lResult;
- }
- case WM_PAINT:
- {
- CPaintDC dc(this);
- // Get the client rect, and paint to a memory device context.
- // This will help reduce screen flicker. Pass the memory
- // device context to the default window procedure to do
- // default painting.
- CRect r;
- GetClientRect(&r);
- CXTPBufferDC memDC(dc, r);
- memDC.FillSolidRect(r, GetSysColor(COLOR_WINDOW));
- CComboBox::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
- if (IsWindowEnabled())
- {
- r.DeflateRect(3, 3, 3 + ::GetSystemMetrics(SM_CXHTHUMB), 3);
- COLORREF clr = ((CDialogBitmapImagesHost*)GetParent())->m_clrMask;
- memDC.FillSolidRect(r, clr);
- }
- return TRUE;
- }
- }
- return CComboBox::WindowProc(message, wParam, lParam);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CDialogBitmapExport dialog
- CDialogBitmapExport::CDialogBitmapExport(CXTPImageManager* pImageManager, CResourceManager* pResourceManager)
- : CDialogBitmapImagesHost(CDialogBitmapExport::IDD, pResourceManager)
- , m_pImageManager(pImageManager)
- {
- //{{AFX_DATA_INIT(CDialogBitmapExport)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- }
- void CDialogBitmapExport::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CDialogBitmapExport)
- DDX_Control(pDX, IDC_COMBO_MASK, m_comboMask);
- DDX_Control(pDX, IDC_COMBO_STATE, m_comboState);
- DDX_Control(pDX, IDC_COMBO_DEVICE, m_comboDevice);
- DDX_Control(pDX, IDC_COMBO_ID, m_comboId);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CDialogBitmapExport, CDialog)
- //{{AFX_MSG_MAP(CDialogBitmapExport)
- ON_CBN_SELCHANGE(IDC_COMBO_MASK, OnSelchangeComboMask)
- ON_CBN_DBLCLK(IDC_COMBO_MASK, OnDblclkComboMask)
- ON_CBN_SELCHANGE(IDC_COMBO_STATE, OnStateChanged)
- ON_CBN_SELCHANGE(IDC_COMBO_DEVICE, OnDeviceChanged)
- ON_CBN_SELCHANGE(IDC_COMBO_ID, OnIdChanged)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDialogBitmapExport message handlers
- BOOL CDialogBitmapExport::OnInitDialog()
- {
- CDialog::OnInitDialog();
- ASSERT(m_pImageManager);
- CXTPWindowRect rc(GetDlgItem(IDC_STATIC_IMAGES));
- ScreenToClient(&rc);
- m_wndImages.Create(AfxRegisterWndClass(0, ::LoadCursor(0, IDC_ARROW)), 0, WS_CHILD|WS_VISIBLE, rc, this, 0);
- CMap<UINT, UINT, CXTPImageManagerIconSet*, CXTPImageManagerIconSet*>* pImages = m_pImageManager->GetImages();
- UINT nID, nWidth;
- CXTPImageManagerIconSet* pIconSet;
- CXTPImageManagerIcon* pIcon;
- POSITION pos = pImages->GetStartPosition();
- while (pos)
- {
- pImages->GetNextAssoc(pos, nID, pIconSet);
- CXTPImageManagerIconSet::CIconSetMap* pIconSetMap = pIconSet->GetIcons();
- POSITION posIconSet = pIconSetMap->GetStartPosition();
- while (posIconSet)
- {
- pIconSetMap->GetNextAssoc(posIconSet, nWidth, pIcon);
- if (pIcon->IsScaled())
- continue;
- CString strDevice;
- strDevice.Format(_T("%ix%i"), pIcon->GetWidth(), pIcon->GetHeight());
- if (m_comboDevice.FindStringExact(0, strDevice) == -1)
- {
- int nIndex = m_comboDevice.AddString(strDevice);
- m_comboDevice.SetItemData(nIndex, MAKELONG(pIcon->GetWidth(), pIcon->GetHeight()));
- }
- }
- }
- m_comboMask.AddString(_T("Select Color..."));
- m_comboDevice.SetCurSel(0);
- OnDeviceChanged();
- m_comboDevice.EnableWindow(m_comboDevice.GetCount() > 1);
- // TODO: Add extra initialization here
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
- void CDialogBitmapExport::OnUpdateIcons()
- {
- m_arrImages.RemoveAll();
- m_comboId.ResetContent();
- int nIndex = m_comboDevice.GetCurSel();
- if (nIndex == CB_ERR)
- return;
- DWORD dwDevice = (DWORD)m_comboDevice.GetItemData(nIndex);
- CSize sz(dwDevice);
- CMap<UINT, UINT, CXTPImageManagerIconSet*, CXTPImageManagerIconSet*>* pImages = m_pImageManager->GetImages();
- UINT nID, nWidth;
- CXTPImageManagerIconSet* pIconSet;
- CXTPImageManagerIcon* pIcon;
- POSITION pos = pImages->GetStartPosition();
- while (pos)
- {
- pImages->GetNextAssoc(pos, nID, pIconSet);
- CXTPImageManagerIconSet::CIconSetMap* pIconSetMap = pIconSet->GetIcons();
- BOOL bFound = FALSE;
- POSITION posIconSet = pIconSetMap->GetStartPosition();
- while (posIconSet)
- {
- pIconSetMap->GetNextAssoc(posIconSet, nWidth, pIcon);
- if (pIcon->IsScaled())
- continue;
- if (pIcon->GetWidth() != sz.cx || pIcon->GetHeight() != sz.cy)
- continue;
- CImage image;
- image.nID = pIcon->GetID();
- image.imageState = (XTPImageState)-1;
- image.pIcon = pIcon;
- image.pParent = this;
- int nIndex = 0;
- for (; nIndex < m_arrImages.GetSize(); nIndex ++) if (m_arrImages[nIndex].nID > image.nID)
- break;
- m_arrImages.InsertAt(nIndex, image);
- bFound = TRUE;
- }
- if (bFound)
- {
- CString strResource = GetStringID(m_pResourceManager, nID);
- int nIndex = m_comboId.AddString(strResource);
- m_comboId.SetItemData(nIndex, nID);
- }
- }
- for (int i = 0; i < m_arrImages.GetSize(); i++)
- m_arrImages[i].nIndex = i;
- m_pSelected = 0;
- m_szIcons = sz;
- m_wndImages.OnImageCountChanged();
- }
- void CDialogBitmapExport::OnImageChanged(CImage* pImage)
- {
- m_pSelected = pImage;
- m_comboState.ResetContent();
- if (pImage != NULL)
- {
- m_comboState.AddString(_T("(Default)"));
- }
- m_comboState.AddString(_T("xtpImageNormal"));
- m_comboState.AddString(_T("xtpImageDisabled"));
- m_comboState.AddString(_T("xtpImageHot"));
- m_comboState.AddString(_T("xtpImageChecked"));
- if (pImage != NULL)
- {
- m_comboState.SetCurSel(m_pSelected->imageState + 1);
- }
- else
- {
- m_comboState.SetCurSel(m_imageState);
- }
- m_comboId.EnableWindow(pImage != NULL);
- m_wndImages.Invalidate(FALSE);
- if (pImage != NULL)
- {
- CString strResource = GetStringID(m_pResourceManager, pImage->nID);
- int nIndex = m_comboId.FindStringExact(0, strResource);
- m_comboId.SetCurSel(nIndex);
- }
- else
- {
- m_comboId.SetCurSel(-1);
- }
- }
- void CDialogBitmapExport::OnSelchangeComboMask()
- {
- OnDblclkComboMask();
- }
- void CDialogBitmapExport::OnDblclkComboMask()
- {
- CColorDialog cd(m_clrMask);
- if (cd.DoModal() == IDOK)
- {
- m_clrMask = cd.GetColor();
- }
- m_comboMask.SetCurSel(-1);
- m_comboMask.Invalidate(FALSE);
- m_wndImages.Invalidate(FALSE);
- }
- void CDialogBitmapExport::OnStateChanged()
- {
- if (m_pSelected == 0)
- {
- m_imageState = (XTPImageState)m_comboState.GetCurSel();
- }
- else
- {
- m_pSelected->imageState = (XTPImageState)(m_comboState.GetCurSel() - 1);
- }
- m_wndImages.Invalidate(FALSE);
- }
- void CDialogBitmapExport::OnDeviceChanged()
- {
- int nIndex = m_comboDevice.GetCurSel();
- if (nIndex == CB_ERR)
- return;
- m_pSelected = 0;
- OnUpdateIcons();
- OnImageChanged(NULL);
- }
- void CDialogBitmapExport::OnIdChanged()
- {
- if (m_pSelected == 0)
- return;
- int nIndex = m_comboDevice.GetCurSel();
- if (nIndex == CB_ERR)
- return;
- DWORD dwDevice = (DWORD)m_comboDevice.GetItemData(nIndex);
- CSize sz(dwDevice);
- nIndex = m_comboId.GetCurSel();
- if (nIndex == CB_ERR)
- return;
- UINT nIDSelected = (UINT)m_comboId.GetItemData(nIndex);
- CMap<UINT, UINT, CXTPImageManagerIconSet*, CXTPImageManagerIconSet*>* pImages = m_pImageManager->GetImages();
- UINT nID, nWidth;
- CXTPImageManagerIconSet* pIconSet;
- CXTPImageManagerIcon* pIcon;
- POSITION pos = pImages->GetStartPosition();
- while (pos)
- {
- pImages->GetNextAssoc(pos, nID, pIconSet);
- CXTPImageManagerIconSet::CIconSetMap* pIconSetMap = pIconSet->GetIcons();
- if (pIconSet->GetID() != nIDSelected)
- continue;
- POSITION posIconSet = pIconSetMap->GetStartPosition();
- while (posIconSet)
- {
- pIconSetMap->GetNextAssoc(posIconSet, nWidth, pIcon);
- if (pIcon->IsScaled())
- continue;
- if (pIcon->GetWidth() != sz.cx || pIcon->GetHeight() != sz.cy)
- continue;
- m_pSelected->nID = nIDSelected;
- m_pSelected->pIcon = pIcon;
- m_wndImages.Invalidate(FALSE);
- return;
- }
- }
- }
- BOOL CDialogBitmapExport::CreateBitmap(BITMAPINFO* pBitmapInfo, BYTE*& pDest, CBitmap& bmp)
- {
- int nHeight = m_szIcons.cy;
- int nWidth = m_szIcons.cx * (int)m_arrImages.GetSize();
- if (nWidth == 0)
- return FALSE;
- memset(pBitmapInfo, 0, sizeof(BITMAPINFOHEADER));
- pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- pBitmapInfo->bmiHeader.biHeight = nHeight;
- pBitmapInfo->bmiHeader.biWidth = nWidth;
- UINT nSize = pBitmapInfo->bmiHeader.biHeight * pBitmapInfo->bmiHeader.biWidth * 3;
- pBitmapInfo->bmiHeader.biBitCount = 24;
- pBitmapInfo->bmiHeader.biSizeImage = nSize;
- pBitmapInfo->bmiHeader.biCompression = BI_RGB;
- pBitmapInfo->bmiHeader.biPlanes = 1;
- CDC dcSrc;
- dcSrc.CreateCompatibleDC(NULL);
- HBITMAP hBmpResult = CreateDIBSection(dcSrc, pBitmapInfo, DIB_RGB_COLORS, (void**)&pDest, NULL, 0);
- ASSERT(hBmpResult);
- if (!hBmpResult)
- return FALSE;
- HBITMAP hbmpOld = (HBITMAP)::SelectObject(dcSrc, hBmpResult);
- dcSrc.FillSolidRect(0, 0, nWidth, nHeight, m_clrMask);
- for (int i = 0; i < m_arrImages.GetSize(); i++)
- {
- CPoint pt(0 + i * m_szIcons.cx, 0);
- CXTPImageManagerIcon* pIcon = m_arrImages[i].pIcon;
- if (pIcon)
- {
- CXTPImageManagerIconHandle& pHandle = m_arrImages[i].GetHandle();
- pIcon->Draw(&dcSrc, pt, pHandle, m_szIcons);
- }
- }
- ::SelectObject(dcSrc, hbmpOld);
- bmp.Attach(hBmpResult);
- return TRUE;
- }
- void CDialogBitmapExport::OnOK()
- {
- CString strFilter = _T("Bitmap Files (*.bmp)|*.bmp|All files (*.*)|*.*||");
- CFileDialog fd(FALSE, _T("bmp"), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, strFilter);
- if (fd.DoModal() != IDOK)
- return;
- BITMAPINFO bmi;
- BYTE* pDest = NULL;
- CBitmap bmp;
- if (!CreateBitmap(&bmi, pDest, bmp))
- return;
- CFile fileResult(fd.GetPathName(), CFile::modeWrite|CFile::modeCreate);
- BITMAPFILEHEADER hdr;
- hdr.bfType = BFT_BITMAP;
- hdr.bfSize = bmi.bmiHeader.biSizeImage + sizeof (BITMAPFILEHEADER);
- hdr.bfReserved1 = 0;
- hdr.bfReserved2 = 0;
- hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSize;
- fileResult.Write(&hdr, sizeof(BITMAPFILEHEADER));
- fileResult.Write(&bmi, sizeof(BITMAPINFOHEADER));
- fileResult.Write(pDest, bmi.bmiHeader.biSizeImage);
- fileResult.Close();
- CDialog::OnOK();
- }