mainfrm.cpp
Upload User: dfguandao
Upload Date: 2020-06-07
Package Size: 23k
Code Size: 12k
Category:

ToolBar

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "ctrlbars.h"
  3. #include "mainfrm.h"
  4. #ifdef _DEBUG
  5. #undef THIS_FILE
  6. static char BASED_CODE THIS_FILE[] = __FILE__;
  7. #endif
  8. /////////////////////////////////////////////////////////////////////////////
  9. // CMainFrame
  10. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  11. //{{AFX_MSG_MAP(CMainFrame)
  12. ON_WM_CREATE()
  13. ON_COMMAND(ID_VIEW_DLGBARTOP, OnViewDlgbarTop)
  14. ON_UPDATE_COMMAND_UI(ID_VIEW_DLGBARTOP, OnUpdateViewDlgbartop)
  15. ON_COMMAND(ID_VIEW_SHORT, OnViewShort)
  16. ON_COMMAND(ID_VIEW_LONG, OnViewLong)
  17. ON_COMMAND(ID_TOGGLE_INSERT, OnToggleInsert)
  18. ON_UPDATE_COMMAND_UI(ID_INDICATOR_OVR, OnUpdateInsert)
  19. ON_COMMAND_EX(IDW_STYLES, OnViewBar)
  20. ON_UPDATE_COMMAND_UI(IDW_STYLES, OnUpdateBarMenu)
  21. ON_COMMAND(IDM_VIEWPALETTE, OnViewPalette)
  22. ON_UPDATE_COMMAND_UI(IDM_VIEWPALETTE, OnUpdatePaletteMenu)
  23. ON_COMMAND(IDM_PALETTE_2COLUMN, OnPalette2column)
  24. ON_COMMAND(IDM_PALETTE_3COLUMN, OnPalette3column)
  25. ON_UPDATE_COMMAND_UI(IDM_PALETTE_3COLUMN, OnUpdatePalette3column)
  26. ON_UPDATE_COMMAND_UI(IDM_PALETTE_2COLUMN, OnUpdatePalette2column)
  27. ON_CBN_SELCHANGE(IDC_PALETTE, OnSelChangePalette)
  28. //}}AFX_MSG_MAP
  29. ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
  30. ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
  31. ON_COMMAND_RANGE(ID_PALETTEERASE, ID_PALETTEOVAL, OnPalette)
  32. ON_UPDATE_COMMAND_UI_RANGE(ID_PALETTEERASE, ID_PALETTEOVAL, OnUpdatePalette)
  33. END_MESSAGE_MAP()
  34. /////////////////////////////////////////////////////////////////////////////
  35. // arrays of IDs used to initialize control bars
  36. static UINT BASED_CODE styles[] =
  37. {
  38. // same order as in the bitmap 'styles.bmp'
  39. ID_SEPARATOR,           // for combo box (placeholder)
  40. ID_SEPARATOR,
  41. ID_STYLE_LEFT,
  42. ID_STYLE_CENTERED,
  43. ID_STYLE_RIGHT,
  44. ID_STYLE_JUSTIFIED,
  45. };
  46. static UINT BASED_CODE palette[] =
  47. {
  48. // same order as in the bitmap 'palette.bmp'
  49. ID_PALETTEERASE,
  50. ID_PALETTEPEN,
  51. ID_PALETTESELECT,
  52. ID_PALETTEBRUSH,
  53. ID_PALETTESPRAY,
  54. ID_PALETTEPAINT,
  55. ID_PALETTELINE,
  56. ID_PALETTEEYEDROP,
  57. ID_PALETTEMAG,
  58. ID_PALETTERECT,
  59. ID_PALETTEROUND,
  60. ID_PALETTEOVAL
  61. };
  62. static UINT BASED_CODE indicators[] =
  63. {
  64. ID_SEPARATOR,           // status line indicator
  65. ID_INDICATOR_OVR,
  66. ID_INDICATOR_CAPS,
  67. ID_INDICATOR_NUM
  68. };
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CMainFrame construction/destruction
  71. CMainFrame::CMainFrame()
  72. {
  73. m_bInsert = FALSE;      // default to over-strke mode
  74. m_bDialogTop = FALSE;
  75. m_nPaletteCol = 3;
  76. }
  77. CMainFrame::~CMainFrame()
  78. {
  79. }
  80. // We override PreCreateWindow to specify a different window class (WNDCLASS),
  81. //   one with a different background and without the CS_VREDRAW/CS_HREDRAW
  82. //   style so all the frame window's control bars will not be repainted
  83. //   when the window is resized.
  84. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  85. {
  86. cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS,
  87. AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1),
  88. AfxGetApp()->LoadIcon(IDR_MAINFRAME));
  89. return TRUE;
  90. }
  91. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  92. {
  93. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  94. return -1;
  95. EnableDocking(CBRS_ALIGN_ANY);
  96. if (!CreateToolBar())
  97. return -1;
  98. if (!CreateStyleBar())
  99. return -1;
  100. if (!CreatePaletteBar())
  101. return -1;
  102. if (!CreateStatusBar())
  103. return -1;
  104. if (!m_wndDlgBar.Create(this, IDD_VIEWSELECT,
  105. CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY, IDD_VIEWSELECT))
  106. {
  107. TRACE0("Failed to create DlgBarn");
  108. return -1;      // fail to create
  109. }
  110. return 0;
  111. }
  112. BOOL CMainFrame::CreateToolBar()
  113. {
  114. if (!m_wndToolBar.Create(this,
  115. CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|WS_VISIBLE) ||
  116. !m_wndToolBar.LoadBitmap(IDR_MAINFRAME))
  117. {
  118. TRACE0("Failed to create toolbarn");
  119. return FALSE;       // fail to create
  120. }
  121. OnViewShort();
  122. return TRUE;
  123. }
  124. BOOL CMainFrame::CreatePaletteBar()
  125. {
  126. if (!m_wndPaletteBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_FIXED |
  127. CBRS_TOP | CBRS_TOOLTIPS, ID_PALETTEBAR) ||
  128. !m_wndPaletteBar.LoadBitmap(IDB_PALETTE) ||
  129. !m_wndPaletteBar.SetButtons(palette,
  130.   sizeof(palette)/sizeof(UINT)))
  131. {
  132. TRACE0("Failed to create toolbarn");
  133. return FALSE;       // fail to create
  134. }
  135. m_wndPaletteBar.SetWindowText(_T("Palette"));
  136. m_wndPaletteBar.EnableDocking(0);
  137. // Create the Palette.  We are using hardcoded numbers for ease here
  138. // normally the location would be read in from an ini file.
  139. CPoint pt(GetSystemMetrics(SM_CXSCREEN) - 100,
  140. GetSystemMetrics(SM_CYSCREEN) / 3);
  141. m_wndPaletteBar.SetColumns(3);
  142. FloatControlBar(&m_wndPaletteBar, pt);
  143. return TRUE;
  144. }
  145. BOOL CMainFrame::CreateStyleBar()
  146. {
  147. const int nDropHeight = 100;
  148. if (!m_wndStyleBar.Create(this, WS_CHILD|WS_VISIBLE|CBRS_TOP|
  149. CBRS_TOOLTIPS|CBRS_FLYBY, IDW_STYLES) ||
  150. !m_wndStyleBar.LoadBitmap(IDB_STYLES) ||
  151. !m_wndStyleBar.SetButtons(styles, sizeof(styles)/sizeof(UINT)))
  152. {
  153. TRACE0("Failed to create stylebarn");
  154. return FALSE;       // fail to create
  155. }
  156. // Create the combo box
  157. m_wndStyleBar.SetButtonInfo(0, IDW_COMBO, TBBS_SEPARATOR, 100);
  158. // Design guide advises 12 pixel gap between combos and buttons
  159. m_wndStyleBar.SetButtonInfo(1, ID_SEPARATOR, TBBS_SEPARATOR, 12);
  160. CRect rect;
  161. m_wndStyleBar.GetItemRect(0, &rect);
  162. rect.top = 3;
  163. rect.bottom = rect.top + nDropHeight;
  164. if (!m_wndStyleBar.m_comboBox.Create(
  165. CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP,
  166. rect, &m_wndStyleBar, IDW_COMBO))
  167. {
  168. TRACE0("Failed to create combo-boxn");
  169. return FALSE;
  170. }
  171. //  Fill the combo box
  172. CString szStyle;
  173. if (szStyle.LoadString(IDS_LEFT))
  174. m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  175. if (szStyle.LoadString(IDS_CENTERED))
  176. m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  177. if (szStyle.LoadString(IDS_RIGHT))
  178. m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  179. if (szStyle.LoadString(IDS_JUSTIFIED))
  180. m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  181. //  Create a font for the combobox
  182. LOGFONT logFont;
  183. memset(&logFont, 0, sizeof(logFont));
  184. if (!::GetSystemMetrics(SM_DBCSENABLED))
  185. {
  186. // Since design guide says toolbars are fixed height so is the font.
  187. logFont.lfHeight = -12;
  188. logFont.lfWeight = FW_BOLD;
  189. logFont.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
  190. CString strDefaultFont;
  191. strDefaultFont.LoadString(IDS_DEFAULT_FONT);
  192. lstrcpy(logFont.lfFaceName, strDefaultFont);
  193. if (!m_wndStyleBar.m_font.CreateFontIndirect(&logFont))
  194. TRACE0("Could Not create font for combon");
  195. else
  196. m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
  197. }
  198. else
  199. {
  200. m_wndStyleBar.m_font.Attach(::GetStockObject(SYSTEM_FONT));
  201. m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
  202. }
  203. return TRUE;
  204. }
  205. BOOL CMainFrame::CreateStatusBar()
  206. {
  207. if (!m_wndStatusBar.Create(this) ||
  208. !m_wndStatusBar.SetIndicators(indicators,
  209.   sizeof(indicators)/sizeof(UINT)))
  210. {
  211. TRACE0("Failed to create status barn");
  212. return FALSE;       // fail to create
  213. }
  214. UINT nID, nStyle;
  215. int cxWidth;
  216. m_wndStatusBar.GetPaneInfo( 0, nID, nStyle, cxWidth);
  217. m_wndStatusBar.SetPaneInfo( 0, nID, SBPS_STRETCH|SBPS_NORMAL, cxWidth);
  218. return TRUE;
  219. }
  220. /////////////////////////////////////////////////////////////////////////////
  221. // CMainFrame diagnostics
  222. #ifdef _DEBUG
  223. void CMainFrame::AssertValid() const
  224. {
  225. CFrameWnd::AssertValid();
  226. }
  227. void CMainFrame::Dump(CDumpContext& dc) const
  228. {
  229. CFrameWnd::Dump(dc);
  230. }
  231. #endif //_DEBUG
  232. /////////////////////////////////////////////////////////////////////////////
  233. // CMainFrame message handlers
  234. void CMainFrame::OnViewShort()
  235. {
  236. // Set the toolbar to show only partial commmand list
  237. m_wndToolBar.SetButtons(NULL, 7);
  238. m_wndToolBar.SetButtonInfo(0, ID_VIEW_LONG,TBBS_BUTTON, 10);
  239. m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  240. m_wndToolBar.SetButtonInfo(2, ID_FILE_OPEN,TBBS_BUTTON, 1);
  241. m_wndToolBar.SetButtonInfo(3, ID_FILE_NEW,TBBS_BUTTON, 0);
  242. m_wndToolBar.SetButtonInfo(4, ID_FILE_SAVE,TBBS_BUTTON, 2);
  243. m_wndToolBar.SetButtonInfo(5, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  244. m_wndToolBar.SetButtonInfo(6, ID_APP_ABOUT,TBBS_BUTTON, 7);
  245. // invalidate the call update handlers before painting
  246. m_wndToolBar.Invalidate();
  247. AfxGetApp()->OnIdle(-1);
  248. }
  249. void CMainFrame::OnViewLong()
  250. {
  251. // Set the toolbar to show all commmands
  252. m_wndToolBar.SetButtons(NULL, 13);
  253. m_wndToolBar.SetButtonInfo(0, ID_VIEW_SHORT,TBBS_BUTTON, 9);
  254. m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  255. m_wndToolBar.SetButtonInfo(2, ID_FILE_OPEN,TBBS_BUTTON, 1);
  256. m_wndToolBar.SetButtonInfo(3, ID_FILE_NEW,TBBS_BUTTON, 0);
  257. m_wndToolBar.SetButtonInfo(4, ID_FILE_SAVE,TBBS_BUTTON, 2);
  258. m_wndToolBar.SetButtonInfo(5, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  259. m_wndToolBar.SetButtonInfo(6, ID_APP_ABOUT,TBBS_BUTTON, 7);
  260. m_wndToolBar.SetButtonInfo(7, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  261. m_wndToolBar.SetButtonInfo(8, ID_EDIT_CUT,TBBS_BUTTON, 3);
  262. m_wndToolBar.SetButtonInfo(9, ID_EDIT_COPY,TBBS_BUTTON, 4);
  263. m_wndToolBar.SetButtonInfo(10, ID_EDIT_PASTE,TBBS_BUTTON, 5);
  264. m_wndToolBar.SetButtonInfo(11, ID_FILE_PRINT,TBBS_BUTTON, 6);
  265. m_wndToolBar.SetButtonInfo(12, ID_CONTEXT_HELP,TBBS_BUTTON, 8);
  266. // invalidate then call update handlers before painting
  267. m_wndToolBar.Invalidate();
  268. AfxGetApp()->OnIdle(-1);
  269. }
  270. void CMainFrame::OnViewDlgbarTop()
  271. {
  272. if (m_bDialogTop)
  273. m_wndDlgBar.SetWindowPos(&m_wndStatusBar, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
  274. else
  275. m_wndDlgBar.SetWindowPos(&wndTop, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
  276. RecalcLayout();
  277. m_bDialogTop = !m_bDialogTop;
  278. }
  279. void CMainFrame::OnUpdateViewDlgbartop(CCmdUI* pCmdUI)
  280. {
  281. pCmdUI->SetCheck(m_bDialogTop);
  282. }
  283. BOOL CMainFrame::OnViewBar(UINT nID)
  284. {
  285. CWnd* pBar;
  286. if ((pBar = GetDlgItem(nID)) == NULL)
  287. return FALSE;   // not for us
  288. // toggle visible state
  289. pBar->ShowWindow((pBar->GetStyle() & WS_VISIBLE) == 0);
  290. RecalcLayout();
  291. return TRUE;
  292. }
  293. void CMainFrame::OnUpdateBarMenu(CCmdUI* pCmdUI)
  294. {
  295. CWnd* pBar;
  296. if ((pBar = GetDlgItem(pCmdUI->m_nID)) == NULL)
  297. {
  298. pCmdUI->ContinueRouting();
  299. return; // not for us
  300. }
  301. pCmdUI->SetCheck((pBar->GetStyle() & WS_VISIBLE) != 0);
  302. }
  303. void CMainFrame::OnViewPalette()
  304. {
  305. BOOL bVisible = ((m_wndPaletteBar.GetStyle() & WS_VISIBLE) != 0);
  306. ShowControlBar(&m_wndPaletteBar, !bVisible, FALSE);
  307. RecalcLayout();
  308. }
  309. void CMainFrame::OnUpdatePaletteMenu(CCmdUI* pCmdUI)
  310. {
  311. BOOL bVisible = ((m_wndPaletteBar.GetStyle() & WS_VISIBLE) != 0);
  312. pCmdUI->SetCheck(bVisible);
  313. }
  314. void CMainFrame::OnChangeStyle(UINT nID)
  315. {
  316. m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
  317. }
  318. void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
  319. {
  320. UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
  321. pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
  322. }
  323. void CMainFrame::OnUpdateInsert(CCmdUI* pCmdUI)
  324. {
  325. pCmdUI->Enable(!m_bInsert);
  326. }
  327. void CMainFrame::OnToggleInsert()
  328. {
  329. m_bInsert = !m_bInsert;
  330. }
  331. void CMainFrame::OnUpdatePalette(CCmdUI* pCmdUI)
  332. {
  333. CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  334. UINT nIndex = pCBox->GetCurSel();
  335. pCmdUI->SetCheck((UINT)(ID_PALETTE_BASE + nIndex) == pCmdUI->m_nID);
  336. }
  337. void CMainFrame::OnPalette(UINT nID)
  338. {
  339. CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  340. pCBox->SetCurSel((int)(nID - ID_PALETTE_BASE));
  341. OnSelChangePalette();
  342. }
  343. void CMainFrame::OnSelChangePalette()
  344. {
  345. CString strText;
  346. CString strItem;
  347. CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  348. int nIndex = pCBox->GetCurSel();
  349. if (nIndex == CB_ERR)
  350. return;
  351. pCBox->GetLBText(nIndex, strItem);
  352. AfxFormatString1(strText, IDS_SELECTED_PROMPT, (LPCTSTR)strItem);
  353. SetMessageText(strText);
  354. }
  355. void CMainFrame::OnPalette2column()
  356. {
  357. m_nPaletteCol = 2;
  358. m_wndPaletteBar.SetColumns(m_nPaletteCol);
  359. }
  360. void CMainFrame::OnPalette3column()
  361. {
  362. m_nPaletteCol = 3;
  363. m_wndPaletteBar.SetColumns(m_nPaletteCol);
  364. }
  365. void CMainFrame::OnUpdatePalette2column(CCmdUI* pCmdUI)
  366. {
  367. pCmdUI->SetCheck(m_nPaletteCol == 2);
  368. }
  369. void CMainFrame::OnUpdatePalette3column(CCmdUI* pCmdUI)
  370. {
  371. pCmdUI->SetCheck(m_nPaletteCol == 3);
  372. }