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

对话框与窗口

开发平台:

Visual C++

  1. // XTPImageEditor.cpp : implementation of the CXTPImageEditorDlg class.
  2. //
  3. // This file is a part of the XTREME COMMANDBARS 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 "Common/Resource.h"
  23. #include "Common/XTPVC80Helpers.h"
  24. #include "Common/XTPResourceManager.h"
  25. #include "Common/XTPImageManager.h"
  26. #include "Common/XTPDrawHelpers.h"
  27. #include "Common/XTPColorManager.h"
  28. #include "XTPImageEditor.h"
  29. #include "XTPCommandBar.h"
  30. #include "XTPMouseManager.h"
  31. #ifdef _DEBUG
  32. #define new DEBUG_NEW
  33. #undef THIS_FILE
  34. static char THIS_FILE[] = __FILE__;
  35. #endif
  36. #define UNDO_COUNT 15
  37. #define CLR_TO_RGBQUAD(clr) (RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)))
  38. void CXTPImageEditorPicture::CAlphaBitmap::CreateEditorBitmap(int nWidth, int nHeight)
  39. {
  40. BITMAPINFOHEADER BMI;
  41. // Fill in the header info.
  42. ZeroMemory (&BMI, sizeof(BMI));
  43. BMI.biSize = sizeof(BITMAPINFOHEADER);
  44. BMI.biWidth = nWidth;
  45. BMI.biHeight = nHeight;
  46. BMI.biPlanes = 1;
  47. BMI.biBitCount = 32;
  48. BMI.biCompression = BI_RGB;   // No compression
  49. UINT* pSrcBits = NULL;
  50. Attach(CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pSrcBits, 0, 0l));
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CXTPImageEditorPicture
  54. CXTPImageEditorPicture::CXTPImageEditorPicture()
  55. {
  56. m_pCurrentBitmap = NULL;
  57. m_pPictureBitmap = NULL;
  58. m_pParentWnd = NULL;
  59. m_bTracked = FALSE;
  60. m_clrDraw = 0;
  61. m_hCursorLine = XTPResourceManager()->LoadCursor(XTP_IDC_COMMANDBARS_LINE);
  62. m_hCursorFillColor = XTPResourceManager()->LoadCursor(XTP_IDC_COMMANDBARS_FILLCOLOR);
  63. m_hCursorPencil = XTPResourceManager()->LoadCursor(XTP_IDC_COMMANDBARS_PENCIL);
  64. m_hCursorPickColor = XTPResourceManager()->LoadCursor(XTP_IDC_COMMANDBARS_PICKCOLOR);
  65. }
  66. CXTPImageEditorPicture::~CXTPImageEditorPicture()
  67. {
  68. if (m_pPictureBitmap)
  69. {
  70. delete m_pPictureBitmap;
  71. }
  72. if (m_pCurrentBitmap)
  73. {
  74. delete m_pCurrentBitmap;
  75. }
  76. while (!m_lstUndo.IsEmpty())
  77. {
  78. CBitmap* pBitmap = m_lstUndo.RemoveTail();
  79. if (pBitmap) delete pBitmap;
  80. }
  81. while (!m_lstRedo.IsEmpty())
  82. {
  83. CBitmap* pBitmap = m_lstRedo.RemoveTail();
  84. if (pBitmap) delete pBitmap;
  85. }
  86. }
  87. void CXTPImageEditorPicture::Init(UINT nID, CXTPImageEditorDlg* pParentWnd)
  88. {
  89. m_pParentWnd = pParentWnd;
  90. SubclassDlgItem(nID, pParentWnd);
  91. m_szPicture = pParentWnd->m_szPicture;
  92. CRect rc;
  93. GetWindowRect(rc);
  94. m_szItem = CSize (rc.Width() / m_szPicture.cx, rc.Height() / m_szPicture.cy);
  95. CSize sz(m_szItem.cx * m_szPicture.cx, m_szItem.cy * m_szPicture.cy);
  96. SetWindowPos(&CWnd::wndTop, rc.left, rc.top, sz.cx + 1, sz.cy + 1, SWP_NOMOVE);
  97. m_dcPicture.CreateCompatibleDC(NULL);
  98. }
  99. XTPImageEditorTools CXTPImageEditorPicture::GetSelectedTool()
  100. {
  101. ASSERT(m_pParentWnd);
  102. if (!m_pParentWnd)
  103. return xtpToolPencil;
  104. return m_pParentWnd->m_toolSelected;
  105. }
  106. COLORREF CXTPImageEditorPicture::GetSelectedColor()
  107. {
  108. ASSERT(m_pParentWnd);
  109. if (m_pParentWnd && m_pParentWnd->m_pSelected)
  110. {
  111. return m_pParentWnd->m_pSelected->GetColor();
  112. }
  113. return 0;
  114. }
  115. BEGIN_MESSAGE_MAP(CXTPImageEditorPicture, CStatic)
  116. //{{AFX_MSG_MAP(CXTPImageEditorPicture)
  117. ON_WM_PAINT()
  118. ON_WM_LBUTTONDOWN()
  119. ON_WM_MOUSEMOVE()
  120. ON_WM_CAPTURECHANGED()
  121. ON_WM_LBUTTONUP()
  122. ON_WM_SETCURSOR()
  123. //}}AFX_MSG_MAP
  124. END_MESSAGE_MAP()
  125. /////////////////////////////////////////////////////////////////////////////
  126. // CXTPImageEditorPicture message handlers
  127. BOOL CXTPImageEditorPicture::OnSetCursor(CWnd* /*pWnd*/, UINT /*nHitTest*/, UINT /*message*/)
  128. {
  129. ::SetCursor(
  130. GetSelectedTool() == xtpToolFill ? m_hCursorFillColor :
  131. GetSelectedTool() == xtpToolPencil ? m_hCursorPencil :
  132. GetSelectedTool() == xtpToolGetColor ? m_hCursorPickColor : m_hCursorLine
  133. );
  134. return TRUE;
  135. }
  136. void CXTPImageEditorPicture::OnPaint()
  137. {
  138. CPaintDC dcPaint(this); // device context for painting
  139. CXTPClientRect rc(this);
  140. CXTPBufferDC dc(dcPaint, rc);
  141. dc.FillSolidRect(rc, RGB(255, 255, 255));
  142. BOOL bAlpha = m_pPictureBitmap != 0 && m_pPictureBitmap->m_bAlpha;
  143. PINT pBits = 0;
  144. PBITMAPINFO pbmi = 0;
  145. UINT nSize;
  146. if (m_pPictureBitmap)
  147. {
  148. if (!CXTPImageManagerIcon::GetBitmapBits(dc, (HBITMAP)m_pPictureBitmap->GetSafeHandle(), pbmi, (LPVOID&)pBits, nSize))
  149. return;
  150. }
  151. if (pbmi == NULL || pBits == NULL)
  152. {
  153. return;
  154. }
  155. for (int x = 0; x < rc.Width(); x++)
  156. for (int y = 0; y < rc.Height(); y++)
  157. {
  158. CPoint pt = CPoint(m_szPicture.cx * x / rc.Width(), m_szPicture.cy * y / rc.Height());
  159. COLORREF clr;
  160. if (bAlpha)
  161. {
  162. clr = pBits[(pt.y * pbmi->bmiHeader.biWidth + pt.x)];
  163. int nAlpha = (clr & 0xFF000000) >> 24;
  164. int nColor = (((x +3) / 4)+ ((y +3)/ 4)) % 2 == 0 ? 255 : 235;
  165. clr = RGB(nColor - (nColor -  GetBValue(clr)) * nAlpha / 255,
  166. nColor -  (nColor - GetGValue(clr)) * nAlpha / 255,
  167. nColor -  (nColor - GetRValue(clr)) * nAlpha / 255);
  168. }
  169. else
  170. {
  171. clr = m_pPictureBitmap == NULL ? XTPCOLOR_ERASE : pBits[(pt.y * pbmi->bmiHeader.biWidth + pt.x)];
  172. clr = CLR_TO_RGBQUAD(clr);
  173. if (clr == XTPCOLOR_ERASE)
  174. clr = (((x +3) / 4)+ ((y +3)/ 4)) % 2 == 0 ? RGB(255, 255, 255) : RGB(235, 235, 235);
  175. }
  176. dc.SetPixel(x, rc.Height() - y - 1, clr);
  177. }
  178. free(pBits);
  179. free(pbmi);
  180. dc.Draw3dRect(rc, 0, 0);
  181. }
  182. COLORREF CXTPImageEditorPicture::GetPicturePixel(CPoint point)
  183. {
  184. CAlphaBitmap bmp;
  185. bmp.CreateEditorBitmap(m_szPicture.cx, m_szPicture.cy);
  186. CBitmap* pOldBitmap = m_dcPicture.SelectObject(&bmp);
  187. m_dcPicture.FillSolidRect(0, 0, m_szPicture.cx, m_szPicture.cy, XTPCOLOR_ERASE);
  188. if (m_pPictureBitmap)
  189. m_dcPicture.DrawState(0, m_szPicture, m_pPictureBitmap, DSS_NORMAL, (CBrush*)NULL);
  190. COLORREF clr = m_dcPicture.GetPixel(point);
  191. m_dcPicture.SelectObject(pOldBitmap);
  192. return clr;
  193. }
  194. CPoint CXTPImageEditorPicture::ClientToPicture(CPoint pt)
  195. {
  196. ASSERT(m_szItem.cx > 0 && m_szItem.cy > 0);
  197. return CPoint(pt.x / m_szItem.cx, pt.y / m_szItem.cy);
  198. }
  199. void CXTPImageEditorPicture::CopyBitmap(CAlphaBitmap* pBitmapCopyTo, CAlphaBitmap* pBitmapCopyFrom, CSize sz, CPoint ptOffset, COLORREF clrTransparentFrom, COLORREF clrTransparentTo, CDC* pDC)
  200. {
  201. CDC dc;
  202. dc.CreateCompatibleDC(pDC);
  203. pBitmapCopyTo->CreateEditorBitmap(sz.cx, sz.cy);
  204. CBitmap* pOldBitmap = dc.SelectObject(pBitmapCopyTo);
  205. dc.FillSolidRect(0, 0, sz.cx, sz.cy, XTPCOLOR_ERASE);
  206. if (pBitmapCopyFrom)
  207. {
  208. dc.DrawState(ptOffset, sz, pBitmapCopyFrom, DSS_NORMAL, (CBrush*)NULL);
  209. if (clrTransparentFrom != clrTransparentTo && !pBitmapCopyFrom->m_bAlpha)
  210. {
  211. for (int x = 0; x < sz.cx; x++)
  212. {
  213. for (int y = 0; y < sz.cy; y++)
  214. {
  215. if (dc.GetPixel(x, y) == clrTransparentFrom)
  216. dc.SetPixel(x, y, clrTransparentTo);
  217. }
  218. }
  219. }
  220. }
  221. dc.SelectObject(pOldBitmap);
  222. pBitmapCopyTo->m_bAlpha = pBitmapCopyFrom ? pBitmapCopyFrom->m_bAlpha : FALSE;
  223. }
  224. void CXTPImageEditorPicture::OnPictureChanged()
  225. {
  226. Invalidate(FALSE);
  227. m_pParentWnd->OnPictureChanged();
  228. }
  229. void CXTPImageEditorPicture::Apply()
  230. {
  231. while (!m_lstRedo.IsEmpty())
  232. {
  233. CBitmap* pBitmap = m_lstRedo.RemoveTail();
  234. if (pBitmap) delete pBitmap;
  235. }
  236. if (m_lstUndo.GetCount() > UNDO_COUNT)
  237. {
  238. CBitmap* pBitmap = m_lstUndo.RemoveHead();
  239. if (pBitmap) delete pBitmap;
  240. }
  241. m_lstUndo.AddTail(m_pCurrentBitmap);
  242. m_pCurrentBitmap = NULL;
  243. OnPictureChanged();
  244. }
  245. void CXTPImageEditorPicture::OnLButtonDown(UINT nFlags, CPoint point)
  246. {
  247. ASSERT(m_pCurrentBitmap == NULL);
  248. switch (GetSelectedTool())
  249. {
  250. case xtpToolFill:
  251. {
  252. m_pCurrentBitmap = m_pPictureBitmap;
  253. m_pPictureBitmap = new CAlphaBitmap();
  254. CopyBitmap(m_pPictureBitmap, m_pCurrentBitmap, m_szPicture);
  255. CBitmap* pOldBitmap = m_dcPicture.SelectObject(m_pPictureBitmap);
  256. CXTPBrushDC brush(m_dcPicture, GetSelectedColor());
  257. CPoint ptFill(ClientToPicture(point));
  258. m_dcPicture.ExtFloodFill(ptFill.x, ptFill.y, GetPicturePixel(ptFill), FLOODFILLSURFACE);
  259. m_dcPicture.SelectObject(pOldBitmap);
  260. if (m_pCurrentBitmap && m_pCurrentBitmap->m_bAlpha)
  261. FixAlphaLayer(m_pPictureBitmap, m_pCurrentBitmap);
  262. Apply();
  263. }
  264. break;
  265. case xtpToolGetColor:
  266. {
  267. COLORREF clr = GetPicturePixel(ClientToPicture(point));
  268. m_pParentWnd->m_wndPicker.SetColor(clr);
  269. m_pParentWnd->SetSelected(&m_pParentWnd->m_wndPicker);
  270. m_pParentWnd->m_toolSelected = m_pParentWnd->m_toolPrevious;
  271. }
  272. break;
  273. case xtpToolPencil:
  274. case xtpToolRectangle:
  275. case xtpToolCircle:
  276. case xtpToolLine:
  277. {
  278. m_pCurrentBitmap = m_pPictureBitmap;
  279. m_pPictureBitmap = new CAlphaBitmap();
  280. CopyBitmap(m_pPictureBitmap, m_pCurrentBitmap, m_szPicture);
  281. m_clrDraw = GetSelectedColor() != GetPicturePixel(ClientToPicture(point)) ? GetSelectedColor() : XTPCOLOR_ERASE;
  282. m_bTracked = TRUE;
  283. m_ptTracked = point;
  284. SetCapture();
  285. OnMouseMove(nFlags, point);
  286. }
  287. break;
  288. default :
  289. ASSERT(FALSE);
  290. }
  291. CStatic::OnLButtonDown(nFlags, point);
  292. }
  293. void CXTPImageEditorDlg::FixAlphaLayer(LPBYTE pBits, UINT nCount)
  294. {
  295. if (pBits == 0)
  296. return;
  297. LPBYTE pBitsI = pBits;
  298. for (UINT i = 0; i < nCount; i++)
  299. {
  300. if (*(LPDWORD)pBitsI == 0) *(LPDWORD)pBitsI = XTPCOLOR_ERASE;
  301. int nAlpha = pBitsI[3];
  302. if (nAlpha != 0)
  303. {
  304. pBitsI[0] = BYTE(pBitsI[0] * 255 / nAlpha);
  305. pBitsI[1] = BYTE(pBitsI[1] * 255 / nAlpha);
  306. pBitsI[2] = BYTE(pBitsI[2] * 255 / nAlpha);
  307. }
  308. pBitsI += 4;
  309. }
  310. }
  311. void CXTPImageEditorPicture::FixAlphaLayer(CAlphaBitmap* pDest, CAlphaBitmap* pSrc)
  312. {
  313. if (pSrc == 0 || pDest == 0)
  314. return;
  315. CDC dcSrc;
  316. dcSrc.CreateCompatibleDC(NULL);
  317. PINT pDestBits = 0, pSrcBits = 0;
  318. PBITMAPINFO pDestBmi = 0, pSrcBmi = 0;
  319. UINT nSize;
  320. if (!CXTPImageManagerIcon::GetBitmapBits(dcSrc, (HBITMAP)pDest->GetSafeHandle(), pDestBmi, (LPVOID&)pDestBits, nSize))
  321. return;
  322. if (!CXTPImageManagerIcon::GetBitmapBits(dcSrc, (HBITMAP)pSrc->GetSafeHandle(), pSrcBmi, (LPVOID&)pSrcBits, nSize))
  323. {
  324. free(pDestBits);
  325. free(pDestBmi);
  326. return;
  327. }
  328. PINT pFixedBits = NULL;
  329. HBITMAP hBitmapAlpha = CreateDIBSection(dcSrc, pDestBmi, DIB_RGB_COLORS, (void**)&pFixedBits, NULL, 0);
  330. if (hBitmapAlpha && pFixedBits)
  331. {
  332. MEMCPY_S(pFixedBits, pDestBits, nSize);
  333. for (UINT i = 0; i < nSize / 4; i++)
  334. {
  335. if (pDestBits[i] != pSrcBits[i])
  336. {
  337. if (pDestBits[i] != XTPCOLOR_ERASE)
  338. pFixedBits[i] |= 0xFF000000;
  339. }
  340. }
  341. pDest->DeleteObject();
  342. pDest->Attach(hBitmapAlpha);
  343. }
  344. free(pDestBits);
  345. free(pDestBmi);
  346. free(pSrcBits);
  347. free(pSrcBmi);
  348. }
  349. void CXTPImageEditorPicture::OnMouseMove(UINT nFlags, CPoint point)
  350. {
  351. if (m_bTracked)
  352. {
  353. if (GetSelectedTool() == xtpToolPencil)
  354. {
  355. CAlphaBitmap* pBitmap = new CAlphaBitmap();
  356. CopyBitmap(pBitmap, m_pPictureBitmap, m_szPicture);
  357. CBitmap* pOldBitmap = m_dcPicture.SelectObject(pBitmap);
  358. m_dcPicture.SetPixel(ClientToPicture(point), m_clrDraw);
  359. m_dcPicture.SelectObject(pOldBitmap);
  360. if (m_pPictureBitmap->m_bAlpha)
  361. FixAlphaLayer(pBitmap, m_pPictureBitmap);
  362. if (m_pPictureBitmap) delete m_pPictureBitmap;
  363. m_pPictureBitmap = pBitmap;
  364. Invalidate(FALSE);
  365. OnPictureChanged();
  366. }
  367. else
  368. {
  369. CAlphaBitmap* pBitmap = new CAlphaBitmap();
  370. CopyBitmap(pBitmap, m_pCurrentBitmap, m_szPicture);
  371. CBitmap* pOldBitmap = m_dcPicture.SelectObject(pBitmap);
  372. CRect rcReftangle(ClientToPicture(m_ptTracked), ClientToPicture(point));
  373. rcReftangle.NormalizeRect();
  374. if (GetSelectedTool() == xtpToolRectangle)
  375. {
  376. m_dcPicture.Draw3dRect(rcReftangle, GetSelectedColor(), GetSelectedColor());
  377. }
  378. if (GetSelectedTool() == xtpToolCircle)
  379. {
  380. CXTPPenDC pen(m_dcPicture, GetSelectedColor());
  381. CXTPBrushDC brush(m_dcPicture, XTPCOLOR_ERASE);
  382. m_dcPicture.Ellipse(rcReftangle);
  383. }
  384. if (GetSelectedTool() == xtpToolLine)
  385. {
  386. CXTPPenDC pen(m_dcPicture, GetSelectedColor());
  387. m_dcPicture.MoveTo(ClientToPicture(m_ptTracked));
  388. m_dcPicture.LineTo(ClientToPicture(point));
  389. }
  390. m_dcPicture.SelectObject(pOldBitmap);
  391. if (m_pPictureBitmap->m_bAlpha)
  392. FixAlphaLayer(pBitmap, m_pCurrentBitmap);
  393. if (m_pPictureBitmap) delete m_pPictureBitmap;
  394. m_pPictureBitmap = pBitmap;
  395. Invalidate(FALSE);
  396. OnPictureChanged();
  397. }
  398. }
  399. CStatic::OnMouseMove(nFlags, point);
  400. }
  401. void CXTPImageEditorPicture::OnLButtonUp(UINT nFlags, CPoint point)
  402. {
  403. m_bTracked = FALSE;
  404. ReleaseCapture();
  405. CStatic::OnLButtonUp(nFlags, point);
  406. }
  407. void CXTPImageEditorPicture::OnCaptureChanged(CWnd* pWnd)
  408. {
  409. m_bTracked = FALSE;
  410. Apply();
  411. CStatic::OnCaptureChanged(pWnd);
  412. }
  413. void CXTPImageEditorPicture::Undo()
  414. {
  415. if (!m_lstUndo.IsEmpty())
  416. {
  417. CAlphaBitmap* pBitmap = m_lstUndo.RemoveTail();
  418. m_lstRedo.AddTail(m_pPictureBitmap);
  419. m_pPictureBitmap = pBitmap;
  420. OnPictureChanged();
  421. }
  422. }
  423. void CXTPImageEditorPicture::Redo()
  424. {
  425. if (!m_lstRedo.IsEmpty())
  426. {
  427. CAlphaBitmap* pBitmap = m_lstRedo.RemoveTail();
  428. m_lstUndo.AddTail(m_pPictureBitmap);
  429. m_pPictureBitmap = pBitmap;
  430. OnPictureChanged();
  431. }
  432. }
  433. void CXTPImageEditorPicture::Clear()
  434. {
  435. m_pCurrentBitmap = m_pPictureBitmap;
  436. m_pPictureBitmap = NULL;
  437. Apply();
  438. }
  439. void CXTPImageEditorPicture::MovePicture(CPoint ptOffset)
  440. {
  441. m_pCurrentBitmap = m_pPictureBitmap;
  442. m_pPictureBitmap = new CAlphaBitmap();
  443. CopyBitmap(m_pPictureBitmap, m_pCurrentBitmap, m_szPicture, ptOffset);
  444. Apply();
  445. }
  446. void CXTPImageEditorPicture::Copy()
  447. {
  448. if (!OpenClipboard ())
  449. {
  450. return;
  451. }
  452. if (!::EmptyClipboard ())
  453. {
  454. ::CloseClipboard ();
  455. return;
  456. }
  457. CAlphaBitmap bitmapCopy;
  458. CopyBitmap(&bitmapCopy, m_pPictureBitmap, m_szPicture, 0, XTPCOLOR_ERASE, GetXtremeColor(COLOR_3DFACE));
  459. HANDLE hclipData = ::SetClipboardData (CF_BITMAP, bitmapCopy.Detach ());
  460. if (hclipData == NULL)
  461. {
  462. TRACE (_T ("CXTPImageEditorPicture::Copy() error. Error code = %xn"), GetLastError ());
  463. }
  464. if (bitmapCopy.m_bAlpha)
  465. {
  466. SetClipboardData(XTPImageManager()->m_nAlphaClipFormat, GlobalAlloc(GMEM_MOVEABLE, 1));
  467. }
  468. ::CloseClipboard ();
  469. }
  470. void CXTPImageEditorPicture::Paste()
  471. {
  472. COleDataObject data;
  473. if (!data.AttachClipboard ())
  474. {
  475. return;
  476. }
  477. if (!data.IsDataAvailable (CF_BITMAP))
  478. {
  479. return;
  480. }
  481. tagSTGMEDIUM dataMedium;
  482. if (!data.GetData (CF_BITMAP, &dataMedium))
  483. {
  484. return;
  485. }
  486. if (!dataMedium.hBitmap)
  487. return;
  488. CAlphaBitmap bmpClip;
  489. BOOL bAlpha = FALSE;
  490. FORMATETC fetc;
  491. static TCHAR sz[256] ;
  492. data.BeginEnumFormats();
  493. while (data.GetNextFormat(&fetc))
  494. {
  495. if (GetClipboardFormatName((UINT)fetc.cfFormat, sz, 254))
  496. {
  497. CString str(sz);
  498. if (str.Find(_T("DIB32")) > 0)
  499. {
  500. bAlpha = TRUE;
  501. break;
  502. }
  503. }
  504. }
  505. bmpClip.m_bAlpha = bAlpha ? bAlpha : data.IsDataAvailable(XTPImageManager()->m_nAlphaClipFormat);
  506. bmpClip.Attach(dataMedium.hBitmap);
  507. m_pCurrentBitmap = m_pPictureBitmap;
  508. m_pPictureBitmap = new CAlphaBitmap();
  509. CopyBitmap(m_pPictureBitmap, &bmpClip, m_szPicture, 0, GetXtremeColor(COLOR_3DFACE), XTPCOLOR_ERASE);
  510. bmpClip.Detach();
  511. Apply();
  512. }
  513. void CXTPImageEditorPicture::Load()
  514. {
  515. CString strFilter;
  516. VERIFY(XTPResourceManager()->LoadString(&strFilter, XTP_IDS_IMAGEEDITOR_FILTER));
  517. CFileDialog fd(TRUE, NULL, NULL, OFN_HIDEREADONLY, strFilter);
  518. if (fd.DoModal() == IDOK)
  519. {
  520. CString strExtension = fd.GetFileExt();
  521. strExtension.MakeLower();
  522. if (strExtension == _T("ico"))
  523. {
  524. HBITMAP hBitmap = CXTPImageManagerIcon::LoadAlphaIcon(fd.GetPathName(), m_szPicture.cx);
  525. if (!hBitmap)
  526. {
  527. HICON hIcon = (HICON)LoadImage(0, fd.GetPathName(),
  528. IMAGE_ICON, m_szPicture.cx, m_szPicture.cy, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
  529. if (!hIcon)
  530. return;
  531. m_pCurrentBitmap = m_pPictureBitmap;
  532. m_pPictureBitmap = new CAlphaBitmap();
  533. CDC dc;
  534. dc.CreateCompatibleDC(NULL);
  535. m_pPictureBitmap->CreateEditorBitmap(m_szPicture.cx, m_szPicture.cy);
  536. CBitmap* pOldBitmap = dc.SelectObject(m_pPictureBitmap);
  537. dc.FillSolidRect(0, 0, m_szPicture.cx, m_szPicture.cy, XTPCOLOR_ERASE);
  538. dc.DrawState(0, CSize(0, 0), hIcon, DSS_NORMAL, (CBrush*)NULL);
  539. dc.SelectObject(pOldBitmap);
  540. DestroyIcon(hIcon);
  541. }
  542. else
  543. {
  544. m_pCurrentBitmap = m_pPictureBitmap;
  545. m_pPictureBitmap = new CAlphaBitmap();
  546. CAlphaBitmap bmpFile(TRUE);
  547. bmpFile.Attach(hBitmap);
  548. CopyBitmap(m_pPictureBitmap, &bmpFile, m_szPicture);
  549. }
  550. Apply();
  551. }
  552. else if (strExtension == _T("bmp") || strExtension == _T("png"))
  553. {
  554. BOOL bAlphaBitmap = FALSE;
  555. HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromFile(fd.GetPathName(), &bAlphaBitmap);
  556. if (!hBmp)
  557. return;
  558. CAlphaBitmap bmpFile(bAlphaBitmap);
  559. bmpFile.Attach(hBmp);
  560. m_pCurrentBitmap = m_pPictureBitmap;
  561. m_pPictureBitmap = new CAlphaBitmap();
  562. CopyBitmap(m_pPictureBitmap, &bmpFile, m_szPicture);
  563. Apply();
  564. }
  565. else
  566. {
  567. LPPICTURE pPict = NULL;
  568. if (OleLoadPicturePath((LPOLESTR)XTP_CT2CW(fd.GetPathName()), NULL, 0, 0, IID_IPicture, (LPVOID*)&pPict) == S_OK)
  569. {
  570. m_pCurrentBitmap = m_pPictureBitmap;
  571. m_pPictureBitmap = new CAlphaBitmap();
  572. CDC dc;
  573. dc.CreateCompatibleDC(NULL);
  574. m_pPictureBitmap->CreateEditorBitmap(m_szPicture.cx, m_szPicture.cy);
  575. CBitmap* pOldBitmap = dc.SelectObject(m_pPictureBitmap);
  576. dc.FillSolidRect(0, 0, m_szPicture.cx, m_szPicture.cy, XTPCOLOR_ERASE);
  577. long hmWidth;
  578. long hmHeight;
  579. pPict->get_Width(&hmWidth);
  580. pPict->get_Height(&hmHeight);
  581. pPict->Render(dc, 0, 0,
  582. m_szPicture.cx, m_szPicture.cy, 0, hmHeight-1,
  583. hmWidth, -hmHeight, 0);
  584. dc.SelectObject(pOldBitmap);
  585. Apply();
  586. pPict->Release();
  587. }
  588. }
  589. }
  590. }
  591. /////////////////////////////////////////////////////////////////////////////
  592. // CXTPImageEditorPicker
  593. IMPLEMENT_DYNAMIC(CXTPImageEditorPicker, CStatic)
  594. CXTPImageEditorPicker::CXTPImageEditorPicker()
  595. {
  596. m_clr = 0;
  597. m_bSelected = FALSE;
  598. }
  599. void CXTPImageEditorPicker::SetColor(COLORREF clr)
  600. {
  601. m_clr = clr;
  602. if (m_hWnd) Invalidate(FALSE);
  603. }
  604. COLORREF CXTPImageEditorPicker::GetColor()
  605. {
  606. return m_clr;
  607. }
  608. void CXTPImageEditorPicker::SetSelected(BOOL bSelected)
  609. {
  610. m_bSelected = bSelected;
  611. if (m_hWnd) Invalidate(FALSE);
  612. }
  613. BEGIN_MESSAGE_MAP(CXTPImageEditorPicker, CStatic)
  614. //{{AFX_MSG_MAP(CXTPImageEditorPicker)
  615. ON_WM_PAINT()
  616. ON_WM_LBUTTONDOWN()
  617. //}}AFX_MSG_MAP
  618. END_MESSAGE_MAP()
  619. /////////////////////////////////////////////////////////////////////////////
  620. // CXTPImageEditorPicker message handlers
  621. void CXTPImageEditorPicker::OnPaint()
  622. {
  623. CPaintDC dcPaint(this); // device context for painting
  624. CXTPClientRect rc(this);
  625. CXTPBufferDC dc(dcPaint, rc);
  626. if (m_clr != XTPCOLOR_ERASE)
  627. {
  628. dc.FillSolidRect(rc, m_clr);
  629. }
  630. else
  631. {
  632. CRect rcItem(rc);
  633. dc.FillSolidRect(rc, RGB(0xFF, 0xFF, 0xFF));
  634. dc.FillSolidRect(rcItem.left, rcItem.top, rcItem.Width() / 2, rcItem.Height() / 2, RGB(235, 235, 235));
  635. dc.FillSolidRect(rcItem.left + rcItem.Width() / 2, rcItem.top + rcItem.Height() / 2,
  636. rcItem.Width() - (rcItem.Width() / 2), rcItem.Height() - (rcItem.Height() / 2), RGB(235, 235, 235));
  637. }
  638. if (!m_bSelected)
  639. {
  640. dc.Draw3dRect(rc, GetXtremeColor(COLOR_3DDKSHADOW), GetXtremeColor(COLOR_3DDKSHADOW));
  641. }
  642. else
  643. {
  644. dc.Draw3dRect(rc, 0, 0);
  645. rc.DeflateRect(1, 1);
  646. dc.Draw3dRect(rc, RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF));
  647. rc.DeflateRect(1, 1);
  648. dc.Draw3dRect(rc, 0, 0);
  649. }
  650. }
  651. void CXTPImageEditorPicker::OnLButtonDown(UINT /*nFlags*/, CPoint /*point*/)
  652. {
  653. NMHDR mHDR;
  654. mHDR.hwndFrom = m_hWnd;
  655. mHDR.code = NM_CLICK;
  656. mHDR.idFrom = GetDlgCtrlID();
  657. GetParent()->SendMessage(WM_NOTIFY,
  658. (WPARAM)mHDR.idFrom, (LPARAM)&mHDR);
  659. }
  660. /////////////////////////////////////////////////////////////////////////////
  661. // CXTPImageEditorPreview
  662. CXTPImageEditorPreview::CXTPImageEditorPreview()
  663. {
  664. m_pParentWnd = 0;
  665. }
  666. void CXTPImageEditorPreview::Init(UINT nID, CXTPImageEditorDlg* pParentWnd)
  667. {
  668. m_pParentWnd = pParentWnd;
  669. SubclassDlgItem(nID, pParentWnd);
  670. m_szPicture = pParentWnd->m_szPicture;
  671. ModifyStyleEx(WS_EX_STATICEDGE, 0);
  672. }
  673. BEGIN_MESSAGE_MAP(CXTPImageEditorPreview, CStatic)
  674. //{{AFX_MSG_MAP(CXTPImageEditorPreview)
  675. ON_WM_PAINT()
  676. //}}AFX_MSG_MAP
  677. END_MESSAGE_MAP()
  678. /////////////////////////////////////////////////////////////////////////////
  679. // CXTPImageEditorPreview message handlers
  680. void CXTPImageEditorPreview::OnPaint()
  681. {
  682. CPaintDC dcPaint(this); // device context for painting
  683. CXTPClientRect rc(this);
  684. CXTPBufferDC dc(dcPaint, rc);
  685. dc.FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  686. CRect rcButton (10, (rc.Height() - m_szPicture.cy) / 2, 10 + m_szPicture.cx, (rc.Height() - m_szPicture.cy) / 2 + m_szPicture.cy);
  687. CRect rcFrame(rcButton);
  688. rcFrame.InflateRect(3, 3);
  689. dc.Draw3dRect(rcFrame, RGB(0xFF, 0xFF, 0xFF), GetXtremeColor(COLOR_3DSHADOW));
  690. rcFrame.InflateRect(1, 1);
  691. dc.Draw3dRect(rcFrame, GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DDKSHADOW));
  692. ASSERT(m_pParentWnd);
  693. if (!m_pParentWnd)
  694. return;
  695. CXTPImageEditorPicture::CAlphaBitmap* pBitmap = m_pParentWnd->m_wndPicture.m_pPictureBitmap;
  696. if (pBitmap)
  697. {
  698. if (pBitmap->m_bAlpha)
  699. {
  700. HBITMAP hBitmap = CXTPImageManagerIcon::PreMultiplyAlphaBitmap((HBITMAP)pBitmap->GetSafeHandle());
  701. if (hBitmap)
  702. {
  703. CXTPImageManagerIcon::DrawAlphaBitmap(&dc, hBitmap, rcButton.TopLeft(), m_szPicture);
  704. DeleteObject(hBitmap);
  705. }
  706. }
  707. else
  708. {
  709. CXTPImageEditorPicture::CAlphaBitmap bmpClient;
  710. CXTPImageEditorPicture::CopyBitmap(&bmpClient, pBitmap, m_szPicture, 0, XTPCOLOR_ERASE, GetXtremeColor(COLOR_3DFACE), &dc);
  711. dc.DrawState(rcButton.TopLeft(), m_szPicture, &bmpClient, DSS_NORMAL, (CBrush*)NULL);
  712. }
  713. }
  714. }
  715. /////////////////////////////////////////////////////////////////////////////
  716. // CDlgToolBar dialog
  717. BEGIN_MESSAGE_MAP(CXTPImageEditorDlg::CDlgToolBar, CToolBar)
  718. { WM_IDLEUPDATECMDUI, 0, 0, 0, AfxSig_lwl, (AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&CXTPImageEditorDlg::CDlgToolBar::OnIdleUpdateCmdUI },
  719. END_MESSAGE_MAP()
  720. /////////////////////////////////////////////////////////////////////////////
  721. // CXTPImageEditorDlg dialog
  722. CXTPImageEditorDlg::CXTPImageEditorDlg(CWnd* pParent /*= NULL*/, BOOL bCommandBarsEditor)
  723. : m_bCommandBarsEditor(bCommandBarsEditor)
  724. {
  725. InitModalIndirect(XTPResourceManager()->LoadDialogTemplate(XTP_IDD_IMAGEEDITOR_DIALOG), pParent);
  726. m_toolSelected = xtpToolPencil;
  727. m_pSelected = NULL;
  728. m_szPicture = CSize(16, 16);
  729. m_toolPrevious = XTPImageEditorTools(-1);
  730. }
  731. void CXTPImageEditorDlg::GetIcon(CXTPImageManagerIconHandle* pHandle)
  732. {
  733. ASSERT(pHandle);
  734. if (!pHandle)
  735. return;
  736. if (m_wndPicture.m_pPictureBitmap)
  737. {
  738. if (m_wndPicture.m_pPictureBitmap->m_bAlpha)
  739. {
  740. pHandle->CopyHandle((HBITMAP)m_wndPicture.m_pPictureBitmap->GetSafeHandle());
  741. }
  742. else
  743. {
  744. CImageList imgList;
  745. imgList.Create(m_szPicture.cx, m_szPicture.cy, ILC_COLOR24 | ILC_MASK, 0, 1);
  746. imgList.Add(m_wndPicture.m_pPictureBitmap, XTPCOLOR_ERASE);
  747. if (imgList.GetImageCount() != 1)
  748. return;
  749. *pHandle = imgList.ExtractIcon(0);
  750. }
  751. }
  752. }
  753. void CXTPImageEditorDlg::SetIconSize(CSize szIcon)
  754. {
  755. m_szPicture = szIcon;
  756. }
  757. void CXTPImageEditorDlg::SetIcon(CXTPImageManagerIconHandle& icon)
  758. {
  759. if (icon.IsEmpty())
  760. return;
  761. ASSERT(m_wndPicture.m_pPictureBitmap == NULL);
  762. m_szPicture = icon.GetExtent();
  763. CXTPImageManagerIconHandle iconHandle;
  764. iconHandle.CopyHandle(icon);
  765. if (iconHandle.IsAlpha())
  766. {
  767. iconHandle.PreMultiply();
  768. CXTPImageEditorPicture::CAlphaBitmap* pBitmap = new CXTPImageEditorPicture::CAlphaBitmap(TRUE);
  769. LPBYTE lpBits;
  770. pBitmap->Attach(CXTPImageManagerIcon::CopyAlphaBitmap(iconHandle.GetBitmap(), &lpBits));
  771. FixAlphaLayer(lpBits, m_szPicture.cx * m_szPicture.cy);
  772. m_wndPicture.m_pPictureBitmap = pBitmap;
  773. }
  774. else
  775. {
  776. CXTPImageEditorPicture::CAlphaBitmap* pBitmap = new CXTPImageEditorPicture::CAlphaBitmap();
  777. CDC dc;
  778. dc.CreateCompatibleDC(NULL);
  779. pBitmap->CreateEditorBitmap(m_szPicture.cx, m_szPicture.cy);
  780. CBitmap* pOldBitmap = dc.SelectObject(pBitmap);
  781. dc.FillSolidRect(0, 0, m_szPicture.cx, m_szPicture.cy, XTPCOLOR_ERASE);
  782. dc.DrawState(0, CSize(0, 0), iconHandle.GetIcon(), DSS_NORMAL, (CBrush*)NULL);
  783. dc.SelectObject(pOldBitmap);
  784. m_wndPicture.m_pPictureBitmap = pBitmap;
  785. }
  786. }
  787. void CXTPImageEditorDlg::DoDataExchange(CDataExchange* pDX)
  788. {
  789. CDialog::DoDataExchange(pDX);
  790. //{{AFX_DATA_MAP(CXTPImageEditorDlg)
  791. DDX_Control(pDX, XTP_IDC_STATIC_TOOLS, m_gboxTools);
  792. DDX_Control(pDX, XTP_IDC_STATIC_MOVE, m_gboxMove);
  793. //}}AFX_DATA_MAP
  794. }
  795. BEGIN_MESSAGE_MAP(CXTPImageEditorDlg, CDialog)
  796. //{{AFX_MSG_MAP(CXTPImageEditorDlg)
  797. ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
  798. ON_WM_DESTROY()
  799. ON_NOTIFY(NM_CLICK, XTP_IDC_CLR_PICKER, OnPickerClick)
  800. ON_NOTIFY_RANGE(NM_CLICK, XTP_IDS_CLR_BLACK, XTP_IDS_CLR_FUCHSIA, OnSelectorClick)
  801. ON_NOTIFY(NM_CLICK, XTP_IDC_CLR_ERASE, OnEraseClick)
  802. ON_UPDATE_COMMAND_UI_RANGE(XTP_ID_BUTTON_PENCIL, XTP_ID_BUTTON_CIRCLE, OnUpdateButtonTool)
  803. ON_COMMAND_RANGE(XTP_ID_BUTTON_PENCIL, XTP_ID_BUTTON_CIRCLE, OnButtonTool)
  804. ON_UPDATE_COMMAND_UI(XTP_ID_BUTTON_UNDO, OnUpdateButtonUndo)
  805. ON_COMMAND(XTP_ID_BUTTON_UNDO, OnButtonUndo)
  806. ON_UPDATE_COMMAND_UI(XTP_ID_BUTTON_REDO, OnUpdateButtonRedo)
  807. ON_COMMAND(XTP_ID_BUTTON_REDO, OnButtonRedo)
  808. ON_COMMAND(XTP_ID_BUTTON_CLEAR, OnButtonClear)
  809. ON_COMMAND(XTP_ID_BUTTON_COPY, OnButtonCopy)
  810. ON_COMMAND(XTP_ID_BUTTON_PASTE, OnButtonPaste)
  811. ON_COMMAND(XTP_ID_BUTTON_OPEN, OnButtonOpen)
  812. ON_COMMAND_RANGE(XTP_IDC_BUTTON_LEFT, XTP_IDC_BUTTON_RIGHT, OnMoveButton)
  813. ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
  814. ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
  815. //}}AFX_MSG_MAP
  816. END_MESSAGE_MAP()
  817. /////////////////////////////////////////////////////////////////////////////
  818. // CXTPImageEditorDlg message handlers
  819. BOOL CXTPImageEditorDlg::OnInitDialog()
  820. {
  821. UINT nButtonsTools[] =
  822. {
  823. XTP_ID_BUTTON_PENCIL,
  824. XTP_ID_BUTTON_FILL,
  825. XTP_ID_BUTTON_UNDO,
  826. XTP_ID_BUTTON_REDO,
  827. XTP_ID_BUTTON_GETCOLOR,
  828. XTP_ID_BUTTON_LINE,
  829. XTP_ID_BUTTON_COPY,
  830. XTP_ID_BUTTON_PASTE,
  831. XTP_ID_BUTTON_RECTANGLE,
  832. XTP_ID_BUTTON_CIRCLE,
  833. XTP_ID_BUTTON_CLEAR,
  834. XTP_ID_BUTTON_OPEN
  835. };
  836. UINT nButtonsMove[] =
  837. {
  838. XTP_IDC_BUTTON_LEFT,
  839. XTP_IDC_BUTTON_DOWN,
  840. XTP_IDC_BUTTON_UP,
  841. XTP_IDC_BUTTON_RIGHT
  842. };
  843. const struct
  844. {
  845. COLORREF clr;
  846. UINT nID;
  847. POINT ptOffset;
  848. }
  849. colors[] =
  850. {
  851. RGB(0x00, 0x00, 0x00), XTP_IDS_CLR_BLACK           , {0, 0},
  852. RGB(0x80, 0x00, 0x00), XTP_IDS_CLR_DARK_RED        , {2, 0},
  853. RGB(0x80, 0x80, 0x00), XTP_IDS_CLR_DARK_YELLOW     , {3, 0},
  854. RGB(0x00, 0x00, 0x80), XTP_IDS_CLR_DARK_BLUE       , {6, 0},
  855. RGB(0x00, 0x80, 0x00), XTP_IDS_CLR_GREEN           , {4, 0},
  856. RGB(0x00, 0x80, 0x80), XTP_IDS_CLR_TEAL            , {5, 0},
  857. RGB(0x00, 0x00, 0xFF), XTP_IDS_CLR_BLUE            , {6, 1},
  858. RGB(0x80, 0x80, 0x80), XTP_IDS_CLR_GRAY50          , {1, 0},
  859. RGB(0xFF, 0x00, 0x00), XTP_IDS_CLR_RED             , {2, 1},
  860. RGB(0x80, 0x00, 0x80), XTP_IDS_CLR_VIOLET          , {7, 0},
  861. RGB(0xFF, 0x00, 0xFF), XTP_IDS_CLR_PINK            , {7, 1},
  862. RGB(0xFF, 0xFF, 0x00), XTP_IDS_CLR_YELLOW          , {3, 1},
  863. RGB(0x00, 0xFF, 0x00), XTP_IDS_CLR_BRIGHT_GREEN    , {4, 1},
  864. RGB(0x00, 0xFF, 0xFF), XTP_IDS_CLR_TURQUOISE       , {5, 1},
  865. RGB(0xC0, 0xC0, 0xC0), XTP_IDS_CLR_GRAY25          , {1, 1},
  866. RGB(0xFF, 0xFF, 0xFF), XTP_IDS_CLR_WHITE           , {0, 1}
  867. };
  868. CDialog::OnInitDialog();
  869. CRect rcTools;
  870. m_gboxTools.GetWindowRect(&rcTools);
  871. ScreenToClient(rcTools);
  872. m_wndToolbarTools.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_FIXED | CBRS_TOOLTIPS | CBRS_ALIGN_TOP);
  873. m_wndToolbarTools.ModifyStyle(0, TBSTYLE_FLAT);
  874. m_wndToolbarTools.SetButtons(nButtonsTools, 12);
  875. int i;
  876. int nCount = m_wndToolbarTools.GetToolBarCtrl().GetButtonCount();
  877. for (i = 0; i < nCount; i++)
  878. {
  879. UINT nStyle = m_wndToolbarTools.GetButtonStyle(i);
  880. if (((i + 1) % 4) == 0) nStyle |= TBBS_WRAPPED;
  881. m_wndToolbarTools.SetButtonStyle(i, nStyle);
  882. }
  883. CSize sz = m_wndToolbarTools.CalcDynamicLayout(0, LM_HORZ);
  884. m_wndToolbarTools.SetWindowPos(&CWnd::wndTop, rcTools.left - 7, rcTools.top - 4, sz.cx, sz.cy, 0);
  885. CRect rcMove;
  886. m_gboxMove.GetWindowRect(&rcMove);
  887. ScreenToClient(rcMove);
  888. m_wndToolbarMove.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_FIXED | CBRS_TOOLTIPS | CBRS_ALIGN_TOP);
  889. m_wndToolbarMove.ModifyStyle(0, TBSTYLE_FLAT);
  890. m_wndToolbarMove.SetButtons(nButtonsMove, 4);
  891. if (CXTPImageManager::IsAlphaIconsImageListSupported())
  892. {
  893. m_ilToolbarTools.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 1);
  894. HBITMAP hBitmap = CXTPImageManagerIcon::LoadAlphaBitmap(XTP_IDB_TOOLBAR_TOOLS32);
  895. m_ilToolbarTools.Add(CBitmap::FromHandle(hBitmap), (CBitmap*)0);
  896. m_ilToolbarMove.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 1);
  897. m_ilToolbarMove.Add(CBitmap::FromHandle(hBitmap), (CBitmap*)0);
  898. for (i = 0; i < 12; i++) m_ilToolbarMove.Remove(0);
  899. DeleteObject(hBitmap);
  900. }
  901. else
  902. {
  903. m_ilToolbarTools.Create(XTP_IDB_TOOLBAR_TOOLS, 16, 1, RGB(192, 192, 192));
  904. m_ilToolbarMove.Create(XTP_IDB_TOOLBAR_TOOLS, 16, 1, RGB(192, 192, 192));
  905. for (i = 0; i < 12; i++) m_ilToolbarMove.Remove(0);
  906. }
  907. m_wndToolbarTools.GetToolBarCtrl().SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_ilToolbarTools.GetSafeHandle());
  908. m_wndToolbarMove.GetToolBarCtrl().SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_ilToolbarMove.GetSafeHandle());
  909. sz = m_wndToolbarMove.CalcDynamicLayout(0, LM_HORZ);
  910. m_wndToolbarMove.SetWindowPos(&CWnd::wndTop, rcMove.left - 7, rcMove.top - 4, sz.cx, sz.cy, 0);
  911. CRect rcColors;
  912. GetDlgItem(XTP_IDC_STATIC_COLORS)->GetWindowRect(&rcColors);
  913. ScreenToClient(rcColors);
  914. for (i = 0; i < _countof(colors); i++)
  915. {
  916. CRect rcItem(CPoint(rcColors.left, rcColors.top - 4), CSize(11, 11));
  917. rcItem.OffsetRect(colors[i].ptOffset.x * 13 , colors[i].ptOffset.y * 13);
  918. m_wndSelector[i].Create(NULL, WS_CHILD | WS_VISIBLE | SS_NOTIFY, rcItem, this, colors[i].nID);
  919. m_wndSelector[i].SetColor(colors[i].clr);
  920. }
  921. SetSelected(&m_wndSelector[0]);
  922. m_wndSelectorErase.SubclassDlgItem(XTP_IDC_CLR_ERASE, this);
  923. m_wndSelectorErase.SetColor(XTPCOLOR_ERASE);
  924. m_wndPicker.SubclassDlgItem(XTP_IDC_CLR_PICKER, this);
  925. m_wndPicture.Init(XTP_IDC_STATIC_PICTURE, this);
  926. m_wndPreview.Init(XTP_IDC_STATIC_PREVIEW, this);
  927. if (m_bCommandBarsEditor)
  928. {
  929. XTPMouseManager()->AddTrustedWindow(m_hWnd);
  930. }
  931. return TRUE;  // return TRUE  unless you set the focus to a control
  932. }
  933. void CXTPImageEditorDlg::OnDestroy()
  934. {
  935. if (m_bCommandBarsEditor)
  936. {
  937. XTPMouseManager()->RemoveTrustedWindow(m_hWnd);
  938. }
  939. CDialog::OnDestroy();
  940. }
  941. LRESULT CXTPImageEditorDlg::OnKickIdle(WPARAM, LPARAM)
  942. {
  943. SendMessageToDescendants(WM_IDLEUPDATECMDUI);
  944. return 0;
  945. }
  946. void CXTPImageEditorDlg::SetSelected(CXTPImageEditorPicker* pPicker)
  947. {
  948. if (m_pSelected != NULL)
  949. m_pSelected->SetSelected(FALSE);
  950. if (pPicker)
  951. pPicker->SetSelected(TRUE);
  952. m_pSelected = pPicker;
  953. }
  954. void CXTPImageEditorDlg::OnPickerClick(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/)
  955. {
  956. CColorDialog cd(m_wndPicker.GetColor(), 0, this);
  957. if (cd.DoModal())
  958. {
  959. m_wndPicker.SetColor(cd.GetColor());
  960. SetSelected(&m_wndPicker);
  961. }
  962. }
  963. void CXTPImageEditorDlg::OnEraseClick(NMHDR* pNMHDR, LRESULT* /*pResult*/)
  964. {
  965. CXTPImageEditorPicker* pWnd = DYNAMIC_DOWNCAST(CXTPImageEditorPicker, CWnd::FromHandlePermanent(pNMHDR->hwndFrom));
  966. ASSERT(pWnd);
  967. SetSelected(pWnd);
  968. }
  969. void CXTPImageEditorDlg::OnSelectorClick(UINT /*id*/, NMHDR* pNMHDR, LRESULT* /*pResult*/)
  970. {
  971. CXTPImageEditorPicker* pWnd = DYNAMIC_DOWNCAST(CXTPImageEditorPicker, CWnd::FromHandlePermanent(pNMHDR->hwndFrom));
  972. ASSERT(pWnd);
  973. SetSelected(pWnd);
  974. }
  975. void CXTPImageEditorDlg::OnUpdateButtonTool(CCmdUI* pCmdUI)
  976. {
  977. pCmdUI->SetCheck(m_toolSelected == (int)pCmdUI->m_nID - XTP_ID_BUTTON_PENCIL);
  978. }
  979. void CXTPImageEditorDlg::OnButtonTool(UINT nID)
  980. {
  981. m_toolPrevious = m_toolSelected == xtpToolGetColor ? m_toolPrevious : m_toolSelected;
  982. m_toolSelected = (XTPImageEditorTools)(nID - XTP_ID_BUTTON_PENCIL);
  983. }
  984. void CXTPImageEditorDlg::OnPictureChanged()
  985. {
  986. m_wndPreview.Invalidate(FALSE);
  987. }
  988. void CXTPImageEditorDlg::OnUpdateButtonUndo(CCmdUI* pCmdUI)
  989. {
  990. pCmdUI->Enable(!m_wndPicture.m_lstUndo.IsEmpty());
  991. }
  992. void CXTPImageEditorDlg::OnButtonUndo()
  993. {
  994. m_wndPicture.Undo();
  995. }
  996. void CXTPImageEditorDlg::OnUpdateButtonRedo(CCmdUI* pCmdUI)
  997. {
  998. pCmdUI->Enable(!m_wndPicture.m_lstRedo.IsEmpty());
  999. }
  1000. void CXTPImageEditorDlg::OnButtonRedo()
  1001. {
  1002. m_wndPicture.Redo();
  1003. }
  1004. void CXTPImageEditorDlg::OnButtonClear()
  1005. {
  1006. m_wndPicture.Clear();
  1007. }
  1008. void CXTPImageEditorDlg::OnButtonCopy()
  1009. {
  1010. m_wndPicture.Copy();
  1011. }
  1012. void CXTPImageEditorDlg::OnButtonPaste()
  1013. {
  1014. m_wndPicture.Paste();
  1015. }
  1016. void CXTPImageEditorDlg::OnButtonOpen()
  1017. {
  1018. m_wndPicture.Load();
  1019. }
  1020. void CXTPImageEditorDlg::OnMoveButton(UINT nID)
  1021. {
  1022. m_wndPicture.MovePicture(
  1023. nID == XTP_IDC_BUTTON_LEFT ? CPoint(-1, 0) :
  1024. nID == XTP_IDC_BUTTON_RIGHT ? CPoint(+1, 0) :
  1025. nID == XTP_IDC_BUTTON_UP ? CPoint(0, -1) : CPoint(0, +1));
  1026. }
  1027. BOOL CXTPImageEditorDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
  1028. {
  1029. ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
  1030. // need to handle both ANSI and UNICODE versions of the message
  1031. TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
  1032. TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
  1033. TCHAR szFullText[256];
  1034. CString strTipText;
  1035. UINT nID = (UINT)pNMHDR->idFrom;
  1036. if (nID != 0) // will be zero on a separator
  1037. {
  1038. // don't handle the message if no string resource found
  1039. if (AfxLoadString(nID, szFullText) == 0)
  1040. return FALSE;
  1041. // this is the command id, not the button index
  1042. AfxExtractSubString(strTipText, szFullText, 1, 'n');
  1043. }
  1044. #ifndef _UNICODE
  1045. if (pNMHDR->code == TTN_NEEDTEXTA)
  1046. lstrcpyn(pTTTA->szText, strTipText, _countof(pTTTA->szText));
  1047. else
  1048. _mbstowcsz(pTTTW->szText, strTipText, _countof(pTTTW->szText));
  1049. #else
  1050. if (pNMHDR->code == TTN_NEEDTEXTA)
  1051. _wcstombsz(pTTTA->szText, strTipText, _countof(pTTTA->szText));
  1052. else
  1053. lstrcpyn(pTTTW->szText, strTipText, _countof(pTTTW->szText));
  1054. #endif
  1055. *pResult = 0;
  1056. // bring the tooltip window above other popup windows
  1057. ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
  1058. SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER);
  1059. return TRUE;    // message was handled
  1060. }