|
|
1.1 ! root 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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.