LineTrackBar.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:10k
源码类别:

图形图象

开发平台:

Visual C++

  1. /********************************************************************
  2. LineTrackBar.cpp - ISee图像浏览器—图像处理模块类LineTrackBar
  3. 实现代码文件
  4.     版权所有(C) VCHelp-coPathway-ISee workgroup 2000 all member's
  5.     这一程序是自由软件,你可以遵照自由软件基金会出版的GNU 通用许可证
  6. 条款来修改和重新发布这一程序。或者用许可证的第二版,或者(根据你
  7. 的选择)用任何更新的版本。
  8.     发布这一程序的目的是希望它有用,但没有任何担保。甚至没有适合特定
  9. 目地的隐含的担保。更详细的情况请参阅GNU通用许可证。
  10.     你应该已经和程序一起收到一份GNU通用许可证(GPL)的副本。如果还没有,
  11. 写信给:
  12.     The Free Software Foundation, Inc.,  675  Mass Ave,  Cambridge,
  13.     MA02139,  USA
  14. 如果你在使用本软件时有什么问题或建议,用以下地址可以与我们取得联
  15. 系:
  16. http://isee.126.com
  17. http://www.vchelp.net
  18. 或:
  19. iseesoft@china.com
  20. 作者:马翔
  21.    e-mail:hugesoft@yeah.net
  22.    功能实现:PhotoShop风格的滑动条
  23. 文件版本:
  24. Build 000123
  25. Date  2000-12-3
  26. ********************************************************************/
  27. // LineTrackBar.cpp : implementation file
  28. //
  29. #include "stdafx.h"
  30. #include "LineTrackBar.h"
  31. #ifdef _DEBUG
  32. #define new DEBUG_NEW
  33. #undef THIS_FILE
  34. static char THIS_FILE[] = __FILE__;
  35. #endif
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CLineTrackBar
  38. CLineTrackBar::CLineTrackBar()
  39. {
  40. CLineTrackBar::RegisterWndClass(AfxGetInstanceHandle());
  41. pItem = NULL;
  42. }
  43. CLineTrackBar::~CLineTrackBar()
  44. {
  45. int nCount = m_items.GetSize();
  46. for (int i = 0; i < nCount; i++)
  47. delete m_items.GetAt(i);
  48. m_items.RemoveAll();
  49. }
  50. BEGIN_MESSAGE_MAP(CLineTrackBar, CWnd)
  51. //{{AFX_MSG_MAP(CLineTrackBar)
  52. ON_WM_PAINT()
  53. ON_WM_SIZE()
  54. ON_WM_LBUTTONDOWN()
  55. ON_WM_MOUSEMOVE()
  56. ON_WM_LBUTTONUP()
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CLineTrackBar message handlers
  61. // 初始化控件函数
  62. // nGroupCtrl:协作控件ID,默认为-1
  63. // ncolor:控件颜色,默认为RGB(0,0,0)[黑色]
  64. // nLower:控件最小值(大于等于0),默认为0
  65. // nZero:控件原点(大于等于nLower),默认为100
  66. // nUpper:控件最大值(大于等于nZero),默认为200
  67. // nStep:控件步长,默认为1
  68. // bFocus:设置协作控件焦点,默认为FALSE(不设置),为TRUE时
  69. // 点中LineTrackBar时协作控件将得到焦点
  70. // nStype:控件返值类型,目前未使用
  71. //
  72. // 此控件在设置nLower,nZero,nUpper,nStep参数后会自动适应大小
  73. BOOL CLineTrackBar::InitControl(int nGroupCtrl,COLORREF ncolor,
  74. int nLower, int nZero,int nUpper,
  75. int nStep,BOOL bFocus,int nStype)
  76. {
  77. CLineTrackObj* pItem = new CLineTrackObj;
  78. pItem->m_color = ncolor;
  79. pItem->m_nLower = nLower;
  80. pItem->m_nUpper = nUpper;
  81. pItem->m_nZero =nZero;
  82. pItem->m_nPos = nZero;
  83. pItem->m_nStep =nStep;
  84. pItem->m_nStype=nStype;
  85. pItem->m_bFocus =bFocus;
  86. if(pItem->m_nStep<=0)
  87. pItem->m_nStep=1;
  88. VERIFY(pItem->m_nLower>=0);
  89. VERIFY(pItem->m_nZero>=pItem->m_nLower);
  90. VERIFY(pItem->m_nUpper>=pItem->m_nZero);
  91. VERIFY(pItem->m_nStep<pItem->m_nUpper);
  92. try 
  93. {
  94. m_items.Add(pItem);
  95. this->SetWindowPos(this,pItem->m_nLower,0,(pItem->m_nUpper-pItem->m_nLower)*pItem->m_nStep+11,15,SWP_NOMOVE|SWP_NOZORDER|
  96. SWP_SHOWWINDOW|SWP_NOACTIVATE);
  97. InvalidateCtrl();
  98. SetGroupControl (nGroupCtrl);
  99. switch(pItem->m_nStype )
  100. {
  101. case RE_STRING:
  102. SetGroupControlText();
  103. break;
  104. }
  105. return TRUE;
  106. }
  107. catch (CMemoryException* e)
  108. {
  109. if (pItem !=NULL) 
  110. delete pItem;
  111. e->Delete();
  112. return FALSE;
  113. }
  114. }
  115. void CLineTrackBar::OnPaint() 
  116. {
  117. CPaintDC dc(this); // device context for painting
  118. // TODO: Add your message handler code here
  119. CRect rcClient;
  120. GetClientRect(rcClient);
  121. // draw scale
  122. if (m_MemDC.GetSafeHdc() != NULL)
  123. dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);
  124. // Do not call CWnd::OnPaint() for painting messages
  125. }
  126. void CLineTrackBar::InvalidateCtrl()
  127. {
  128. CClientDC dc(this);
  129. CRect rcClient;
  130. int nRang;
  131. pItem = m_items.GetAt(0);
  132. nRang=pItem->m_nUpper*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
  133. GetClientRect(rcClient);
  134. if (m_MemDC.GetSafeHdc() == NULL)
  135. {
  136. m_MemDC.CreateCompatibleDC(&dc);
  137. m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
  138. m_MemDC.SelectObject(m_Bitmap);
  139. // draw scale
  140. m_MemDC.SetBkColor(RGB(255,255,255));
  141. // m_MemDC.SetBkMode (TRANSPARENT);
  142. CBrush bkBrush;
  143. bkBrush.CreateSysColorBrush(COLOR_ACTIVEBORDER);
  144. m_MemDC.FillRect(rcClient,&bkBrush);
  145. CPen pen(PS_SOLID, 1, pItem->m_color);
  146. CPen* pOldPen = m_MemDC.SelectObject(&pen);
  147. m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top+5));
  148. m_MemDC.LineTo(CPoint(rcClient.left+5+nRang+1, rcClient.top+5));
  149. m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top));
  150. m_MemDC.LineTo(CPoint(rcClient.left+5, rcClient.top+5));
  151. m_MemDC.MoveTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top));
  152. m_MemDC.LineTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top+5));
  153. m_MemDC.MoveTo(CPoint(rcClient.left+5+nRang, rcClient.top ));
  154. m_MemDC.LineTo(CPoint(rcClient.left+5+nRang, rcClient.top+5));
  155. CPoint ptPolyAr[4];
  156. ptPolyAr[0].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
  157. ptPolyAr[0].y=rcClient.top+6 ;
  158. ptPolyAr[1].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-5-pItem->m_nLower*pItem->m_nStep;
  159. ptPolyAr[1].y=rcClient.top+11;
  160. ptPolyAr[2].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep+5-pItem->m_nLower*pItem->m_nStep;
  161. ptPolyAr[2].y=rcClient.top+11;
  162. ptPolyAr[3].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
  163. ptPolyAr[3].y=rcClient.top+6 ;
  164. m_MemDC.Polyline (ptPolyAr,4);
  165. m_MemDC.SelectObject(pOldPen);
  166. }
  167. InvalidateRect(rcClient, FALSE);
  168. }
  169. void CLineTrackBar::DrawSpike()
  170. {
  171. CRect rcClient;
  172. GetClientRect(rcClient);
  173. UINT nRang;
  174. nRang=pItem->m_nUpper*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
  175. if (m_MemDC.GetSafeHdc() != NULL)
  176. {
  177. m_MemDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 4, 0, SRCCOPY);
  178. m_MemDC.SetBkColor(RGB(255,255,255));
  179. // m_MemDC.SetBkMode (TRANSPARENT);
  180. CBrush bkBrush;
  181. bkBrush.CreateSysColorBrush(COLOR_ACTIVEBORDER);
  182. m_MemDC.FillRect(rcClient,&bkBrush);
  183. CPen pen(PS_SOLID, 1, pItem->m_color);
  184. CPen* pOldPen = m_MemDC.SelectObject(&pen);
  185. m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top+5));
  186. m_MemDC.LineTo(CPoint(rcClient.left+5+nRang+1, rcClient.top+5));
  187. m_MemDC.MoveTo(CPoint(rcClient.left+5, rcClient.top));
  188. m_MemDC.LineTo(CPoint(rcClient.left+5, rcClient.top+5));
  189. m_MemDC.MoveTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top));
  190. m_MemDC.LineTo(CPoint(rcClient.left+5+pItem->m_nZero*pItem->m_nStep, rcClient.top+5));
  191. m_MemDC.MoveTo(CPoint(rcClient.left+5+nRang, rcClient.top ));
  192. m_MemDC.LineTo(CPoint(rcClient.left+5+nRang, rcClient.top+5));
  193. CPoint ptPolyAr[4];
  194. ptPolyAr[0].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
  195. ptPolyAr[0].y=rcClient.top+6 ;
  196. ptPolyAr[1].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-5-pItem->m_nLower*pItem->m_nStep;
  197. ptPolyAr[1].y=rcClient.top+11;
  198. ptPolyAr[2].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep+5-pItem->m_nLower*pItem->m_nStep;
  199. ptPolyAr[2].y=rcClient.top+11;
  200. ptPolyAr[3].x=rcClient.left+5+pItem->m_nPos*pItem->m_nStep-pItem->m_nLower*pItem->m_nStep;
  201. ptPolyAr[3].y=rcClient.top+6 ;
  202. // if(m_bMouseHit==TRUE)
  203. // {
  204. // m_MemDC.Polygon (ptPolyAr,3);
  205. // }
  206. m_MemDC.Polyline (ptPolyAr,4);
  207. m_MemDC.SelectObject(pOldPen);
  208. }
  209. }
  210. void CLineTrackBar::SetPos(int nPos)
  211. {
  212. pItem->m_nPos=nPos;
  213. if(pItem->m_nPos <pItem->m_nLower )
  214. pItem->m_nPos =pItem->m_nLower;
  215. else if(pItem->m_nPos >pItem->m_nUpper)
  216. pItem->m_nPos =pItem->m_nUpper;
  217. DrawSpike();
  218. Invalidate(FALSE);
  219. }
  220. int CLineTrackBar::GetPos()
  221. {
  222. return pItem->m_nPos;
  223. }
  224. BOOL CLineTrackBar::RegisterWndClass(HINSTANCE hInstance)
  225. {
  226. WNDCLASS wc;
  227. wc.lpszClassName = "LINE_TRACKBAR_CTRL"; // matches class name in client
  228. wc.hInstance = hInstance;
  229. wc.lpfnWndProc = ::DefWindowProc;
  230. wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
  231. wc.hIcon = 0;
  232. wc.lpszMenuName = NULL;
  233. wc.hbrBackground = (HBRUSH) ::GetStockObject(LTGRAY_BRUSH);
  234. wc.style = CS_GLOBALCLASS; // To be modified
  235. wc.cbClsExtra = 0;
  236. wc.cbWndExtra = 0;
  237. return (::RegisterClass(&wc) != 0);
  238. }
  239. void CLineTrackBar::OnSize(UINT nType, int cx, int cy) 
  240. {
  241. CWnd::OnSize(nType, cx, cy);
  242. // TODO: Add your message handler code here
  243. }
  244. void CLineTrackBar::OnLButtonDown(UINT nFlags, CPoint point) 
  245. {
  246. // TODO: Add your message handler code here and/or call default
  247. CRect rcClient;
  248. GetClientRect(rcClient);
  249. pItem->m_nPos =(point.x-rcClient.left-5)/pItem->m_nStep+pItem->m_nLower;
  250. if(pItem->m_nPos <pItem->m_nLower)
  251. pItem->m_nPos =pItem->m_nLower;
  252. else if(pItem->m_nPos >pItem->m_nUpper )
  253. pItem->m_nPos =pItem->m_nUpper;
  254. DrawSpike();
  255. Invalidate(FALSE);
  256. switch(pItem->m_nStype )
  257. {
  258. case RE_STRING:
  259. SetGroupControlText();
  260. break;
  261. }
  262. if(pItem->pCtrl!=NULL && pItem->m_bFocus ==TRUE)
  263. {
  264. pItem->pCtrl->SetFocus ();
  265. }
  266. CWnd::OnLButtonDown(nFlags, point);
  267. }
  268. void CLineTrackBar::OnMouseMove(UINT nFlags, CPoint point) 
  269. {
  270. // TODO: Add your message handler code here and/or call default
  271. CRect rcClient;
  272. if(nFlags==MK_LBUTTON)
  273. {
  274. GetClientRect(rcClient);
  275. pItem->m_nPos =(point.x-rcClient.left-5)/pItem->m_nStep+pItem->m_nLower;
  276. if(pItem->m_nPos <pItem->m_nLower )
  277. {
  278. pItem->m_nPos =pItem->m_nLower;
  279. }
  280. else if(pItem->m_nPos >pItem->m_nUpper)
  281. {
  282. pItem->m_nPos =pItem->m_nUpper;
  283. }
  284. DrawSpike();
  285. Invalidate(FALSE);
  286. switch(pItem->m_nStype )
  287. {
  288. case RE_STRING:
  289. SetGroupControlText();
  290. break;
  291. }
  292. }
  293. CWnd::OnMouseMove(nFlags, point);
  294. }
  295. void CLineTrackBar::SetGroupControl(int nCtrl)
  296. {
  297. if(nCtrl!=-1)
  298. pItem->pCtrl = GetParent()->GetDlgItem(nCtrl);
  299. else
  300. pItem->pCtrl =NULL;
  301. }
  302. void CLineTrackBar::OnLButtonUp(UINT nFlags, CPoint point) 
  303. {
  304. // TODO: Add your message handler code here and/or call default
  305. CWnd::OnLButtonUp(nFlags, point);
  306. }
  307. void CLineTrackBar::SetGroupControlText()
  308. {
  309. if(pItem->pCtrl !=NULL)
  310. {
  311. char szText[255];
  312. wsprintf(szText,"%d",pItem->m_nPos );
  313. pItem->pCtrl->SetWindowText(szText);
  314. }
  315. }
  316. void CLineTrackBar::SetDisabled(BOOL bEnable)
  317. {
  318. // pItem->m_color = RGB(255,255,255);
  319. // DrawSpike();
  320. // Invalidate(FALSE);
  321. }