DialogBitmapImport.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:8k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // DialogBitmapImport.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "resource.h"
  22. #include "DialogBitmapImport.h"
  23. #include "ResourceManager.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CDialogBitmapImport dialog
  31. CDialogBitmapImport::CDialogBitmapImport(CXTPImageManager* pImageManager, LPCTSTR lpszFileName, CResourceManager* pResourceManager)
  32. : CDialogBitmapImagesHost(CDialogBitmapImport::IDD, pResourceManager)
  33. , m_pParentImageManager(pImageManager)
  34. {
  35. //{{AFX_DATA_INIT(CDialogBitmapImport)
  36. // NOTE: the ClassWizard will add member initialization here
  37. //}}AFX_DATA_INIT
  38. m_strFileName = lpszFileName;
  39. m_pImageManager = new CXTPImageManager();
  40. m_szBitmap = GetBitmapSize();
  41. m_szIcons = m_szBitmap;
  42. int delta = m_szBitmap.cx;
  43. for (int i = 1; i < m_szBitmap.cx - 1; i++)
  44. {
  45. int nWidth = m_szBitmap.cx / i;
  46. if (nWidth * i != m_szBitmap.cx)
  47. continue;
  48. if (abs(nWidth - m_szIcons.cy) < delta)
  49. {
  50. delta = abs(nWidth - m_szIcons.cy);
  51. m_szIcons.cx = nWidth;
  52. }
  53. }
  54. ReloadBitmap();
  55. }
  56. CDialogBitmapImport::~CDialogBitmapImport()
  57. {
  58. if (m_pImageManager)
  59. {
  60. delete m_pImageManager;
  61. }
  62. }
  63. void CDialogBitmapImport::DoDataExchange(CDataExchange* pDX)
  64. {
  65. CDialog::DoDataExchange(pDX);
  66. //{{AFX_DATA_MAP(CDialogBitmapImport)
  67. DDX_Control(pDX, IDC_COMBO_MASK, m_comboMask);
  68. DDX_Control(pDX, IDC_COMBO_STATE, m_comboState);
  69. DDX_Control(pDX, IDC_COMBO_DEVICE, m_comboDevice);
  70. DDX_Control(pDX, IDC_COMBO_ID, m_comboId);
  71. //}}AFX_DATA_MAP
  72. }
  73. BEGIN_MESSAGE_MAP(CDialogBitmapImport, CDialog)
  74. //{{AFX_MSG_MAP(CDialogBitmapImport)
  75. ON_CBN_SELCHANGE(IDC_COMBO_ID, OnIdChanged)
  76. ON_CBN_SELCHANGE(IDC_COMBO_DEVICE, OnDeviceChanged)
  77. ON_CBN_SELCHANGE(IDC_COMBO_MASK, OnMaskChanged)
  78. //}}AFX_MSG_MAP
  79. END_MESSAGE_MAP()
  80. /////////////////////////////////////////////////////////////////////////////
  81. // CDialogBitmapImport message handlers
  82. BOOL CDialogBitmapImport::OnInitDialog()
  83. {
  84. CDialog::OnInitDialog();
  85. ASSERT(m_pImageManager);
  86. CXTPWindowRect rc(GetDlgItem(IDC_STATIC_IMAGES));
  87. ScreenToClient(&rc);
  88. m_wndImages.Create(AfxRegisterWndClass(0, ::LoadCursor(0, IDC_ARROW)), 0, WS_CHILD|WS_VISIBLE, rc, this, 0);
  89. m_wndImages.m_bAllowEdit = FALSE;
  90. for (int i = 1; i < m_szBitmap.cx - 1; i++)
  91. {
  92. int nWidth = m_szBitmap.cx / i;
  93. if (nWidth * i != m_szBitmap.cx)
  94. continue;
  95. CString strDevice;
  96. strDevice.Format(_T("%ix%i"), nWidth, m_szIcons.cy);
  97. int nIndex = m_comboDevice.AddString(strDevice);
  98. m_comboDevice.SetItemData(nIndex, MAKELONG(nWidth, m_szIcons.cy));
  99. if (nWidth == m_szIcons.cx)
  100. m_comboDevice.SetCurSel(nIndex);
  101. }
  102. if (m_pResourceManager)
  103. {
  104. CMapResources* pResources = m_pResourceManager->GetResources();
  105. POSITION pos = pResources->GetStartPosition();
  106. while (pos)
  107. {
  108. CResourceInfo* pInfo;
  109. CString strCaption;
  110. pResources->GetNextAssoc(pos, strCaption, (CObject*&)pInfo);
  111. int nIndex = m_comboId.AddString(strCaption);
  112. m_comboId.SetItemData(nIndex, pInfo->m_nID);
  113. }
  114. }
  115. if (m_bAlpha)
  116. m_comboMask.EnableWindow(FALSE);
  117. m_comboMask.AddString(_T("Select Color..."));
  118. m_comboState.AddString(_T("xtpImageNormal"));
  119. m_comboState.AddString(_T("xtpImageDisabled"));
  120. m_comboState.AddString(_T("xtpImageHot"));
  121. m_comboState.AddString(_T("xtpImageChecked"));
  122. m_comboState.SetCurSel(0);
  123. OnUpdateIcons();
  124. OnImageChanged(0);
  125. SetWindowText(_T("Import"));
  126. GetDlgItem(IDOK)->SetWindowText(_T("Import"));
  127. return TRUE;  // return TRUE unless you set the focus to a control
  128.               // EXCEPTION: OCX Property Pages should return FALSE
  129. }
  130. void CDialogBitmapImport::OnUpdateIcons()
  131. {
  132. m_arrImages.RemoveAll();
  133. CSize sz(m_szIcons);
  134. CMap<UINT, UINT, CXTPImageManagerIconSet*, CXTPImageManagerIconSet*>* pImages = m_pImageManager->GetImages();
  135. UINT nID, nWidth;
  136. CXTPImageManagerIconSet* pIconSet;
  137. CXTPImageManagerIcon* pIcon;
  138. POSITION pos = pImages->GetStartPosition();
  139. while (pos)
  140. {
  141. pImages->GetNextAssoc(pos, nID, pIconSet);
  142. CXTPImageManagerIconSet::CIconSetMap* pIconSetMap = pIconSet->GetIcons();
  143. POSITION posIconSet  = pIconSetMap->GetStartPosition();
  144. while (posIconSet)
  145. {
  146. pIconSetMap->GetNextAssoc(posIconSet, nWidth, pIcon);
  147. CImage image;
  148. image.nID = 0;
  149. image.imageState = (XTPImageState)-1;
  150. image.pIcon = pIcon;
  151. image.pParent = this;
  152. int nIndex = 0;
  153. for (; nIndex < m_arrImages.GetSize(); nIndex ++) if (m_arrImages[nIndex].pIcon->GetID() > pIcon->GetID())
  154. break;
  155. m_arrImages.InsertAt(nIndex, image);
  156. }
  157. }
  158. for (int i = 0; i < m_arrImages.GetSize(); i++)
  159. m_arrImages[i].nIndex = i;
  160. m_pSelected = 0;
  161. m_wndImages.OnImageCountChanged();
  162. }
  163. void CDialogBitmapImport::OnImageChanged(CImage* pImage)
  164. {
  165. m_pSelected = pImage;
  166. m_comboId.EnableWindow(pImage != NULL);
  167. m_wndImages.Invalidate(FALSE);
  168. if (pImage != NULL)
  169. {
  170. CString strResource = m_pResourceManager->GetStringID(pImage->nID);
  171. int nIndex = m_comboId.FindStringExact(0, strResource);
  172. m_comboId.SetCurSel(nIndex);
  173. }
  174. else
  175. {
  176. m_comboId.SetCurSel(-1);
  177. }
  178. }
  179. void CDialogBitmapImport::OnIdChanged()
  180. {
  181. if (m_pSelected == 0)
  182. return;
  183. int nIndex = m_comboId.GetCurSel();
  184. if (nIndex == CB_ERR)
  185. return;
  186. UINT nIDSelected = (UINT)m_comboId.GetItemData(nIndex);
  187. m_pSelected->nID = nIDSelected;
  188. }
  189. CSize CDialogBitmapImport::GetBitmapSize()
  190. {
  191. HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromFile(m_strFileName);
  192. if (!hBmp)
  193. return 0;
  194. CBitmap bmpFile;
  195. bmpFile.Attach(hBmp);
  196. BITMAP bmpInfo;
  197. bmpFile.GetBitmap(&bmpInfo);
  198. m_clrMask = XTPImageManager()->GetBitmapMaskColor(bmpFile);
  199. return CSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
  200. }
  201. void CDialogBitmapImport::ReloadBitmap()
  202. {
  203. HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromFile(m_strFileName, &m_bAlpha);
  204. if (!hBmp)
  205. return;
  206. CBitmap bmpFile;
  207. bmpFile.Attach(hBmp);
  208. ASSERT(m_szBitmap.cx % m_szIcons.cx == 0);
  209. int nCount = m_szBitmap.cx / m_szIcons.cx;
  210. m_pImageManager->SetMaskColor(m_clrMask);
  211. VERIFY(m_pImageManager->SetIcons(bmpFile, 0, nCount, m_szIcons, xtpImageNormal, m_bAlpha));
  212. }
  213. void CDialogBitmapImport::OnDeviceChanged()
  214. {
  215. int nIndex = m_comboDevice.GetCurSel();
  216. if (nIndex == CB_ERR)
  217. return;
  218. m_pSelected = 0;
  219. DWORD dwDevice = (DWORD)m_comboDevice.GetItemData(nIndex);
  220. m_szIcons = CSize(dwDevice);
  221. m_pImageManager->RemoveAll();
  222. ReloadBitmap();
  223. OnUpdateIcons();
  224. OnImageChanged(NULL);
  225. }
  226. void CDialogBitmapImport::OnMaskChanged()
  227. {
  228. CColorDialog cd(m_clrMask);
  229. if (cd.DoModal() != IDOK)
  230. return;
  231. m_clrMask = cd.GetColor();
  232. m_comboMask.SetCurSel(-1);
  233. m_pSelected = 0;
  234. m_pImageManager->RemoveAll();
  235. ReloadBitmap();
  236. OnUpdateIcons();
  237. OnImageChanged(NULL);
  238. m_comboMask.Invalidate(FALSE);
  239. }
  240. void CDialogBitmapImport::OnOK()
  241. {
  242. XTPImageState imageState = (XTPImageState)m_comboState.GetCurSel();
  243. for (int i = 0; i < m_arrImages.GetSize(); i++)
  244. {
  245. CImage& image = m_arrImages[i];
  246. if (image.nID == 0)
  247. continue;
  248. CXTPImageManagerIconHandle& Handle = image.GetHandle();
  249. m_pParentImageManager->SetIcon(Handle, image.nID, 0, imageState);
  250. }
  251. CDialog::OnOK();
  252. }