UIHandle.cpp
上传用户:hbzxgg2
上传日期:2009-03-28
资源大小:291k
文件大小:5k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "UIHandle.h"
  3. //
  4. // 将缓冲 data 中的数据在客户区 rcClient 中绘出曲线来
  5. //
  6. void DrawCurveByDataBuffer ( CDC *pDC, CRect &rcClient, COLORREF clr, BYTE *data, int size, int nCellSize/*=1*/, int nStepX/*=0*/ )
  7. {
  8. if ( !pDC || !pDC->GetSafeHdc() || !data || size <= nCellSize ) return;
  9. ASSERT ( nCellSize <= sizeof(DWORD) );
  10. // 创建兼容的内存DC
  11. CDC memDC;
  12. if ( !memDC.CreateCompatibleDC(pDC) )
  13. return;
  14. // 创建兼容的给内存DC做图的位图
  15. CBitmap memBmp;
  16. if ( !memBmp.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()+1) )
  17. {
  18. memDC.DeleteDC ();
  19. return;
  20. }
  21. CBitmap *pOldmap = memDC.SelectObject(&memBmp);
  22. if ( !pOldmap )
  23. {
  24. memDC.DeleteDC ();
  25. memBmp.DeleteObject ();
  26. return;
  27. }
  28. // 在内存DC中作图
  29. CPen Pen, *pOldPen;
  30. VERIFY(Pen.CreatePen(PS_SOLID, 1, clr ));
  31. pOldPen = memDC.SelectObject ( &Pen );
  32. DWORD dwMaxValue = GetHexDataByBitNum ( nCellSize*8 );
  33. DWORD dwCountValue = 0;
  34. memcpy ( &dwCountValue, data, nCellSize );
  35. int y = (int) ( (double)dwCountValue * (double)rcClient.Height() / (double)dwMaxValue );
  36. memDC.MoveTo ( 0, y );
  37. float fStepX = 0.0;
  38. if ( nStepX != 0 )
  39. fStepX = (float)nStepX;
  40. else
  41. fStepX = (float)rcClient.Width() / (float)(size/nCellSize-1);
  42. float fLineX = 0;
  43. for ( int i=nCellSize; i<size; i+=nCellSize )
  44. {
  45. fLineX += fStepX;
  46. if ( (int)fLineX > rcClient.Width() )
  47. {
  48. ASSERT ( FALSE );
  49. break;
  50. }
  51. dwCountValue = 0;
  52. memcpy ( &dwCountValue, &data[i], nCellSize );
  53. // TRACE ( L"i = %d, Value = 0x%x, fLineX = %dn", i, dwCountValue, (int)fLineX );
  54. y = (int) ( (double)dwCountValue * (double)rcClient.Height() / (double)dwMaxValue );
  55. memDC.LineTo ( (int)fLineX, y );
  56. }
  57. // 将内存中的DC图写到屏幕上
  58. VERIFY ( pDC->BitBlt ( rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height()+1, &memDC, 0, 0, SRCCOPY ) );
  59. if ( pOldmap ) memDC.SelectObject(pOldmap);
  60. Pen.DeleteObject();
  61. if ( pOldPen ) memDC.SelectObject ( pOldPen );
  62. memDC.DeleteDC ();
  63. memBmp.DeleteObject ();
  64. }
  65. // 删除某个窗体对象实例
  66. void DeleteInstance ( CWnd **ppWnd )
  67. {
  68. if ( !ppWnd || !(*ppWnd) ) return;
  69. if ( ::IsWindow((*ppWnd)->m_hWnd) )
  70. (*ppWnd)->DestroyWindow();
  71. delete (*ppWnd);
  72. (*ppWnd) = NULL;
  73. }
  74. //
  75. // 获取工作区间大小
  76. //
  77. CSize GetWorkAreaSize ()
  78. {
  79. CSize sz;
  80. RECT rect;
  81. SystemParametersInfo ( SPI_GETWORKAREA,0,&rect,0 );
  82. sz.cx = rect.right - rect.left;
  83.     sz.cy = rect.bottom - rect.top;
  84. return sz;
  85. }
  86. //
  87. // 处理微调按钮
  88. //
  89. void HandleSpanClick(
  90. CWnd *pOwnerWnd,
  91. UINT nEditCtrlID,
  92. NMHDR* pNMHDR,
  93. LRESULT* pResult,
  94. int nMaxValue,
  95. int nMinValue,
  96. int nInterval/*=1*/)
  97. {
  98. NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
  99. int nNumber = pOwnerWnd->GetDlgItemInt ( nEditCtrlID, NULL );
  100. if ( nInterval < 1 ) nInterval = 1;
  101. BOOL nMultiple = ( ( nNumber % nInterval ) == 0 ); // 是否为整数倍
  102. if ( pNMUpDown->iDelta == 1 ) // 减少
  103. {
  104. if ( nMultiple )
  105. nNumber -= nInterval;
  106. else
  107. nNumber = ( nNumber / nInterval * nInterval );
  108. }
  109. else // 增加
  110. {
  111. if ( nMultiple )
  112. nNumber += nInterval;
  113. else
  114. nNumber = ( ( nNumber / nInterval + 1 ) * nInterval );
  115. }
  116. if ( nNumber > nMaxValue )
  117. nNumber = nMaxValue;
  118. if ( nNumber < nMinValue )
  119. nNumber = nMinValue;
  120. pOwnerWnd->SetDlgItemInt ( nEditCtrlID, nNumber );
  121. CEdit *pEdit = (CEdit*)pOwnerWnd->GetDlgItem(nEditCtrlID);
  122. ASSERT ( pEdit );
  123. pEdit->SetSel ( 0, -1 );
  124. pEdit->SetFocus();
  125. *pResult = 0;
  126. }
  127. //
  128. // 从文件中读取一个位图文件
  129. //
  130. BOOL LoadBitmapFromFile(CBitmap &bmp, LPCTSTR lpszBmpPath)
  131. {
  132. if ( !lpszBmpPath || strlen_s(lpszBmpPath) < 1 ) return FALSE;
  133. HBITMAP hBitmap = NULL;
  134. #ifdef WINCE
  135. hBitmap = SHLoadDIBitmap ( lpszBmpPath );
  136. #else
  137. hBitmap = (HBITMAP)::LoadImage(NULL, lpszBmpPath, IMAGE_BITMAP,
  138.                     0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
  139. #endif
  140. if( hBitmap == NULL)
  141. {
  142. return FALSE;
  143. }
  144. if ( bmp.GetSafeHandle() )
  145. {
  146. bmp.DeleteObject();
  147. }
  148. bmp.Attach(hBitmap);
  149. return TRUE;
  150. }
  151. void DrawBitmap ( CBitmap &bmp, CDC *pDC, CRect &rc, BOOL bStretch )
  152. {
  153. if ( bmp.GetSafeHandle() && pDC )
  154. {
  155. CDC memDC;
  156. memDC.CreateCompatibleDC ( pDC );
  157. CBitmap *pOB = memDC.SelectObject ( &bmp );
  158. if ( bStretch )
  159. {
  160. BITMAP BitMap;
  161. bmp.GetBitmap ( &BitMap );
  162. pDC->StretchBlt ( rc.left,
  163. rc.top,
  164. rc.Width(),
  165. rc.Height(),
  166. &memDC,
  167. 0,
  168. 0,
  169. BitMap.bmWidth,
  170. BitMap.bmHeight,
  171. SRCCOPY );
  172. }
  173. else
  174. {
  175. pDC->BitBlt ( rc.left, rc.top, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY );
  176. }
  177. memDC.SelectObject ( pOB );
  178. memDC.DeleteDC();
  179. }
  180. }
  181. HCURSOR f_hCursor_Last = NULL;
  182. void SetWaitCursor ()
  183. {
  184. f_hCursor_Last = GetCursor();//save the current cursor
  185. SetCursor(LoadCursor(NULL, IDC_WAIT));// set the wait cursor while searching
  186. }
  187. void ResotreCursor ()
  188. {
  189. if ( !f_hCursor_Last )
  190. f_hCursor_Last = LoadCursor(NULL, IDC_ARROW);
  191. SetCursor(f_hCursor_Last); // restore cursor
  192. f_hCursor_Last = NULL;
  193. }