OverwriteStatus.cpp
上传用户:hngjqc
上传日期:2007-01-02
资源大小:25k
文件大小:6k
源码类别:

RichEdit

开发平台:

Visual C++

  1. // OverwriteStatus.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Overwrite.h"
  5. #include "ChildFrm.h"
  6. #include "OverwriteStatus.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // COverwriteStatus
  14. COverwriteStatus::COverwriteStatus()
  15. {
  16. VERIFY(m_ctlImage.Create(IDB_INFO,16,0,RGB(255,0,255)));
  17. m_nImageFlag = 0;
  18. }
  19. COverwriteStatus::~COverwriteStatus()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(COverwriteStatus, CStatusBar)
  23. //{{AFX_MSG_MAP(COverwriteStatus)
  24. ON_WM_LBUTTONDBLCLK()
  25. ON_WM_DRAWITEM()
  26. //}}AFX_MSG_MAP
  27. END_MESSAGE_MAP()
  28. /////////////////////////////////////////////////////////////////////////////
  29. // COverwriteStatus message handlers
  30. //////////////////////////////////////////////////////////////////
  31. //
  32. // Method:      PreCreateWindow
  33. //
  34. // Function:    Activate tool tips, no grip in the corner
  35. //
  36. // Parameter:   CREATESTRUCT& 
  37. //
  38. // Return:  BOOL
  39. //
  40. BOOL COverwriteStatus::PreCreateWindow(CREATESTRUCT& cs)
  41. {
  42. cs.style &= ~SBARS_SIZEGRIP;
  43. EnableToolTips(TRUE);
  44. return CStatusBar::PreCreateWindow(cs);
  45. }
  46. //////////////////////////////////////////////////////////////////
  47. //
  48. // Method:      GetPaneAtPosition
  49. //
  50. // Function:    Send the message to the frame, who decide, what to do
  51. //
  52. // Parameter:   CPoint Point, where the double click occures
  53. //
  54. // Return:  void
  55. //
  56. int COverwriteStatus::GetPaneAtPosition(CPoint& point)
  57. {
  58. CRect rect;
  59. for (int i = 0, n = GetCount(); i < n; i++)
  60. {
  61. GetItemRect(i, rect);
  62. if (rect.PtInRect(point)) return i;
  63. }
  64. return -1;
  65. }
  66. //////////////////////////////////////////////////////////////////
  67. //
  68. // Method:      OnLButtonDblClk
  69. //
  70. // Function:    Send the message to the frame, who decide, what to do
  71. //
  72. // Parameter:   UINT nFlgs
  73. //  CPoint Point, where the doubpe click occures
  74. //
  75. // Return:  void
  76. //
  77. void COverwriteStatus::OnLButtonDblClk(UINT nFlags, CPoint point) 
  78. {
  79. int nPane = GetPaneAtPosition(point);
  80. switch (nPane)
  81. {
  82. case 2:
  83. ChangeInsert();
  84. break;
  85. case 3:
  86. ChangeCapsLock();
  87. break;
  88. case 4:
  89. ChangeNumLock();
  90. break;
  91. case 5: 
  92. {
  93. SetStatusBarFlag(1);
  94. ((COverWriteApp * )AfxGetApp())->OnAppAbout();
  95. SetStatusBarFlag(0);
  96. }
  97. break;
  98. }
  99. CStatusBar::OnLButtonDblClk(nFlags, point);
  100. }
  101. //////////////////////////////////////////////////////////////////
  102. //
  103. // Method:      SetStatusBarFlag()
  104. //
  105. // Function:    Set a new bitmap in the status bar
  106. //
  107. // Parameter:   int Index of the imagelist for the events
  108. //
  109. // Return:  void 
  110. //
  111. void COverwriteStatus::SetStatusBarFlag(int nFlag)
  112. {
  113. CStatusBarCtrl& sbc = GetStatusBarCtrl();
  114. sbc.SetIcon(5, m_ctlImage.ExtractIcon(nFlag));
  115. }
  116. //////////////////////////////////////////////////////////////////
  117. //
  118. // Method:      ChangeNumLock()
  119. //
  120. // Function:    Change the state of the numLock key
  121. //
  122. // Parameter:   
  123. //
  124. // Return:  void 
  125. //
  126. void COverwriteStatus::ChangeNumLock()
  127. // Simulate a key press
  128. keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY ,  0 );
  129. // Simulate a key release
  130. keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,  0);
  131. }
  132. //////////////////////////////////////////////////////////////////
  133. //
  134. // Method:      ChangeCapsLock()
  135. //
  136. // Function:    Change the state of the CapsLock key
  137. //
  138. // Parameter:   
  139. //
  140. // Return:  void 
  141. //
  142. void COverwriteStatus::ChangeCapsLock()
  143. // Simulate a key press
  144. keybd_event( VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY | 0,  0 );
  145. // Simulate a key release
  146. keybd_event( VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,  0);
  147. }
  148. //////////////////////////////////////////////////////////////////
  149. //
  150. // Method:      ChangeInsert()
  151. //
  152. // Function:    Change the state of the insert key
  153. //
  154. // Parameter:   
  155. //
  156. // Return:  void 
  157. //
  158. void COverwriteStatus::ChangeInsert()
  159. keybd_event( VK_INSERT, 0x0, KEYEVENTF_EXTENDEDKEY ,  0 );
  160. keybd_event( VK_INSERT, 0x0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,  0);
  161. }
  162. //////////////////////////////////////////////////////////////////
  163. //
  164. // Method:      DrawItem
  165. //
  166. // Function:    Draw the specific pane of the status bar
  167. //
  168. // Parameter:   LPDRAWITEMSTRUCT
  169. //
  170. // Return:  void
  171. //
  172. void COverwriteStatus::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  173. {
  174. CDC dc;
  175. dc.Attach(lpDrawItemStruct->hDC);
  176. CRect cRect(&lpDrawItemStruct->rcItem);
  177. int nOldBkMode = dc.SetBkMode(TRANSPARENT);
  178. // Show only the animation, if the selected measure is identical with the running Id
  179. COLORREF cOldFgColor = dc.GetTextColor();
  180. COLORREF cTxColor = RGB(0,0,0);
  181. switch(lpDrawItemStruct->itemID)       
  182. {       
  183. case 2: // Insert/Overwrite
  184. {
  185. if (((CChildFrame *)GetParent())-> IsOverwrite ()) cTxColor = RGB(0,0,0);
  186. // This method can only be used, if there is only one Edit-Window
  187. // if ( ::GetKeyState(VK_INSERT) & 0x0001) cTxColor = RGB(0,0,0);
  188. else cTxColor = RGB(128,128,128);
  189. break;
  190. }
  191. case 3: // Caps-Lock
  192. {
  193. if ( ::GetKeyState(VK_CAPITAL) & 0x0001) cTxColor = RGB(0,0,0);
  194. else cTxColor = RGB(128,128,128);
  195. break;
  196. }
  197. case 4: // Num-Lock
  198. {
  199. if ( ::GetKeyState(VK_NUMLOCK) & 0x0001) cTxColor = RGB(0,0,0);
  200. else cTxColor = RGB(128,128,128);
  201. break;
  202. }
  203. }
  204. dc.SetTextColor(cTxColor);
  205. CString cText = GetPaneText(lpDrawItemStruct->itemID);
  206. dc.DrawText(cText,cRect, DT_LEFT); 
  207. dc.SetTextColor(cOldFgColor);
  208. dc.SetBkMode(nOldBkMode);
  209. dc.Detach();  
  210. }