home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c480 / 18.ddi / MFC / SAMPLES / CTRLBARS / MAINFRM.CP_ / MAINFRM.CP
Encoding:
Text File  |  1993-02-08  |  12.8 KB  |  441 lines

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