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

对话框与窗口

开发平台:

Visual C++

  1. // DialogBitmapExport.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 "DialogBitmapExport.h"
  23. #include "ResourceManager.h"
  24. #define BFT_BITMAP 0x4d42   /* 'BM' */
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. CString GetStringID(CResourceManager* pResourceManager, int nID)
  31. {
  32. if (pResourceManager)
  33. return pResourceManager->GetStringID(nID);
  34. CString str;
  35. str.Format(_T("%i"), nID);
  36. return str;
  37. }
  38. CXTPImageManagerIconHandle& CImage::GetHandle()
  39. {
  40. XTPImageState state = imageState == -1? pParent->m_imageState: imageState;
  41. return state == xtpImageNormal? pIcon->GetIcon(): state == xtpImageHot? pIcon->GetHotIcon():
  42. state == xtpImageChecked? pIcon->GetCheckedIcon(): pIcon->GetDisabledIcon();
  43. }
  44. LRESULT CComboBoxMask::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
  45. {
  46. switch (message)
  47. {
  48. case WM_KILLFOCUS:
  49. {
  50. LRESULT lResult = CComboBox::WindowProc(message, wParam, lParam);
  51. Invalidate(FALSE);
  52. return lResult;
  53. }
  54. case WM_PAINT:
  55. {
  56. CPaintDC dc(this);
  57. // Get the client rect, and paint to a memory device context.
  58. // This will help reduce screen flicker.  Pass the memory
  59. // device context to the default window procedure to do
  60. // default painting.
  61. CRect r;
  62. GetClientRect(&r);
  63. CXTPBufferDC memDC(dc, r);
  64. memDC.FillSolidRect(r, GetSysColor(COLOR_WINDOW));
  65. CComboBox::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
  66. if (IsWindowEnabled())
  67. {
  68. r.DeflateRect(3, 3, 3 + ::GetSystemMetrics(SM_CXHTHUMB), 3);
  69. COLORREF clr = ((CDialogBitmapImagesHost*)GetParent())->m_clrMask;
  70. memDC.FillSolidRect(r, clr);
  71. }
  72. return TRUE;
  73. }
  74. }
  75. return CComboBox::WindowProc(message, wParam, lParam);
  76. }
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CDialogBitmapExport dialog
  79. CDialogBitmapExport::CDialogBitmapExport(CXTPImageManager* pImageManager, CResourceManager* pResourceManager)
  80. : CDialogBitmapImagesHost(CDialogBitmapExport::IDD, pResourceManager)
  81. , m_pImageManager(pImageManager)
  82. {
  83. //{{AFX_DATA_INIT(CDialogBitmapExport)
  84. // NOTE: the ClassWizard will add member initialization here
  85. //}}AFX_DATA_INIT
  86. }
  87. void CDialogBitmapExport::DoDataExchange(CDataExchange* pDX)
  88. {
  89. CDialog::DoDataExchange(pDX);
  90. //{{AFX_DATA_MAP(CDialogBitmapExport)
  91. DDX_Control(pDX, IDC_COMBO_MASK, m_comboMask);
  92. DDX_Control(pDX, IDC_COMBO_STATE, m_comboState);
  93. DDX_Control(pDX, IDC_COMBO_DEVICE, m_comboDevice);
  94. DDX_Control(pDX, IDC_COMBO_ID, m_comboId);
  95. //}}AFX_DATA_MAP
  96. }
  97. BEGIN_MESSAGE_MAP(CDialogBitmapExport, CDialog)
  98. //{{AFX_MSG_MAP(CDialogBitmapExport)
  99. ON_CBN_SELCHANGE(IDC_COMBO_MASK, OnSelchangeComboMask)
  100. ON_CBN_DBLCLK(IDC_COMBO_MASK, OnDblclkComboMask)
  101. ON_CBN_SELCHANGE(IDC_COMBO_STATE, OnStateChanged)
  102. ON_CBN_SELCHANGE(IDC_COMBO_DEVICE, OnDeviceChanged)
  103. ON_CBN_SELCHANGE(IDC_COMBO_ID, OnIdChanged)
  104. //}}AFX_MSG_MAP
  105. END_MESSAGE_MAP()
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CDialogBitmapExport message handlers
  108. BOOL CDialogBitmapExport::OnInitDialog()
  109. {
  110. CDialog::OnInitDialog();
  111. ASSERT(m_pImageManager);
  112. CXTPWindowRect rc(GetDlgItem(IDC_STATIC_IMAGES));
  113. ScreenToClient(&rc);
  114. m_wndImages.Create(AfxRegisterWndClass(0, ::LoadCursor(0, IDC_ARROW)), 0, WS_CHILD|WS_VISIBLE, rc, this, 0);
  115. CMap<UINT, UINT, CXTPImageManagerIconSet*, CXTPImageManagerIconSet*>* pImages = m_pImageManager->GetImages();
  116. UINT nID, nWidth;
  117. CXTPImageManagerIconSet* pIconSet;
  118. CXTPImageManagerIcon* pIcon;
  119. POSITION pos = pImages->GetStartPosition();
  120. while (pos)
  121. {
  122. pImages->GetNextAssoc(pos, nID, pIconSet);
  123. CXTPImageManagerIconSet::CIconSetMap* pIconSetMap = pIconSet->GetIcons();
  124. POSITION posIconSet  = pIconSetMap->GetStartPosition();
  125. while (posIconSet)
  126. {
  127. pIconSetMap->GetNextAssoc(posIconSet, nWidth, pIcon);
  128. if (pIcon->IsScaled())
  129. continue;
  130. CString strDevice;
  131. strDevice.Format(_T("%ix%i"), pIcon->GetWidth(), pIcon->GetHeight());
  132. if (m_comboDevice.FindStringExact(0, strDevice) == -1)
  133. {
  134. int nIndex = m_comboDevice.AddString(strDevice);
  135. m_comboDevice.SetItemData(nIndex, MAKELONG(pIcon->GetWidth(), pIcon->GetHeight()));
  136. }
  137. }
  138. }
  139. m_comboMask.AddString(_T("Select Color..."));
  140. m_comboDevice.SetCurSel(0);
  141. OnDeviceChanged();
  142. m_comboDevice.EnableWindow(m_comboDevice.GetCount() > 1);
  143. // TODO: Add extra initialization here
  144. return TRUE;  // return TRUE unless you set the focus to a control
  145.               // EXCEPTION: OCX Property Pages should return FALSE
  146. }
  147. void CDialogBitmapExport::OnUpdateIcons()
  148. {
  149. m_arrImages.RemoveAll();
  150. m_comboId.ResetContent();
  151. int nIndex = m_comboDevice.GetCurSel();
  152. if (nIndex == CB_ERR)
  153. return;
  154. DWORD dwDevice = (DWORD)m_comboDevice.GetItemData(nIndex);
  155. CSize sz(dwDevice);
  156. CMap<UINT, UINT, CXTPImageManagerIconSet*, CXTPImageManagerIconSet*>* pImages = m_pImageManager->GetImages();
  157. UINT nID, nWidth;
  158. CXTPImageManagerIconSet* pIconSet;
  159. CXTPImageManagerIcon* pIcon;
  160. POSITION pos = pImages->GetStartPosition();
  161. while (pos)
  162. {
  163. pImages->GetNextAssoc(pos, nID, pIconSet);
  164. CXTPImageManagerIconSet::CIconSetMap* pIconSetMap = pIconSet->GetIcons();
  165. BOOL bFound = FALSE;
  166. POSITION posIconSet  = pIconSetMap->GetStartPosition();
  167. while (posIconSet)
  168. {
  169. pIconSetMap->GetNextAssoc(posIconSet, nWidth, pIcon);
  170. if (pIcon->IsScaled())
  171. continue;
  172. if (pIcon->GetWidth() != sz.cx || pIcon->GetHeight() != sz.cy)
  173. continue;
  174. CImage image;
  175. image.nID = pIcon->GetID();
  176. image.imageState = (XTPImageState)-1;
  177. image.pIcon = pIcon;
  178. image.pParent = this;
  179. int nIndex = 0;
  180. for (; nIndex < m_arrImages.GetSize(); nIndex ++) if (m_arrImages[nIndex].nID > image.nID)
  181. break;
  182. m_arrImages.InsertAt(nIndex, image);
  183. bFound = TRUE;
  184. }
  185. if (bFound)
  186. {
  187. CString strResource = GetStringID(m_pResourceManager, nID);
  188. int nIndex = m_comboId.AddString(strResource);
  189. m_comboId.SetItemData(nIndex, nID);
  190. }
  191. }
  192. for (int i = 0; i < m_arrImages.GetSize(); i++)
  193. m_arrImages[i].nIndex = i;
  194. m_pSelected = 0;
  195. m_szIcons = sz;
  196. m_wndImages.OnImageCountChanged();
  197. }
  198. void CDialogBitmapExport::OnImageChanged(CImage* pImage)
  199. {
  200. m_pSelected = pImage;
  201. m_comboState.ResetContent();
  202. if (pImage != NULL)
  203. {
  204. m_comboState.AddString(_T("(Default)"));
  205. }
  206. m_comboState.AddString(_T("xtpImageNormal"));
  207. m_comboState.AddString(_T("xtpImageDisabled"));
  208. m_comboState.AddString(_T("xtpImageHot"));
  209. m_comboState.AddString(_T("xtpImageChecked"));
  210. if (pImage != NULL)
  211. {
  212. m_comboState.SetCurSel(m_pSelected->imageState + 1);
  213. }
  214. else
  215. {
  216. m_comboState.SetCurSel(m_imageState);
  217. }
  218. m_comboId.EnableWindow(pImage != NULL);
  219. m_wndImages.Invalidate(FALSE);
  220. if (pImage != NULL)
  221. {
  222. CString strResource = GetStringID(m_pResourceManager, pImage->nID);
  223. int nIndex = m_comboId.FindStringExact(0, strResource);
  224. m_comboId.SetCurSel(nIndex);
  225. }
  226. else
  227. {
  228. m_comboId.SetCurSel(-1);
  229. }
  230. }
  231. void CDialogBitmapExport::OnSelchangeComboMask()
  232. {
  233. OnDblclkComboMask();
  234. }
  235. void CDialogBitmapExport::OnDblclkComboMask()
  236. {
  237. CColorDialog cd(m_clrMask);
  238. if (cd.DoModal() == IDOK)
  239. {
  240. m_clrMask = cd.GetColor();
  241. }
  242. m_comboMask.SetCurSel(-1);
  243. m_comboMask.Invalidate(FALSE);
  244. m_wndImages.Invalidate(FALSE);
  245. }
  246. void CDialogBitmapExport::OnStateChanged()
  247. {
  248. if (m_pSelected == 0)
  249. {
  250. m_imageState = (XTPImageState)m_comboState.GetCurSel();
  251. }
  252. else
  253. {
  254. m_pSelected->imageState = (XTPImageState)(m_comboState.GetCurSel() - 1);
  255. }
  256. m_wndImages.Invalidate(FALSE);
  257. }
  258. void CDialogBitmapExport::OnDeviceChanged()
  259. {
  260. int nIndex = m_comboDevice.GetCurSel();
  261. if (nIndex == CB_ERR)
  262. return;
  263. m_pSelected = 0;
  264. OnUpdateIcons();
  265. OnImageChanged(NULL);
  266. }
  267. void CDialogBitmapExport::OnIdChanged()
  268. {
  269. if (m_pSelected == 0)
  270. return;
  271. int nIndex = m_comboDevice.GetCurSel();
  272. if (nIndex == CB_ERR)
  273. return;
  274. DWORD dwDevice = (DWORD)m_comboDevice.GetItemData(nIndex);
  275. CSize sz(dwDevice);
  276. nIndex = m_comboId.GetCurSel();
  277. if (nIndex == CB_ERR)
  278. return;
  279. UINT nIDSelected = (UINT)m_comboId.GetItemData(nIndex);
  280. CMap<UINT, UINT, CXTPImageManagerIconSet*, CXTPImageManagerIconSet*>* pImages = m_pImageManager->GetImages();
  281. UINT nID, nWidth;
  282. CXTPImageManagerIconSet* pIconSet;
  283. CXTPImageManagerIcon* pIcon;
  284. POSITION pos = pImages->GetStartPosition();
  285. while (pos)
  286. {
  287. pImages->GetNextAssoc(pos, nID, pIconSet);
  288. CXTPImageManagerIconSet::CIconSetMap* pIconSetMap = pIconSet->GetIcons();
  289. if (pIconSet->GetID() != nIDSelected)
  290. continue;
  291. POSITION posIconSet  = pIconSetMap->GetStartPosition();
  292. while (posIconSet)
  293. {
  294. pIconSetMap->GetNextAssoc(posIconSet, nWidth, pIcon);
  295. if (pIcon->IsScaled())
  296. continue;
  297. if (pIcon->GetWidth() != sz.cx || pIcon->GetHeight() != sz.cy)
  298. continue;
  299. m_pSelected->nID = nIDSelected;
  300. m_pSelected->pIcon = pIcon;
  301. m_wndImages.Invalidate(FALSE);
  302. return;
  303. }
  304. }
  305. }
  306. BOOL CDialogBitmapExport::CreateBitmap(BITMAPINFO* pBitmapInfo, BYTE*& pDest, CBitmap& bmp)
  307. {
  308. int nHeight = m_szIcons.cy;
  309. int nWidth = m_szIcons.cx * (int)m_arrImages.GetSize();
  310. if (nWidth == 0)
  311. return FALSE;
  312. memset(pBitmapInfo, 0, sizeof(BITMAPINFOHEADER));
  313. pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  314. pBitmapInfo->bmiHeader.biHeight = nHeight;
  315. pBitmapInfo->bmiHeader.biWidth = nWidth;
  316. UINT nSize = pBitmapInfo->bmiHeader.biHeight * pBitmapInfo->bmiHeader.biWidth * 3;
  317. pBitmapInfo->bmiHeader.biBitCount = 24;
  318. pBitmapInfo->bmiHeader.biSizeImage = nSize;
  319. pBitmapInfo->bmiHeader.biCompression = BI_RGB;
  320. pBitmapInfo->bmiHeader.biPlanes = 1;
  321. CDC dcSrc;
  322. dcSrc.CreateCompatibleDC(NULL);
  323. HBITMAP hBmpResult = CreateDIBSection(dcSrc, pBitmapInfo, DIB_RGB_COLORS, (void**)&pDest, NULL, 0);
  324. ASSERT(hBmpResult);
  325. if (!hBmpResult)
  326. return FALSE;
  327. HBITMAP hbmpOld = (HBITMAP)::SelectObject(dcSrc, hBmpResult);
  328. dcSrc.FillSolidRect(0, 0, nWidth, nHeight, m_clrMask);
  329. for (int i = 0; i < m_arrImages.GetSize(); i++)
  330. {
  331. CPoint pt(0 + i * m_szIcons.cx, 0);
  332. CXTPImageManagerIcon* pIcon = m_arrImages[i].pIcon;
  333. if (pIcon)
  334. {
  335. CXTPImageManagerIconHandle& pHandle = m_arrImages[i].GetHandle();
  336. pIcon->Draw(&dcSrc, pt, pHandle, m_szIcons);
  337. }
  338. }
  339. ::SelectObject(dcSrc, hbmpOld);
  340. bmp.Attach(hBmpResult);
  341. return TRUE;
  342. }
  343. void CDialogBitmapExport::OnOK()
  344. {
  345. CString strFilter = _T("Bitmap Files (*.bmp)|*.bmp|All files (*.*)|*.*||");
  346. CFileDialog fd(FALSE, _T("bmp"), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, strFilter);
  347. if (fd.DoModal() != IDOK)
  348. return;
  349. BITMAPINFO  bmi;
  350. BYTE* pDest = NULL;
  351. CBitmap bmp;
  352. if (!CreateBitmap(&bmi, pDest, bmp))
  353. return;
  354. CFile fileResult(fd.GetPathName(), CFile::modeWrite|CFile::modeCreate);
  355. BITMAPFILEHEADER    hdr;
  356. hdr.bfType      = BFT_BITMAP;
  357. hdr.bfSize      = bmi.bmiHeader.biSizeImage + sizeof (BITMAPFILEHEADER);
  358. hdr.bfReserved1 = 0;
  359. hdr.bfReserved2 = 0;
  360. hdr.bfOffBits   = (DWORD)sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSize;
  361. fileResult.Write(&hdr, sizeof(BITMAPFILEHEADER));
  362. fileResult.Write(&bmi, sizeof(BITMAPINFOHEADER));
  363. fileResult.Write(pDest, bmi.bmiHeader.biSizeImage);
  364. fileResult.Close();
  365. CDialog::OnOK();
  366. }