home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / C++-7 / DISK8 / MFC / SAMPLES / ABOUT2 / ABOUT2.CP$ / about2
Encoding:
Text File  |  1992-01-10  |  6.9 KB  |  240 lines

  1. // about2.cpp : Defines the class behaviors for the About2 application.
  2. //              This application demonstrates typical modal dialog use,
  3. //              painting special graphics on a modal dialog, and when
  4. //              compared to the original C code, shows equivalent
  5. //              functionality between C code and C++ Foundation code.
  6. //
  7. // This is a part of the Microsoft Foundation Classes C++ library.
  8. // Copyright (C) 1992 Microsoft Corporation
  9. // All rights reserved.
  10. //
  11. // This source code is only intended as a supplement to the
  12. // Microsoft Foundation Classes Reference and Microsoft
  13. // QuickHelp documentation provided with the library.
  14. // See these sources for detailed information regarding the
  15. // Microsoft Foundation Classes product.
  16. //
  17. // Based on the About2 application by Charles Petzold.
  18. // The original application appeared in
  19. // "Programming Windows", Second Edition (pp. 417-423),
  20. // Copyright (C) 1990 Charles Petzold,
  21. // published by Microsoft Press. Used with permission.
  22.  
  23. #include <afxwin.h>
  24. #include "resource.h"
  25.  
  26. #include "about2.h"
  27.  
  28. /////////////////////////////////////////////////////////////////////////////
  29.  
  30. // An application can only contain one CWinApp-derived instance
  31.  
  32. CAbout2App theApp;
  33.  
  34. /////////////////////////////////////////////////////////////////////////////
  35.  
  36. // Paint:
  37. // A helper function which paints a window with the given figure.  Note
  38. // it can either be called with an existing CDC or NULL.  If NULL is sent,
  39. // this routine creates its own display context and discards it when
  40. // finished.
  41. //
  42. void Paint(CWnd* wnd, CDC* dc, short nColor, short nFigure)
  43. {
  44.     static DWORD dwColor[8] = { RGB (0,     0, 0), RGB (  0,   0, 255),
  45.                                 RGB (0,   255, 0), RGB (  0, 255, 255),
  46.                                 RGB (255,   0, 0), RGB (255,   0, 255),
  47.                                 RGB (255, 255, 0), RGB (255, 255, 255) } ;
  48.  
  49.     CDC* odc = dc;
  50.  
  51.     if(!odc)
  52.     {
  53.         wnd->InvalidateRect(NULL, TRUE);
  54.         wnd->UpdateWindow(); // paints the background
  55.         dc = wnd->GetDC();
  56.     }
  57.  
  58.     CRect rect;
  59.     wnd->GetClientRect(rect);
  60.  
  61.     CBrush brush;
  62.     CBrush* oldbrush;
  63.     brush.CreateSolidBrush(dwColor[nColor-IDD_BLACK]);
  64.     oldbrush = dc->SelectObject(&brush);
  65.  
  66.     if(nFigure == IDD_RECT)
  67.         dc->Rectangle(rect);
  68.     else
  69.         dc->Ellipse(rect);
  70.  
  71.     dc->SelectObject(oldbrush);
  72.     brush.DeleteObject();
  73.  
  74.     if(!odc)
  75.         wnd->ReleaseDC(dc);
  76. }
  77.  
  78. /////////////////////////////////////////////////////////////////////////////
  79. // CAbout2Dlg
  80.  
  81. // OnInitDialog:
  82. // Called once when the DoModal member function is called.
  83. // Set up the checked/unchecked or focused states of the child controls.
  84. //
  85. // Note that this member function does not need an entry in the message map.
  86. //
  87. BOOL CAbout2Dlg::OnInitDialog()
  88. {
  89.     CheckRadioButton(IDD_BLACK, IDD_WHITE, m_nColor);
  90.     CheckRadioButton(IDD_RECT, IDD_ELL, m_nFigure);
  91.  
  92.     m_ctrl = GetDlgItem(IDD_PAINT);
  93.     GetDlgItem(m_nColor)->SetFocus();
  94.  
  95.     return FALSE;
  96. }
  97.  
  98. // OnColor:
  99. // This is a custom message handler, which we call anytime a radio button
  100. // between IDD_BLACK and IDD_WHITE are pushed.  We just set all the color
  101. // radio buttons, and repaint the inset graphic m_ctrl.
  102. //
  103. void CAbout2Dlg::OnColor()
  104. {
  105.     // Since we cannot pass any arguments with the ON_COMMAND message map,
  106.     // we use the GetCurrentMessage call to see which control was pushed.
  107.     //
  108.     m_nColor = GetCurrentMessage()->wParam;
  109.     CheckRadioButton(IDD_BLACK, IDD_WHITE, m_nColor);
  110.  
  111.     Paint(m_ctrl, NULL, m_nColor, m_nFigure);
  112. }
  113.  
  114. // OnFigure:
  115. // Like OnColor, except this handles the IDD_RECT and IDD_ELL radio buttons.
  116. //
  117. void CAbout2Dlg::OnFigure()
  118. {
  119.     // We use the GetCurrentMessage call to see which control was pushed.
  120.     //
  121.     m_nFigure = GetCurrentMessage()->wParam;
  122.     CheckRadioButton(IDD_RECT, IDD_ELL, m_nFigure);
  123.  
  124.     Paint(m_ctrl, NULL, m_nColor, m_nFigure);
  125. }
  126.  
  127. // OnPaint:
  128. // The dialog is not clean.  Let the base class (CModalDialog::OnPaint)
  129. // do the regular paint behavior, then redraw the special inset figure in
  130. // the m_ctrl control.
  131. //
  132. void CAbout2Dlg::OnPaint()
  133. {
  134.     CModalDialog::OnPaint();
  135.  
  136.     Paint(m_ctrl, NULL, m_nColor, m_nFigure);
  137. }
  138.  
  139. // CAbout2Dlg message map:
  140. // Each Windows message we handle is tied to an CAbout2Dlg member function.
  141. //
  142. BEGIN_MESSAGE_MAP(CAbout2Dlg, CModalDialog)
  143.  
  144.     // These are the click command notifications from our radio buttons.
  145.     // Associate them all to our OnColor member function for processing.
  146.     // These assume the function is "void OnColor()".
  147.     //
  148.     ON_COMMAND(IDD_BLACK, OnColor)
  149.     ON_COMMAND(IDD_RED, OnColor)
  150.     ON_COMMAND(IDD_GREEN, OnColor)
  151.     ON_COMMAND(IDD_YELLOW, OnColor)
  152.     ON_COMMAND(IDD_BLUE, OnColor)
  153.     ON_COMMAND(IDD_MAGENTA, OnColor)
  154.     ON_COMMAND(IDD_CYAN, OnColor)
  155.     ON_COMMAND(IDD_WHITE, OnColor)
  156.  
  157.     // Associate both of these to the OnFigure member function.
  158.     // These assume the function is "void OnFigure()".
  159.     //
  160.     ON_COMMAND(IDD_RECT, OnFigure)
  161.     ON_COMMAND(IDD_ELL, OnFigure)
  162.  
  163.     // Associate the WM_PAINT message to the OnPaint member function.
  164.     // This assumes the function is "void OnPaint()".
  165.     //
  166.     ON_WM_PAINT()
  167.  
  168.     // OnInitDialog and OnOK are automatically tied to the messaging system.
  169.  
  170. END_MESSAGE_MAP()
  171.  
  172. /////////////////////////////////////////////////////////////////////////////
  173. // CMainWnd
  174.  
  175. // CMainWnd constructor:
  176. // When the class object is created, the constructor should tell Windows
  177. // to create a window of the appropriate style and size.  The menu resource
  178. // "About2" in about2.rc is also loaded for the window.
  179. //
  180. CMainWnd::CMainWnd()
  181. {
  182.     if (!Create(NULL, "About Box Demo Program",
  183.         WS_OVERLAPPEDWINDOW, rectDefault, NULL, "About2"))
  184.          AfxAbort();
  185.     m_nCurrentColor = IDD_BLACK;
  186.     m_nCurrentFigure = IDD_RECT;
  187. }
  188.  
  189. // OnPaint:
  190. // The image of our client area needs to be refreshed.
  191. //
  192. void CMainWnd::OnPaint()
  193. {
  194.     CPaintDC dc(this);
  195.     Paint(this, &dc, m_nCurrentColor, m_nCurrentFigure);
  196. }
  197.  
  198. // OnAbout:
  199. // The "About About2..." item of the menu was selected.  All we need to
  200. // do is create a dialog box object (CAbout2Dlg), and tell it to start up.
  201. // Note that if it is successful (the user pressed OK), then the image we
  202. // are currently displaying may be invalid.
  203. //
  204. void CMainWnd::OnAbout()
  205. {
  206.     CAbout2Dlg box(this, m_nCurrentColor, m_nCurrentFigure);
  207.  
  208.     if(box.DoModal() == IDOK)
  209.     {
  210.         // The user accepted the changes so get the information from the
  211.         // dialog object and invalidate the client area.
  212.         m_nCurrentColor = box.GetColor();
  213.         m_nCurrentFigure = box.GetFigure();
  214.         InvalidateRect(NULL, TRUE);
  215.     }
  216. }
  217.  
  218. BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
  219.     ON_COMMAND(IDM_ABOUT, OnAbout)
  220.  
  221.     ON_WM_PAINT()
  222. END_MESSAGE_MAP()
  223.  
  224. /////////////////////////////////////////////////////////////////////////////
  225. // CAbout2App
  226.  
  227. // InitInstance:
  228. // Called once when the application begins.  All we need to do is to create
  229. // a new CMainWnd object which can handle itself once made visible.
  230. //
  231. BOOL CAbout2App::InitInstance()
  232. {
  233.     m_pMainWnd = new CMainWnd();
  234.     m_pMainWnd->ShowWindow(m_nCmdShow);
  235.     m_pMainWnd->UpdateWindow();
  236.  
  237.     return TRUE;
  238. }
  239.  
  240.