|
|
1.1 root 1: /***
2: *winmain.cpp
3: *
4: * Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
5: * Information Contained Herein Is Proprietary and Confidential.
6: *
7: *Purpose:
8: * This module is the main entry point for the sample IDispatch polygon
9: * server, spoly.exe.
10: *
11: * This program is intended to demonstrate an implementation of the IDispatch
12: * interface. Spoly is a very simple app, that implements two simple objects,
13: * CPoly and CPoint and exposes their properties and methods for programatic
14: * and cross-process access via IDispatch.
15: *
16: *Implementation Notes:
17: *
18: *****************************************************************************/
19:
20: #include <stdio.h>
21: #include <string.h>
22:
23: #include "spoly.h"
24: #include "cpoint.h"
25: #include "cpoly.h"
26:
27:
28: extern int g_fExitOnLastRelease;
29:
30:
31: HANDLE g_hinst = 0;
32:
33: HWND g_hwndFrame = 0;
34: HWND g_hwndClient = 0;
35:
36: char g_szFrameWndClass[] = "FrameWClass";
37:
38: CStatBar FAR* g_psb = NULL;
39:
40:
41: BOOL InitApplication(HANDLE);
42: BOOL InitInstance(HANDLE, int);
43:
44: extern "C" int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int);
45: extern "C" long FAR PASCAL FrameWndProc(HWND, UINT, WPARAM, LPARAM);
46:
47:
48: extern "C" int PASCAL
49: WinMain(
50: HANDLE hinst,
51: HANDLE hPrevInstance,
52: LPSTR lpCmdLine,
53: int nCmdShow)
54: {
55: MSG msg;
56: int retval;
57: HRESULT hresult;
58:
59: if(!hPrevInstance)
60: if(!InitApplication(hinst))
61: return FALSE;
62:
63: if((hresult = InitOle()) != NOERROR)
64: return FALSE;
65:
66: if(!InitInstance(hinst, nCmdShow)){
67: retval = FALSE;
68: goto LExit;
69: }
70:
71: if(STRSTR(lpCmdLine, "-Embedding"))
72: g_fExitOnLastRelease = TRUE;
73:
74: while(GetMessage(&msg, NULL, NULL, NULL)) {
75: TranslateMessage(&msg);
76: DispatchMessage(&msg);
77: }
78:
79: CPoly::PolyTerm();
80:
81: retval = msg.wParam;
82:
83: LExit:;
84: UninitOle();
85:
86: return retval;
87: }
88:
89:
90: BOOL
91: InitApplication(HANDLE hinst)
92: {
93: WNDCLASS wc;
94:
95: wc.style = CS_HREDRAW | CS_VREDRAW;
96: wc.lpfnWndProc = FrameWndProc;
97: wc.cbClsExtra = 0;
98: wc.cbWndExtra = 0;
99: wc.hInstance = hinst;
100: wc.hIcon = LoadIcon(hinst, "SPOLY");
101: wc.hCursor = LoadCursor(NULL, IDC_ARROW);
102: wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1);
103: wc.lpszMenuName = "SPolyMenu";
104: wc.lpszClassName = g_szFrameWndClass;
105:
106: if(!RegisterClass(&wc))
107: return FALSE;
108:
109: return TRUE;
110: }
111:
112:
113: BOOL
114: InitInstance(HANDLE hinst, int nCmdShow)
115: {
116: g_hinst = hinst;
117:
118: // Create a main frame window
119: //
120: g_hwndFrame = CreateWindow(
121: g_szFrameWndClass,
122: "IDispatch Polygon Server",
123: WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
124: CW_USEDEFAULT,
125: CW_USEDEFAULT,
126: CW_USEDEFAULT,
127: CW_USEDEFAULT,
128: NULL,
129: NULL,
130: hinst,
131: NULL);
132: if(!g_hwndFrame)
133: return FALSE;
134:
135: g_hwndClient = GetWindow(g_hwndFrame, GW_CHILD);
136: if(!g_hwndClient)
137: return FALSE;
138:
139: // create the status bar
140: //
141: g_psb = CStatBar::Create(g_hinst, g_hwndFrame);
142: if(!g_psb)
143: return FALSE;
144:
145: // initialize and show the status bar
146: //
147: g_psb->SetHeight(GetSystemMetrics(SM_CYCAPTION) - 1);
148: g_psb->SetFont(GetStockObject(SYSTEM_FONT));
149: g_psb->SetText("");
150: g_psb->Show();
151:
152: ShowWindow(g_hwndFrame, nCmdShow);
153:
154: UpdateWindow(g_hwndFrame);
155:
156: return TRUE;
157: }
158:
159:
160: void
161: FrameWndOnCreate(HWND hwnd)
162: {
163: CLIENTCREATESTRUCT ccs;
164:
165: ccs.hWindowMenu = NULL;
166: ccs.idFirstChild = IDM_FIRSTCHILD;
167:
168: g_hwndClient = CreateWindow(
169: "MDICLIENT",
170: 0,
171: WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
172: 0, 0, 0, 0,
173: hwnd,
174: (HMENU) 1,
175: g_hinst,
176: &ccs);
177: }
178:
179:
180: void
181: FrameWndOnSize(HWND hwnd)
182: {
183: RECT rc;
184: int height;
185:
186: // Get the client rectangle for the frame window
187: GetClientRect(hwnd, &rc);
188:
189: height = g_psb->GetHeight();
190:
191: // adjust the client win to make room for the status bar.
192: //
193: MoveWindow(
194: g_hwndClient,
195: rc.left,
196: rc.top,
197: rc.right - rc.left,
198: rc.bottom - rc.top - height,
199: TRUE);
200:
201: // move the status bar to the bottom of the newly positioned window.
202: //
203: g_psb->SetX(rc.left);
204: g_psb->SetY(rc.bottom - height),
205: g_psb->SetWidth(rc.right - rc.left);
206: g_psb->Move();
207: }
208:
209:
210: extern "C" long FAR PASCAL
211: FrameWndProc(
212: HWND hwnd,
213: UINT message,
214: WPARAM wParam,
215: LPARAM lParam)
216: {
217: switch(message){
218: case WM_COMMAND:
219: switch(wParam){
220: case IDM_DUMP:
221: CPoly::PolyDump();
222: return 0;
223:
224: case IDM_CLEAR:
225: InvalidateRect(g_hwndClient, NULL, TRUE);
226: return 0;
227: }
228: break;
229:
230: case WM_CREATE:
231: FrameWndOnCreate(hwnd);
232: break;
233:
234: case WM_SIZE:
235: FrameWndOnSize(hwnd);
236: return 1;
237:
238: case WM_PAINT:
239: CPoly::PolyDraw();
240: break;
241:
242: case WM_CLOSE:
243: DestroyWindow(hwnd);
244: return 0;
245:
246: case WM_DESTROY:
247: PostQuitMessage(0);
248: return 0;
249: }
250: return DefFrameProc(hwnd, g_hwndClient, message, wParam, lParam);
251: }
252:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.