MainFrm.cpp
上传用户:diziting
上传日期:2007-01-02
资源大小:56k
文件大小:9k
源码类别:

工具条

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "FlatBar.h"
  5. #include "MainFrm.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CMainFrame
  13. IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
  14. BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  15. //{{AFX_MSG_MAP(CMainFrame)
  16. ON_WM_CREATE()
  17. ON_UPDATE_COMMAND_UI(ID_VIEW_FLATBAR, OnUpdateViewFlatbar)
  18. ON_COMMAND(ID_VIEW_FLATBAR, OnViewFlatbar)
  19. ON_UPDATE_COMMAND_UI(ID_ToggleCase, OnUpdateToggleCase)
  20. ON_COMMAND(ID_ToggleCase, OnToggleCase)
  21. ON_UPDATE_COMMAND_UI(ID_BUTTON32790, OnUpdateButton)
  22. ON_UPDATE_COMMAND_UI(ID_BUTTON32791, OnUpdateButton)
  23. ON_UPDATE_COMMAND_UI(ID_BUTTON32792, OnUpdateButton)
  24. ON_UPDATE_COMMAND_UI(ID_BUTTON32793, OnUpdateButton)
  25. ON_UPDATE_COMMAND_UI(ID_BUTTON32794, OnUpdateButton)
  26. ON_UPDATE_COMMAND_UI(ID_BUTTON32795, OnUpdateButton)
  27. ON_UPDATE_COMMAND_UI(ID_BUTTON32796, OnUpdateButton)
  28. ON_WM_CLOSE()
  29. //}}AFX_MSG_MAP
  30. // required handlers for adjusting toolbar-buttons
  31. ON_NOTIFY(TBN_QUERYDELETE, AFX_IDW_TOOLBAR, OnQueryDelete)
  32.     ON_NOTIFY(TBN_QUERYINSERT, AFX_IDW_TOOLBAR, OnQueryInsert)
  33. ON_NOTIFY(TBN_QUERYDELETE, AFX_IDW_TOOLBAR+5, OnQueryDelete)
  34.     ON_NOTIFY(TBN_QUERYINSERT, AFX_IDW_TOOLBAR+5, OnQueryInsert)
  35. #if _MFC_VER >= 0x0420
  36. ON_NOTIFY( NM_CUSTOMDRAW, AFX_IDW_TOOLBAR, OnCustomToolbarDraw )
  37. ON_NOTIFY( NM_CUSTOMDRAW, AFX_IDW_TOOLBAR+5, OnCustomToolbarDraw )
  38. #endif
  39. END_MESSAGE_MAP()
  40. static UINT indicators[] =
  41. {
  42. ID_SEPARATOR,           // status line indicator
  43. ID_INDICATOR_CAPS,
  44. ID_INDICATOR_NUM,
  45. ID_INDICATOR_SCRL,
  46. };
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CMainFrame construction/destruction
  49. CMainFrame::CMainFrame()
  50. : m_bCaseCheck(FALSE)
  51. {
  52. // TODO: add member initialization code here
  53. }
  54. CMainFrame::~CMainFrame()
  55. {
  56. }
  57. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  58. {
  59. if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
  60. return -1;
  61. if (!m_wndTextBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP,AFX_IDW_TOOLBAR+5) ||
  62. !m_wndTextBar.LoadToolBar(IDR_MAINFRAME))
  63. {
  64. TRACE0("Failed to create toolbarn");
  65. return -1;      // fail to create
  66. }
  67. if (!m_wndToolBar.Create(this) ||
  68. !m_wndToolBar.LoadToolBar(IDR_UTILITIES))
  69. {
  70. TRACE0("Failed to create toolbarn");
  71. return -1;      // fail to create
  72. }
  73. if (!m_wndStatusBar.Create(this) ||
  74. !m_wndStatusBar.SetIndicators(indicators,
  75.   sizeof(indicators)/sizeof(UINT)))
  76. {
  77. TRACE0("Failed to create status barn");
  78. return -1;      // fail to create
  79. }
  80. // TODO: Remove this if you don't want tool tips or a resizeable toolbar
  81. m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
  82. CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
  83. m_wndTextBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
  84. CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
  85. // Let the user adjust the buttons.
  86. // This enables the ALT-drag feature of the CToolBarEx class!
  87. // Note that the SHIFT-drag feature of the original CToolBar
  88. // class is disabled in CToolBarEx!
  89. // This requires to install handlers for TBN_QUERYDELETE
  90. // and TBN_QUERYINSERT notifications (see above and below).
  91. m_wndToolBar.GetToolBarCtrl().ModifyStyle(0,CCS_ADJUSTABLE,0);
  92. m_wndTextBar.GetToolBarCtrl().ModifyStyle(0,CCS_ADJUSTABLE,0);
  93. // TODO: Delete these three lines if you don't want the toolbar to
  94. //  be dockable
  95. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  96. m_wndTextBar.EnableDocking(CBRS_ALIGN_ANY);
  97. // replace an existing button with a CEdit-control on the toolbar
  98. m_wndToolBar.CtrlReplace(
  99. RUNTIME_CLASS(CEdit),
  100. CRect(-150,-22,0,0),
  101. ID_ReplaceButton,
  102. ES_AUTOHSCROLL|ES_PASSWORD|WS_BORDER|WS_TABSTOP
  103. );
  104. // insert a CEdit-control
  105. m_wndToolBar.CtrlInsert(
  106. RUNTIME_CLASS(CEdit),
  107. CRect(-150, -22, 0, 0),
  108. 123,
  109. 3,
  110. ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP
  111. );
  112. // create an additional CComboBox-control on the toolbar
  113. DWORD dwComboStyle = WS_VSCROLL|CBS_AUTOHSCROLL|CBS_DROPDOWN|CBS_HASSTRINGS|WS_TABSTOP;
  114. CComboBox * pBox = (CComboBox*) m_wndToolBar.CtrlInsert(
  115. RUNTIME_CLASS(CComboBox),
  116. CRect(-150, -150, 0, 0),
  117. IDC_COMBOCONTROL,
  118. 0,
  119. dwComboStyle
  120. );
  121. if( pBox ) {
  122. pBox->AddString(TEXT("Line 1"));
  123. pBox->AddString(TEXT("Line 2"));
  124. pBox->AddString(TEXT("Line 3"));
  125. }
  126. m_wndToolBar.CtrlInsert(
  127. RUNTIME_CLASS(CText),
  128. CRect(-100, -22, 0, 0),
  129. 124,
  130. 2
  131. );
  132. // assign texts to the buttons
  133. m_wndTextBar.SetSizes(CSize(42,40), CSize(16,15));
  134. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_FILE_NEW), TEXT("New"));
  135. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_FILE_OPEN), TEXT("&Open"));
  136. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_FILE_SAVE), TEXT("Save"));
  137. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_EDIT_CUT), TEXT("Cut"));
  138. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_EDIT_COPY), TEXT("Copy"));
  139. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_EDIT_PASTE), TEXT("Paste"));
  140. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_ToggleCase), TEXT("Case"));
  141. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_FILE_PRINT), TEXT("Print"));
  142. m_wndTextBar.SetButtonText(m_wndTextBar.CommandToIndex(ID_APP_ABOUT), TEXT("About"));
  143. FrameEnableDocking(this,CBRS_ALIGN_ANY);
  144. DockControlBar(&m_wndTextBar);
  145. DockControlBar(&m_wndToolBar);
  146. return 0;
  147. }
  148. void CMainFrame::OnClose() 
  149. {
  150. CMDIFrameWnd::OnClose();
  151. }
  152. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  153. {
  154. // TODO: Modify the Window class or styles here by modifying
  155. //  the CREATESTRUCT cs
  156. return CMDIFrameWnd::PreCreateWindow(cs);
  157. }
  158. /////////////////////////////////////////////////////////////////////////////
  159. // CMainFrame diagnostics
  160. #ifdef _DEBUG
  161. void CMainFrame::AssertValid() const
  162. {
  163. CMDIFrameWnd::AssertValid();
  164. }
  165. void CMainFrame::Dump(CDumpContext& dc) const
  166. {
  167. CMDIFrameWnd::Dump(dc);
  168. }
  169. #endif //_DEBUG
  170. /////////////////////////////////////////////////////////////////////////////
  171. // CMainFrame message handlers
  172. void CMainFrame::OnUpdateViewFlatbar(CCmdUI* pCmdUI) 
  173. {
  174. pCmdUI->SetCheck(m_wndToolBar.IsFlatLook());
  175. }
  176. void CMainFrame::OnViewFlatbar() 
  177. {
  178. m_wndToolBar.SetFlatLook(!m_wndToolBar.IsFlatLook());
  179. m_wndTextBar.SetFlatLook(!m_wndTextBar.IsFlatLook());
  180. }
  181. void CMainFrame::OnQueryDelete(NMHDR* pHdr, LRESULT* pResult) {
  182.   TRACE0("OnQueryDeleten");
  183.   LPTBNOTIFY pN = LPTBNOTIFY(pHdr);
  184.   *pResult = TRUE; // allow deletion of a button
  185. }
  186. void CMainFrame::OnQueryInsert(NMHDR* pHdr, LRESULT* pResult) {
  187.   TRACE0("OnQueryInsertn");
  188.   LPTBNOTIFY pN = LPTBNOTIFY(pHdr);
  189.   *pResult = TRUE; // allow insertion of a button
  190. }
  191. #if _MFC_VER >= 0x0420
  192. // custom draw of a toolbar is available since VC++ 4.2
  193. void CMainFrame :: OnCustomToolbarDraw( NMHDR * pNotify, LRESULT * pResult ) {
  194. LPNMCUSTOMDRAW pCDRW = (LPNMCUSTOMDRAW) pNotify;
  195. *pResult = CDRF_DODEFAULT;
  196. CToolBarEx * pBar = (pNotify->idFrom == AFX_IDW_TOOLBAR) ?
  197. &m_wndToolBar : &m_wndTextBar;
  198. switch( pCDRW->dwDrawStage ) {
  199. case CDDS_PREPAINT:
  200. //TRACE0("receiving PREPAINTn");
  201. *pResult = CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYITEMDRAW;
  202. break;
  203. case CDDS_ITEMPREPAINT:
  204. //TRACE1("receiving ITEMPREPAINT for index %dn",pBar->CommandToIndex(pCDRW->dwItemSpec));
  205. if( pBar->IsFlatLook() ) {
  206. // if the cursor is on this button, then draw it with blue
  207. // text instead of black:
  208. CRect rect;
  209. pBar->GetItemRect(pBar->CommandToIndex(pCDRW->dwItemSpec), rect);
  210. CPoint pt;
  211. ::GetCursorPos(&pt);
  212. pBar->ScreenToClient(&pt);
  213. if( rect.PtInRect(pt) )
  214. ::SetTextColor(pCDRW->hdc, RGB(0,0,255));
  215. }
  216. *pResult = CDRF_NOTIFYPOSTPAINT; // request for ITEMPOSTPAINT
  217. break;
  218. case CDDS_ITEMPOSTPAINT:
  219. //TRACE1("receiving ITEMPOSTPAINT for index %dn",pBar->CommandToIndex(pCDRW->dwItemSpec));
  220. break;
  221. case CDDS_POSTPAINT:
  222. //TRACE0("receiving POSTPAINTn");
  223. break;
  224. default:
  225. // CToolBar does not send other draw-stages than the above.
  226. TRACE0("unknown draw stage ...n");
  227. break;
  228. }
  229. }
  230. #endif // _MFC_VER >= 0x0420
  231. static int Enabled = 0;
  232. void CMainFrame::OnUpdateToggleCase(CCmdUI* pCmdUI) 
  233. {
  234. pCmdUI->SetCheck(m_bCaseCheck);
  235. if(Enabled == 3)
  236. pCmdUI->Enable(FALSE);
  237. }
  238. void CMainFrame::OnToggleCase() 
  239. {
  240. m_bCaseCheck = ! m_bCaseCheck;
  241. ++Enabled;
  242. }
  243. void CMainFrame::OnUpdateButton(CCmdUI* pCmdUI) 
  244. {
  245. pCmdUI->Enable();
  246. }
  247. /////////////////////////////////////////////////////////////////////////////
  248. // CText
  249. CText::CText()
  250. {
  251. }
  252. CText::~CText()
  253. {
  254. }
  255. IMPLEMENT_DYNCREATE(CText, CStatic);
  256. BEGIN_MESSAGE_MAP(CText, CStatic)
  257. //{{AFX_MSG_MAP(CText)
  258. // NOTE - the ClassWizard will add and remove mapping macros here.
  259. //}}AFX_MSG_MAP
  260. END_MESSAGE_MAP()
  261. /////////////////////////////////////////////////////////////////////////////
  262. // CText message handlers
  263. BOOL CText::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  264. {
  265. return CWnd::Create(TEXT("STATIC"), TEXT("text control"), dwStyle|SS_CENTER, rect, pParentWnd, nID);
  266. }
  267. void CText::PostNcDestroy() 
  268. {
  269. delete this;
  270. }