home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / Basic / Visual Basic.60 / COMMON / TOOLS / VCM / VCM.MDB / VcmComponentContainer / 24_Cabinet / MAINFRM.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1998-05-18  |  12.5 KB  |  449 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-1998 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 related
  9. // electronic 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.     //}}AFX_MSG_MAP
  45.     ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
  46.     ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
  47.     ON_COMMAND_RANGE(ID_PALETTEERASE, ID_PALETTEOVAL, OnPalette)
  48.     ON_UPDATE_COMMAND_UI_RANGE(ID_PALETTEERASE, ID_PALETTEOVAL, OnUpdatePalette)
  49. END_MESSAGE_MAP()
  50.  
  51. /////////////////////////////////////////////////////////////////////////////
  52. // arrays of IDs used to initialize control bars
  53.  
  54. static UINT BASED_CODE styles[] =
  55. {
  56.     // same order as in the bitmap 'styles.bmp'
  57.     ID_SEPARATOR,           // for combo box (placeholder)
  58.     ID_SEPARATOR,
  59.     ID_STYLE_LEFT,
  60.     ID_STYLE_CENTERED,
  61.     ID_STYLE_RIGHT,
  62.     ID_STYLE_JUSTIFIED,
  63. };
  64.  
  65. static UINT BASED_CODE palette[] =
  66. {
  67.     // same order as in the bitmap 'palette.bmp'
  68.     ID_PALETTEERASE,
  69.     ID_PALETTEPEN,
  70.     ID_PALETTESELECT,
  71.     ID_PALETTEBRUSH,
  72.     ID_PALETTESPRAY,
  73.     ID_PALETTEPAINT,
  74.     ID_PALETTELINE,
  75.     ID_PALETTEEYEDROP,
  76.     ID_PALETTEMAG,
  77.     ID_PALETTERECT,
  78.     ID_PALETTEROUND,
  79.     ID_PALETTEOVAL
  80. };
  81.  
  82. static UINT BASED_CODE indicators[] =
  83. {
  84.     ID_SEPARATOR,           // status line indicator
  85.     ID_INDICATOR_OVR,
  86.     ID_INDICATOR_CAPS,
  87.     ID_INDICATOR_NUM
  88. };
  89.  
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CMainFrame construction/destruction
  92.  
  93. CMainFrame::CMainFrame()
  94. {
  95.     m_bInsert = FALSE;      // default to over-strke mode
  96.     m_bDialogTop = FALSE;
  97.     m_nPaletteCol = 3;
  98. }
  99.  
  100. CMainFrame::~CMainFrame()
  101. {
  102. }
  103.  
  104. // We override PreCreateWindow to specify a different window class (WNDCLASS),
  105. //   one with a different background and without the CS_VREDRAW/CS_HREDRAW
  106. //   style so all the frame window's control bars will not be repainted
  107. //   when the window is resized.
  108. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  109. {
  110.     cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS,
  111.         AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1),
  112.         AfxGetApp()->LoadIcon(IDR_MAINFRAME));
  113.  
  114.     return TRUE;
  115. }
  116.  
  117. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  118. {
  119.     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  120.         return -1;
  121.  
  122.     EnableDocking(CBRS_ALIGN_ANY);
  123.  
  124.     if (!CreateToolBar())
  125.         return -1;
  126.     if (!CreateStyleBar())
  127.         return -1;
  128.     if (!CreatePaletteBar())
  129.         return -1;
  130.     if (!CreateStatusBar())
  131.         return -1;
  132.  
  133.     if (!m_wndDlgBar.Create(this, IDD_VIEWSELECT,
  134.         CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY, IDD_VIEWSELECT))
  135.     {
  136.         TRACE0("Failed to create DlgBar\n");
  137.         return -1;      // fail to create
  138.     }
  139.  
  140.     return 0;
  141. }
  142.  
  143. BOOL CMainFrame::CreateToolBar()
  144. {
  145.     if (!m_wndToolBar.Create(this,
  146.             CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|WS_VISIBLE) ||
  147.         !m_wndToolBar.LoadBitmap(IDR_MAINFRAME))
  148.     {
  149.         TRACE0("Failed to create toolbar\n");
  150.         return FALSE;       // fail to create
  151.     }
  152.  
  153.     OnViewShort();
  154.     return TRUE;
  155. }
  156.  
  157. BOOL CMainFrame::CreatePaletteBar()
  158. {
  159.     if (!m_wndPaletteBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_FIXED |
  160.         CBRS_TOP | CBRS_TOOLTIPS, ID_PALETTEBAR) ||
  161.         !m_wndPaletteBar.LoadBitmap(IDB_PALETTE) ||
  162.         !m_wndPaletteBar.SetButtons(palette,
  163.           sizeof(palette)/sizeof(UINT)))
  164.     {
  165.         TRACE0("Failed to create toolbar\n");
  166.         return FALSE;       // fail to create
  167.     }
  168.  
  169.     m_wndPaletteBar.SetWindowText(_T("Palette"));
  170.     m_wndPaletteBar.EnableDocking(0);
  171.  
  172.     // Create the Palette.  We are using hardcoded numbers for ease here
  173.     // normally the location would be read in from an ini file.
  174.     CPoint pt(GetSystemMetrics(SM_CXSCREEN) - 100,
  175.         GetSystemMetrics(SM_CYSCREEN) / 3);
  176.  
  177.     m_wndPaletteBar.SetColumns(3);
  178.     FloatControlBar(&m_wndPaletteBar, pt);
  179.  
  180.     return TRUE;
  181. }
  182.  
  183. BOOL CMainFrame::CreateStyleBar()
  184. {
  185.     const int nDropHeight = 100;
  186.  
  187.     if (!m_wndStyleBar.Create(this, WS_CHILD|WS_VISIBLE|CBRS_TOP|
  188.             CBRS_TOOLTIPS|CBRS_FLYBY, IDW_STYLES) ||
  189.         !m_wndStyleBar.LoadBitmap(IDB_STYLES) ||
  190.         !m_wndStyleBar.SetButtons(styles, sizeof(styles)/sizeof(UINT)))
  191.     {
  192.         TRACE0("Failed to create stylebar\n");
  193.         return FALSE;       // fail to create
  194.     }
  195.  
  196.     // Create the combo box
  197.     m_wndStyleBar.SetButtonInfo(0, IDW_COMBO, TBBS_SEPARATOR, 100);
  198.  
  199.     // Design guide advises 12 pixel gap between combos and buttons
  200.     m_wndStyleBar.SetButtonInfo(1, ID_SEPARATOR, TBBS_SEPARATOR, 12);
  201.     CRect rect;
  202.     m_wndStyleBar.GetItemRect(0, &rect);
  203.     rect.top = 3;
  204.     rect.bottom = rect.top + nDropHeight;
  205.     if (!m_wndStyleBar.m_comboBox.Create(
  206.             CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP,
  207.             rect, &m_wndStyleBar, IDW_COMBO))
  208.     {
  209.         TRACE0("Failed to create combo-box\n");
  210.         return FALSE;
  211.     }
  212.  
  213.     //  Fill the combo box
  214.     CString szStyle;
  215.     if (szStyle.LoadString(IDS_LEFT))
  216.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  217.     if (szStyle.LoadString(IDS_CENTERED))
  218.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  219.     if (szStyle.LoadString(IDS_RIGHT))
  220.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  221.     if (szStyle.LoadString(IDS_JUSTIFIED))
  222.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  223.  
  224.     //  Create a font for the combobox
  225.     LOGFONT logFont;
  226.     memset(&logFont, 0, sizeof(logFont));
  227.  
  228.     if (!::GetSystemMetrics(SM_DBCSENABLED))
  229.     {
  230.         // Since design guide says toolbars are fixed height so is the font.
  231.         logFont.lfHeight = -12;
  232.         logFont.lfWeight = FW_BOLD;
  233.         logFont.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
  234.         CString strDefaultFont;
  235.         strDefaultFont.LoadString(IDS_DEFAULT_FONT);
  236.         lstrcpy(logFont.lfFaceName, strDefaultFont);
  237.         if (!m_wndStyleBar.m_font.CreateFontIndirect(&logFont))
  238.             TRACE0("Could Not create font for combo\n");
  239.         else
  240.             m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
  241.     }
  242.     else
  243.     {
  244.         m_wndStyleBar.m_font.Attach(::GetStockObject(SYSTEM_FONT));
  245.         m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
  246.     }
  247.  
  248.     return TRUE;
  249. }
  250.  
  251. BOOL CMainFrame::CreateStatusBar()
  252. {
  253.     if (!m_wndStatusBar.Create(this) ||
  254.         !m_wndStatusBar.SetIndicators(indicators,
  255.           sizeof(indicators)/sizeof(UINT)))
  256.     {
  257.         TRACE0("Failed to create status bar\n");
  258.         return FALSE;       // fail to create
  259.     }
  260.  
  261.     UINT nID, nStyle;
  262.     int cxWidth;
  263.  
  264.     m_wndStatusBar.GetPaneInfo( 0, nID, nStyle, cxWidth);
  265.     m_wndStatusBar.SetPaneInfo( 0, nID, SBPS_STRETCH|SBPS_NORMAL, cxWidth);
  266.     return TRUE;
  267. }
  268.  
  269. /////////////////////////////////////////////////////////////////////////////
  270. // CMainFrame diagnostics
  271.  
  272. #ifdef _DEBUG
  273. void CMainFrame::AssertValid() const
  274. {
  275.     CFrameWnd::AssertValid();
  276. }
  277.  
  278. void CMainFrame::Dump(CDumpContext& dc) const
  279. {
  280.     CFrameWnd::Dump(dc);
  281. }
  282.  
  283. #endif //_DEBUG
  284.  
  285. /////////////////////////////////////////////////////////////////////////////
  286. // CMainFrame message handlers
  287.  
  288. void CMainFrame::OnViewShort()
  289. {
  290.     // Set the toolbar to show only partial commmand list
  291.     m_wndToolBar.SetButtons(NULL, 7);
  292.     m_wndToolBar.SetButtonInfo(0, ID_VIEW_LONG,TBBS_BUTTON, 10);
  293.     m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  294.     m_wndToolBar.SetButtonInfo(2, ID_FILE_OPEN,TBBS_BUTTON, 1);
  295.     m_wndToolBar.SetButtonInfo(3, ID_FILE_NEW,TBBS_BUTTON, 0);
  296.     m_wndToolBar.SetButtonInfo(4, ID_FILE_SAVE,TBBS_BUTTON, 2);
  297.     m_wndToolBar.SetButtonInfo(5, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  298.     m_wndToolBar.SetButtonInfo(6, ID_APP_ABOUT,TBBS_BUTTON, 7);
  299.  
  300.     // invalidate the call update handlers before painting
  301.     m_wndToolBar.Invalidate();
  302.     AfxGetApp()->OnIdle(-1);
  303. }
  304.  
  305. void CMainFrame::OnViewLong()
  306. {
  307.     // Set the toolbar to show all commmands
  308.     m_wndToolBar.SetButtons(NULL, 13);
  309.     m_wndToolBar.SetButtonInfo(0, ID_VIEW_SHORT,TBBS_BUTTON, 9);
  310.     m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  311.     m_wndToolBar.SetButtonInfo(2, ID_FILE_OPEN,TBBS_BUTTON, 1);
  312.     m_wndToolBar.SetButtonInfo(3, ID_FILE_NEW,TBBS_BUTTON, 0);
  313.     m_wndToolBar.SetButtonInfo(4, ID_FILE_SAVE,TBBS_BUTTON, 2);
  314.     m_wndToolBar.SetButtonInfo(5, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  315.     m_wndToolBar.SetButtonInfo(6, ID_APP_ABOUT,TBBS_BUTTON, 7);
  316.     m_wndToolBar.SetButtonInfo(7, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  317.     m_wndToolBar.SetButtonInfo(8, ID_EDIT_CUT,TBBS_BUTTON, 3);
  318.     m_wndToolBar.SetButtonInfo(9, ID_EDIT_COPY,TBBS_BUTTON, 4);
  319.     m_wndToolBar.SetButtonInfo(10, ID_EDIT_PASTE,TBBS_BUTTON, 5);
  320.     m_wndToolBar.SetButtonInfo(11, ID_FILE_PRINT,TBBS_BUTTON, 6);
  321.     m_wndToolBar.SetButtonInfo(12, ID_CONTEXT_HELP,TBBS_BUTTON, 8);
  322.  
  323.     // invalidate then call update handlers before painting
  324.     m_wndToolBar.Invalidate();
  325.     AfxGetApp()->OnIdle(-1);
  326. }
  327.  
  328. void CMainFrame::OnViewDlgbarTop()
  329. {
  330.     if (m_bDialogTop)
  331.         m_wndDlgBar.SetWindowPos(&m_wndStatusBar, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
  332.     else
  333.         m_wndDlgBar.SetWindowPos(&wndTop, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
  334.  
  335.     RecalcLayout();
  336.     m_bDialogTop = !m_bDialogTop;
  337. }
  338.  
  339. void CMainFrame::OnUpdateViewDlgbartop(CCmdUI* pCmdUI)
  340. {
  341.     pCmdUI->SetCheck(m_bDialogTop);
  342. }
  343.  
  344. BOOL CMainFrame::OnViewBar(UINT nID)
  345. {
  346.     CWnd* pBar;
  347.     if ((pBar = GetDlgItem(nID)) == NULL)
  348.         return FALSE;   // not for us
  349.     // toggle visible state
  350.     pBar->ShowWindow((pBar->GetStyle() & WS_VISIBLE) == 0);
  351.     RecalcLayout();
  352.     return TRUE;
  353. }
  354.  
  355. void CMainFrame::OnUpdateBarMenu(CCmdUI* pCmdUI)
  356. {
  357.     CWnd* pBar;
  358.     if ((pBar = GetDlgItem(pCmdUI->m_nID)) == NULL)
  359.     {
  360.         pCmdUI->ContinueRouting();
  361.         return; // not for us
  362.     }
  363.     pCmdUI->SetCheck((pBar->GetStyle() & WS_VISIBLE) != 0);
  364. }
  365.  
  366. void CMainFrame::OnViewPalette()
  367. {
  368.     BOOL bVisible = ((m_wndPaletteBar.GetStyle() & WS_VISIBLE) != 0);
  369.  
  370.     ShowControlBar(&m_wndPaletteBar, !bVisible, FALSE);
  371.     RecalcLayout();
  372. }
  373.  
  374. void CMainFrame::OnUpdatePaletteMenu(CCmdUI* pCmdUI)
  375. {
  376.     BOOL bVisible = ((m_wndPaletteBar.GetStyle() & WS_VISIBLE) != 0);
  377.     pCmdUI->SetCheck(bVisible);
  378. }
  379.  
  380. void CMainFrame::OnChangeStyle(UINT nID)
  381. {
  382.     m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
  383. }
  384.  
  385. void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
  386. {
  387.     UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
  388.     pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
  389. }
  390.  
  391. void CMainFrame::OnUpdateInsert(CCmdUI* pCmdUI)
  392. {
  393.     pCmdUI->Enable(!m_bInsert);
  394. }
  395.  
  396. void CMainFrame::OnToggleInsert()
  397. {
  398.     m_bInsert = !m_bInsert;
  399. }
  400.  
  401. void CMainFrame::OnUpdatePalette(CCmdUI* pCmdUI)
  402. {
  403.     CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  404.     UINT nIndex = pCBox->GetCurSel();
  405.     pCmdUI->SetCheck((UINT)(ID_PALETTE_BASE + nIndex) == pCmdUI->m_nID);
  406. }
  407.  
  408. void CMainFrame::OnPalette(UINT nID)
  409. {
  410.     CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  411.     pCBox->SetCurSel((int)(nID - ID_PALETTE_BASE));
  412.     OnSelChangePalette();
  413. }
  414.  
  415. void CMainFrame::OnSelChangePalette()
  416. {
  417.     CString strText;
  418.     CString strItem;
  419.     CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  420.     int nIndex = pCBox->GetCurSel();
  421.     if (nIndex == CB_ERR)
  422.         return;
  423.     pCBox->GetLBText(nIndex, strItem);
  424.     AfxFormatString1(strText, IDS_SELECTED_PROMPT, (LPCTSTR)strItem);
  425.     SetMessageText(strText);
  426. }
  427.  
  428. void CMainFrame::OnPalette2column()
  429. {
  430.     m_nPaletteCol = 2;
  431.     m_wndPaletteBar.SetColumns(m_nPaletteCol);
  432. }
  433.  
  434. void CMainFrame::OnPalette3column()
  435. {
  436.     m_nPaletteCol = 3;
  437.     m_wndPaletteBar.SetColumns(m_nPaletteCol);
  438. }
  439.  
  440. void CMainFrame::OnUpdatePalette2column(CCmdUI* pCmdUI)
  441. {
  442.     pCmdUI->SetCheck(m_nPaletteCol == 2);
  443. }
  444.  
  445. void CMainFrame::OnUpdatePalette3column(CCmdUI* pCmdUI)
  446. {
  447.     pCmdUI->SetCheck(m_nPaletteCol == 3);
  448. }
  449.