|
|
1.1 root 1: // hello.cpp : Defines the class behaviors for the Hello child window.
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: // QuickHelp documentation provided with the library.
10: // See these sources for detailed information regarding the
11: // Microsoft Foundation Classes product.
12: //
13:
14: #include "mdi.h"
15:
16: static COLORREF clrTextArray[] = { RGB (0, 0, 0), RGB (255, 0, 0),
17: RGB (0, 255, 0), RGB ( 0, 0, 255),
18: RGB (255, 255, 255) } ;
19:
20: /////////////////////////////////////////////////////////////////////////////
21: // CHelloWnd Member Functions
22:
23:
24: BEGIN_MESSAGE_MAP(CHelloWnd, CMDIChildWnd)
25: ON_WM_CREATE()
26: ON_COMMAND(IDM_BLACK, OnColor)
27: ON_COMMAND(IDM_RED, OnColor)
28: ON_COMMAND(IDM_GREEN, OnColor)
29: ON_COMMAND(IDM_BLUE, OnColor)
30: ON_COMMAND(IDM_WHITE, OnColor)
31: ON_COMMAND(IDM_CUSTOM, OnColor)
32: ON_WM_PAINT()
33: ON_WM_MDIACTIVATE()
34: ON_WM_DESTROY()
35: END_MESSAGE_MAP()
36:
37: // Create:
38: // Register a custom WndClass and create a window.
39: // This must be done because CHelloWnd has a custom icon.
40: //
41: BOOL CHelloWnd::Create(LPCSTR szTitle, LONG style /* = 0 */,
42: const RECT& rect /* = rectDefault */,
43: CMDIFrameWnd* parent /* = NULL */)
44: {
45: const char* pszHelloClass =
46: AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
47: LoadCursor(NULL, IDC_ARROW),
48: (HBRUSH) (COLOR_WINDOW+1),
49: LoadIcon(AfxGetInstanceHandle(), "hello"));
50:
51: return CMDIChildWnd::Create(pszHelloClass, szTitle, style, rect, parent);
52: }
53:
54:
55: // Constructor
56: // Do minimum initialization
57: //
58: CHelloWnd::CHelloWnd()
59: {
60: m_nColor = 0;
61: m_clrText = 0;
62: m_pMenuCurrent = NULL;
63: m_bWindowActive = FALSE;
64: }
65:
66: // Destructor:
67: // Clean up menu iff Windows won't
68: //
69: CHelloWnd::~CHelloWnd()
70: {
71: if (m_bWindowActive)
72: {
73: // Suppress Foundation DestroyMenu done in CMenu destructor
74: // (Windows takes care of menu cleanup for the active window)
75: //
76: m_pMenuCurrent->Detach();
77: }
78: }
79:
80: // OnCreate:
81: // Set up colors -- this also could have been done in constructor
82: //
83: int CHelloWnd::OnCreate(LPCREATESTRUCT /* p */)
84: {
85: m_nColor = IDM_BLACK;
86: m_clrText = RGB (0, 0, 0);
87:
88: return 0;
89: }
90:
91: // OnDestroy:
92: // Notify app main MDI frame window of destruction so it may
93: // do some cleanup. Note: this uses a custom message -- see
94: // mdi.h and mdi.cpp for the custom message handler
95: //
96: void CHelloWnd::OnDestroy()
97: {
98: m_pMDIFrameWnd->SendMessage(WM_CHILDDESTROY, (UINT)m_hWnd, 0);
99: }
100:
101: // OnColor:
102: // Change menu checkmarks to indicate the newly selected color.
103: //
104: void CHelloWnd::OnColor()
105: {
106: CMenu* pMenu = m_pMDIFrameWnd->GetMenu();
107: pMenu->CheckMenuItem(m_nColor, MF_UNCHECKED);
108:
109: m_nColor = GetCurrentMessage()->wParam;
110: pMenu->CheckMenuItem(m_nColor, MF_CHECKED);
111:
112: if (m_nColor != IDM_CUSTOM)
113: m_clrText = clrTextArray[m_nColor - IDM_BLACK];
114: else
115: {
116: CColorDialog dlgColor(m_clrText);
117: if (dlgColor.DoModal() == IDOK)
118: m_clrText = dlgColor.GetColor();
119: }
120:
121: // Force the client area text to be repainted in the new color
122:
123: Invalidate();
124: }
125:
126: // OnPaint:
127: // Draw a string in the center of the client area.
128: //
129: void CHelloWnd::OnPaint()
130: {
131: CPaintDC dc(this);
132: CRect rect;
133:
134: dc.SetTextColor(m_clrText);
135: dc.SetBkColor(::GetSysColor(COLOR_WINDOW));
136: GetClientRect(rect);
137: dc.DrawText("Hello, World!", -1, rect,
138: DT_SINGLELINE | DT_CENTER | DT_VCENTER);
139: }
140:
141:
142: // OnMDIActivate:
143: // This window is being activated or deactivated.
144: // Switch the menus appropriately.
145: //
146: void CHelloWnd::OnMDIActivate(BOOL bActivate, CWnd* /*pActive*/,
147: CWnd* /*pDeActive*/)
148: {
149: CMDIFrameWnd* pFrame = m_pMDIFrameWnd;
150: CMenu* pWinPopupMenu = NULL;
151: CMenu* pMenu = NULL;
152:
153: m_bWindowActive = bActivate;
154:
155: if (bActivate)
156: {
157: pMenu = new CMenu;
158: pMenu->LoadMenu("MdiMenuHello");
159: pWinPopupMenu = pMenu->GetSubMenu(HELLO_MENU_POS);
160:
161: CMenu* pLastMenu = pFrame->MDISetMenu(pMenu, pWinPopupMenu);
162: pLastMenu->DestroyMenu();
163:
164: pMenu->CheckMenuItem(m_nColor, MF_CHECKED);
165:
166: delete m_pMenuCurrent;
167: m_pMenuCurrent = pMenu;
168: }
169: else
170: {
171: pMenu = new CMenu;
172: pMenu->LoadMenu("MdiMenuInit");
173: pWinPopupMenu = pMenu->GetSubMenu(INIT_MENU_POS);
174:
175: CMenu* pLastMenu = pFrame->MDISetMenu(pMenu, pWinPopupMenu);
176: pLastMenu->DestroyMenu();
177:
178: delete m_pMenuCurrent;
179: m_pMenuCurrent = pMenu;
180: }
181:
182: pFrame->DrawMenuBar();
183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.