BASICWIN.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:6k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. // basicwin.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "cspublic.h"
  5. #include "basicwin.h"
  6. static BOOL p_bActiveMode=1 ; //1激活以前的窗口,0否,缺省为1
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char BASED_CODE THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CBasicWin
  13. CBasicWin::CBasicWin(void)
  14. {
  15. m_hActiveWnd =NULL ;
  16. m_bTimer =0 ;
  17. m_nHintStatus =0 ; //标记hint没有显示过
  18. m_sHint[0][0] ='' ;
  19. m_sHint[1][0] ='' ;
  20. m_sHint[2][0] ='' ;
  21. m_bActiveMode =1 ;
  22. }
  23. CBasicWin::~CBasicWin()
  24. {
  25. }
  26. //设置hint内容
  27. void CBasicWin::SetHint( LPCSTR lpcsHint0 ,
  28. LPCSTR lpcsHint1 , LPCSTR lpcsHint2 )
  29. {
  30. if( lpcsHint0 )
  31. {
  32. if( _fstrlen( lpcsHint0 )<MAX_HINT_LEN )
  33. _fstrcpy( m_sHint[0] , lpcsHint0 ) ;
  34. }
  35. if( lpcsHint1 )
  36. {
  37. if( _fstrlen( lpcsHint1 )<MAX_HINT_LEN )
  38. _fstrcpy( m_sHint[1] , lpcsHint1 ) ;
  39. }
  40. if( lpcsHint2 )
  41. {
  42. if( _fstrlen( lpcsHint2 )<MAX_HINT_LEN )
  43. _fstrcpy( m_sHint[2] , lpcsHint2 ) ;
  44. }
  45. }
  46.                                                                           
  47. //设置是否激活以前的窗口                                                                          
  48. void CBasicWin::SetActiveMode( BOOL b )
  49. {
  50. m_bActiveMode =b ;
  51. }
  52. //激活以前的窗口
  53. void CBasicWin::ActiveOldWin( void )
  54. {
  55. if( m_hActiveWnd )
  56. ::SetActiveWindow( m_hActiveWnd ) ;
  57. p_bActiveMode =1 ;
  58. }
  59. BEGIN_MESSAGE_MAP(CBasicWin, CWnd)
  60. //{{AFX_MSG_MAP(CBasicWin)
  61. ON_WM_MOUSEACTIVATE()
  62. ON_WM_NCHITTEST()
  63. ON_WM_MOUSEMOVE()
  64. ON_WM_LBUTTONDOWN()
  65. ON_WM_RBUTTONDOWN()
  66. ON_WM_TIMER()
  67. //}}AFX_MSG_MAP
  68. END_MESSAGE_MAP()
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CBasicWin message handlers
  71. int CBasicWin::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
  72. {
  73. // TODO: Add your message handler code here and/or call default
  74. if( m_bActiveMode && p_bActiveMode ) //激活以前的窗口
  75. {
  76. CWnd* pActiveWnd = FromHandle(m_hActiveWnd) ;
  77. CWnd* pFocusWnd = GetFocus() ;
  78. if( pActiveWnd && !pFocusWnd ) //是32位程序
  79. {
  80. //激活原来窗口的标题栏
  81.      pActiveWnd->PostMessage(WM_NCACTIVATE, TRUE, 0);  
  82. pActiveWnd->SetActiveWindow() ; //恢复以前的活动窗口
  83. }
  84. //保持原来窗口的激活状态
  85. return MA_NOACTIVATE;            
  86. }
  87. p_bActiveMode =0 ; //标记不激活以前的窗口
  88. return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
  89. }
  90. UINT CBasicWin::OnNcHitTest(CPoint point)
  91. {
  92. // TODO: Add your message handler code here and/or call default
  93. //得到当前活动窗口
  94. CWnd *pTempWnd =GetActiveWindow() ;
  95.  
  96. if( pTempWnd ) //当前有活动窗口   
  97. {
  98. if( pTempWnd->m_hWnd!=m_hWnd && //不是自身 
  99. !IsChild( pTempWnd ) &&
  100. !(pTempWnd->IsChild( this )) )
  101. m_hActiveWnd = pTempWnd->GetSafeHwnd() ;//m_hWnd;
  102. }
  103. return CWnd::OnNcHitTest(point);
  104. }
  105. void CBasicWin::OnMouseMove(UINT nFlags, CPoint point)
  106. {
  107. // TODO: Add your message handler code here and/or call default
  108. int nHintLen ;
  109. switch( GetOutputCode() )
  110. {
  111. case 0:
  112. nHintLen =strlen( m_sHint[0] ) ;
  113. break ;
  114. case 1:
  115. nHintLen =strlen( m_sHint[1] ) ;
  116. break ;
  117. default:
  118. nHintLen =strlen( m_sHint[2] ) ;
  119. break ;
  120. }
  121. if( nHintLen ) //有hint内容
  122. {
  123. if( !m_nHintStatus ) //没有显示过hint
  124. {
  125. if( !m_bTimer ) //没有设上判断鼠标是否移出该窗口的时间器
  126. {
  127. m_bTimer =1 ;
  128. //设上判断鼠标是否移出该窗口的时间器
  129. SetTimer( TIMER2_ID , TIME_TO_RECOVER , NULL ) ;
  130. }
  131. KillTimer( TIMER_ID ) ; //破坏原来的时间器
  132. //记录显示位置
  133. m_HintPos =point ;
  134. //设上新的时间器
  135. SetTimer( TIMER_ID , TIME_TO_WAIT_FOR_SHOW , NULL ) ;
  136. }
  137. }
  138. CWnd::OnMouseMove(nFlags, point);
  139. }
  140. void CBasicWin::OnLButtonDown(UINT nFlags, CPoint point)
  141. {
  142. // TODO: Add your message handler code here and/or call default
  143. KillTimer( TIMER_ID ) ; //破坏原来的时间器
  144. if( m_nHintStatus==1 ) //正在显示
  145. HideHint() ; //消失hint
  146. m_nHintStatus =2 ; //只要有过动作,就不再显示hint
  147. CWnd::OnLButtonDown(nFlags, point);
  148. }
  149. void CBasicWin::OnRButtonDown(UINT nFlags, CPoint point)
  150. {
  151. // TODO: Add your message handler code here and/or call default
  152. KillTimer( TIMER_ID ) ; //破坏原来的时间器
  153. if( m_nHintStatus==1 ) //正在显示
  154. HideHint() ; //消失hint
  155. m_nHintStatus =2 ; //只要有过动作,就不再显示hint
  156. CWnd::OnRButtonDown(nFlags, point);
  157. }
  158. void CBasicWin::OnTimer(UINT nIDEvent)
  159. {
  160. // TODO: Add your message handler code here and/or call default
  161. if( nIDEvent==TIMER_ID )
  162. {
  163. switch( m_nHintStatus ) //判断hint的状态
  164. {
  165. case 0: //没有显示过hint
  166. KillTimer( TIMER_ID ) ; //破坏原来的时间器
  167. m_nHintStatus =1 ; //标记正在显示
  168. ClientToScreen( &m_HintPos ) ; //转换成屏幕坐标
  169. /* switch( GetOutputCode() )
  170. {
  171. case 0:
  172. case 1:
  173. */ ShowHint( m_HintPos.x , 
  174. m_HintPos.y+GetSystemMetrics( SM_CYCURSOR )/2+2 ,
  175.   m_sHint[0] , _fstrlen( m_sHint[0] ) ) ; //显示hint
  176. /*   break; 
  177. default:
  178. ShowHint( m_HintPos.x , 
  179. m_HintPos.y+GetSystemMetrics( SM_CYCURSOR )/2+2 ,
  180.   m_sHint[2] , _fstrlen( m_sHint[2] ) ) ; //显示hint
  181.  }
  182. */ //设上消失时间器
  183. SetTimer( TIMER_ID , TIME_TO_WAIT_FOR_HIDE , NULL ) ;
  184. break ;
  185. default: //正在显示hint
  186. KillTimer( TIMER_ID ) ; //破坏原来的时间器
  187. m_nHintStatus =2 ; //标记已经显示过了
  188. HideHint() ;
  189. }
  190. }
  191. else if( nIDEvent==TIMER2_ID )
  192. {
  193. //判断是否移出了窗口
  194. CRect clientRect ; //窗口大小
  195. CPoint point ;
  196. //判断是否移出了窗口
  197. GetCursorPos( (LPPOINT)&point ) ; //当前鼠标所在点
  198. ScreenToClient( &point ) ;
  199. GetClientRect( &clientRect ) ; //得到该窗口大小
  200. if( !clientRect.PtInRect( point ) ) //已经移出该窗口
  201. {
  202. KillTimer( TIMER_ID ) ; //破坏原来的时间器
  203. KillTimer( TIMER2_ID ) ; //破坏原来的时间器
  204. m_bTimer =0 ;
  205. m_nHintStatus =0 ; //标记hint没有显示过
  206. HideHint() ; //消失hint
  207. }
  208. }
  209. CWnd::OnTimer(nIDEvent);
  210. }