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

对话框与窗口

开发平台:

Visual C++

  1. // DialogBitmapImages.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 "DialogBitmapImages.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. CDialogBitmapImagesHost::CDialogBitmapImagesHost(UINT nIDTemplate, CResourceManager* pResourceManager)
  28. : CDialog(nIDTemplate, 0)
  29. {
  30. m_pResourceManager = pResourceManager;
  31. m_imageState = xtpImageNormal;
  32. m_clrMask = RGB(0, 0xFF, 0);
  33. m_szIcons = 0;
  34. m_pSelected = 0;
  35. }
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CDialogBitmapImages
  38. CDialogBitmapImages::CDialogBitmapImages()
  39. {
  40. m_bScrollVisible[0] = m_bScrollVisible[1] = FALSE;
  41. m_bAllowEdit = TRUE;
  42. }
  43. CDialogBitmapImages::~CDialogBitmapImages()
  44. {
  45. }
  46. BEGIN_MESSAGE_MAP(CDialogBitmapImages, CWnd)
  47. //{{AFX_MSG_MAP(CDialogBitmapImages)
  48. ON_WM_PAINT()
  49. ON_WM_ERASEBKGND()
  50. ON_WM_LBUTTONDOWN()
  51. ON_WM_KEYDOWN()
  52. ON_WM_GETDLGCODE()
  53. ON_WM_HSCROLL()
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CDialogBitmapImages message handlers
  58. void CDialogBitmapImages::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  59. {
  60. // its horizontal scroll bar
  61. int nCurPos = GetScrollPos(SB_HORZ);
  62. // decide what to do for each diffrent scroll event
  63. switch(nSBCode)
  64. {
  65. case SB_LEFT: nCurPos = 0; break;
  66. case SB_RIGHT: nCurPos = GetScrollLimit(SB_HORZ); break;
  67. case SB_LINELEFT: nCurPos = max(nCurPos - 6, 0); break;
  68. case SB_LINERIGHT: nCurPos = min(nCurPos + 6, GetScrollLimit(SB_HORZ)); break;
  69. case SB_PAGELEFT: nCurPos = max(nCurPos - CXTPClientRect(this).Width(), 0); break;
  70. case SB_PAGERIGHT: nCurPos = min(nCurPos + CXTPClientRect(this).Width(), GetScrollLimit(SB_HORZ)); break;
  71. case SB_THUMBTRACK:
  72. case SB_THUMBPOSITION:  nCurPos = nPos; break;
  73. }
  74. SetScrollPos(SB_HORZ, nCurPos);
  75. Invalidate(FALSE);
  76. CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
  77. }
  78. int CDialogBitmapImages::GetScrollOffset(int nBar)
  79. {
  80. if (!m_bScrollVisible[nBar])
  81. return 0;
  82. return GetScrollPos(nBar);
  83. }
  84. CPoint CDialogBitmapImages::GetTopLeftPoint()
  85. {
  86. CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
  87. CXTPClientRect rc(this);
  88. int nCount = (int)pParent->m_arrImages.GetSize();
  89. CSize szIcons = pParent->m_szIcons;
  90. int nHeight = rc.Height();
  91. int nTopOffset = nHeight > szIcons.cy? (nHeight - szIcons.cy) / 2 : 0;
  92. int nLeftOffset = nTopOffset + szIcons.cx * nCount < rc.Width()? (rc.Width() - szIcons.cx * nCount) / 2: 0;
  93. nLeftOffset -= GetScrollOffset(SB_HORZ);
  94. return CPoint(nLeftOffset, nTopOffset);
  95. }
  96. void CDialogBitmapImages::OnPaint()
  97. {
  98. CPaintDC dcPaint(this); // device context for painting
  99. CXTPClientRect rc(this);
  100. CXTPBufferDC dc(dcPaint, rc);
  101. dc.FillSolidRect(rc, GetSysColor(COLOR_3DSHADOW));
  102. if (!m_bAllowEdit)
  103. {
  104. for (int x = 0; x < rc.Width(); x++)
  105. for (int y = 0; y < rc.Height(); y++)
  106. {
  107. COLORREF clr = (((x +3) / 4 )+ ((y +3)/ 4)) % 2 == 0? RGB(255, 255, 255): RGB(235, 235, 235);
  108. dc.SetPixel(x, rc.Height() - y - 1, clr);
  109. }
  110. }
  111. CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
  112. int nCount = (int)pParent->m_arrImages.GetSize();
  113. CSize szIcons = pParent->m_szIcons;
  114. CPoint ptTopLeft = GetTopLeftPoint();
  115. if (m_bAllowEdit)
  116. dc.FillSolidRect(ptTopLeft.x, ptTopLeft.y, szIcons.cx * nCount, szIcons.cy, pParent->m_clrMask);
  117. else
  118. {
  119. CRect rcFocus(ptTopLeft, CSize(szIcons.cx * nCount, szIcons.cy));
  120. rcFocus.InflateRect(1, 1);
  121. dc.DrawFocusRect(rcFocus);
  122. }
  123. for (int i = 0; i < nCount; i++)
  124. {
  125. CPoint pt(ptTopLeft.x + i * szIcons.cx, ptTopLeft.y);
  126. CXTPImageManagerIcon* pIcon = pParent->m_arrImages[i].pIcon;
  127. if (pIcon)
  128. {
  129. CXTPImageManagerIconHandle& pHandle = pParent->m_arrImages[i].GetHandle();
  130. pIcon->Draw(&dc, pt, pHandle, szIcons);
  131. }
  132. }
  133. if (pParent->m_pSelected)
  134. {
  135. CPoint pt(ptTopLeft.x + pParent->m_pSelected->nIndex * szIcons.cx, ptTopLeft.y);
  136. CRect rc(pt, szIcons);
  137. rc.InflateRect(1, 1);
  138. dc.Draw3dRect(rc, 0, 0);
  139. rc.InflateRect(1, 1);
  140. dc.Draw3dRect(rc, 0, 0);
  141. }
  142. }
  143. BOOL CDialogBitmapImages::OnEraseBkgnd(CDC*)
  144. {
  145. return TRUE;
  146. }
  147. CImage* CDialogBitmapImages::HitTest(CPoint point)
  148. {
  149. CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
  150. int nCount = (int)pParent->m_arrImages.GetSize();
  151. CSize szIcons = pParent->m_szIcons;
  152. CPoint ptTopLeft = GetTopLeftPoint();
  153. for (int i = 0; i < nCount; i++)
  154. {
  155. CPoint pt(ptTopLeft.x + i * szIcons.cx, ptTopLeft.y);
  156. CRect rc(pt, szIcons);
  157. if (rc.PtInRect(point))
  158. return &pParent->m_arrImages[i];
  159. }
  160. return NULL;
  161. }
  162. void CDialogBitmapImages::OnLButtonDown(UINT nFlags, CPoint point)
  163. {
  164. CImage* pImage = HitTest(point);
  165. CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
  166. if (pParent->m_pSelected != pImage)
  167. {
  168. pParent->OnImageChanged(pImage);
  169. }
  170. SetFocus();
  171. CWnd::OnLButtonDown(nFlags, point);
  172. }
  173. void CDialogBitmapImages::OnImageCountChanged()
  174. {
  175. CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
  176. CXTPClientRect rc(this);
  177. int nCount = (int)pParent->m_arrImages.GetSize();
  178. CSize szIcons = pParent->m_szIcons;
  179. int nWidth = szIcons.cx * nCount;
  180. m_bScrollVisible[SB_HORZ] = rc.Width() < nWidth;
  181. ShowScrollBar(SB_HORZ, m_bScrollVisible[SB_HORZ]);
  182. if (m_bScrollVisible[SB_HORZ])
  183. {
  184. SCROLLINFO  si ;
  185. si.cbSize = sizeof(SCROLLINFO);
  186. si.fMask = SIF_PAGE | SIF_RANGE ;
  187. si.nPage = rc.Width();
  188. si.nMax = nWidth - 1;
  189. si.nMin = 0 ;
  190. SetScrollInfo(SB_HORZ, &si) ;
  191. EnableScrollBarCtrl(SB_HORZ, TRUE);
  192. }
  193. Invalidate(FALSE);
  194. }
  195. void CDialogBitmapImages::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  196. {
  197. CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
  198. CArray<CImage, CImage&>& arrImages = pParent->m_arrImages;
  199. int nSelected = pParent->m_pSelected? pParent->m_pSelected->nIndex: -1;
  200. int nIndex = nSelected;
  201. if (nChar == VK_LEFT)
  202. {
  203. if (nIndex > 0)
  204. {
  205. nIndex--;
  206. }
  207. if (nIndex >= 0 && nIndex < arrImages.GetSize())
  208. {
  209. if (GetKeyState(VK_CONTROL) >= 0 || !m_bAllowEdit)
  210. {
  211. pParent->OnImageChanged(&arrImages[nIndex]);
  212. }
  213. else
  214. {
  215. CImage image = arrImages[nSelected];
  216. arrImages.RemoveAt(nSelected);
  217. arrImages.InsertAt(nIndex, image);
  218. arrImages[nIndex].nIndex = nIndex;
  219. arrImages[nSelected].nIndex = nSelected;
  220. pParent->m_pSelected = &arrImages[nIndex];
  221. Invalidate(FALSE);
  222. }
  223. }
  224. }
  225. if (nChar == VK_RIGHT)
  226. {
  227. nIndex++;
  228. if (nIndex >= 0 && nIndex < arrImages.GetSize())
  229. {
  230. if (GetKeyState(VK_CONTROL) >= 0 || nIndex == 0 || !m_bAllowEdit)
  231. {
  232. pParent->OnImageChanged(&arrImages[nIndex]);
  233. }
  234. else
  235. {
  236. CImage image = arrImages[nSelected];
  237. arrImages.RemoveAt(nSelected);
  238. arrImages.InsertAt(nIndex, image);
  239. arrImages[nSelected].nIndex = nSelected;
  240. arrImages[nIndex].nIndex = nIndex;
  241. pParent->m_pSelected = &arrImages[nIndex];
  242. Invalidate(FALSE);
  243. }
  244. }
  245. }
  246. if (nChar == VK_DELETE && m_bAllowEdit)
  247. {
  248. if (nIndex >= 0 && nIndex < arrImages.GetSize())
  249. {
  250. arrImages.RemoveAt(nIndex);
  251. for (int i = nIndex; i < arrImages.GetSize(); i++)
  252. arrImages[i].nIndex = i;
  253. if (nIndex < arrImages.GetSize())
  254. {
  255. pParent->OnImageChanged(&arrImages[nIndex]);
  256. }
  257. else
  258. {
  259. pParent->OnImageChanged(0);
  260. }
  261. OnImageCountChanged();
  262. }
  263. }
  264. if (nChar == VK_INSERT && m_bAllowEdit)
  265. {
  266. CImage image;
  267. image.imageState = (XTPImageState)-1;
  268. image.nID = 0;
  269. image.pIcon = 0;
  270. image.pParent = pParent;
  271. nIndex = nIndex == -1? (int)arrImages.GetSize(): nIndex;
  272. arrImages.InsertAt(nIndex, image);
  273. for (int i = 0; i < arrImages.GetSize(); i++)
  274. arrImages[i].nIndex = i;
  275. pParent->OnImageChanged(&arrImages[nIndex]);
  276. OnImageCountChanged();
  277. }
  278. CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
  279. }
  280. UINT CDialogBitmapImages::OnGetDlgCode()
  281. {
  282. return DLGC_WANTALLKEYS;
  283. }