diff options
Diffstat (limited to 'private/oleauto/sample/spoly2/winmain.cpp')
-rw-r--r-- | private/oleauto/sample/spoly2/winmain.cpp | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/private/oleauto/sample/spoly2/winmain.cpp b/private/oleauto/sample/spoly2/winmain.cpp new file mode 100644 index 000000000..c3c8b9a78 --- /dev/null +++ b/private/oleauto/sample/spoly2/winmain.cpp @@ -0,0 +1,293 @@ +/*** +*winmain.cpp +* +* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved. +* Information Contained Herein Is Proprietary and Confidential. +* +*Purpose: +* This module is the main entry point for the sample IDispatch polygon +* server, spoly2.exe. +* +* This program is intended to demonstrate an implementation of the IDispatch +* interface. Spoly2 is a very simple app, that implements two simple objects, +* CPoly and CPoint and exposes their properties and methods for programatic +* and cross-process access via IDispatch. +* +*Implementation Notes: +* +*****************************************************************************/ + +#include <stdio.h> +#include <string.h> + +#include "spoly.h" +#include "cpoint.h" +#include "cpoly.h" + + +HINSTANCE g_hinst = 0; + +HWND g_hwndFrame = 0; +HWND g_hwndClient = 0; + +TCHAR g_szFrameWndClass[] = TSTR("FrameWClass"); + +CStatBar FAR* g_psb = NULL; + + +BOOL InitApplication(HINSTANCE); +BOOL InitInstance(HINSTANCE, int); + +extern "C" int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int); +extern "C" long FAR PASCAL FrameWndProc(HWND, UINT, WPARAM, LPARAM); + + +extern "C" int PASCAL +WinMain( + HINSTANCE hinst, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + MSG msg; + int retval; + HRESULT hresult; + + if(!hPrevInstance) + if(!InitApplication(hinst)) + return FALSE; + + if((hresult = InitOle()) != NOERROR) + return FALSE; + + if(!InitInstance(hinst, nCmdShow)){ + retval = FALSE; + goto LExit; + } + + while(GetMessage(&msg, NULL, NULL, NULL)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + g_psb->Release(); + CPoly::PolyTerm(); + + retval = msg.wParam; + +LExit:; + UninitOle(); + + return retval; +} + + +BOOL +InitApplication(HINSTANCE hinst) +{ + WNDCLASS wc; + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = FrameWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hinst; + wc.hIcon = LoadIcon(hinst, TSTR("SPOLY")); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1); + wc.lpszMenuName = TSTR("SPolyMenu"); + wc.lpszClassName = g_szFrameWndClass; + + if(!RegisterClass(&wc)) + return FALSE; + + return TRUE; +} + +#ifdef WIN32 +#define szAppTitle TSTR("IDispatch Polygon Server #2 (32-bit)") +#else //WIN32 +#define szAppTitle TSTR("IDispatch Polygon Server #2") +#endif //WIN32 + +BOOL +InitInstance(HINSTANCE hinst, int nCmdShow) +{ + g_hinst = hinst; + + // Create a main frame window + // + g_hwndFrame = CreateWindow( + g_szFrameWndClass, + szAppTitle, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hinst, + NULL); + if(!g_hwndFrame) + return FALSE; + + g_hwndClient = GetWindow(g_hwndFrame, GW_CHILD); + if(!g_hwndClient) + return FALSE; + + // create the status bar + // + g_psb = CStatBar::Create(g_hinst, g_hwndFrame); + if(!g_psb) + return FALSE; + + // initialize and show the status bar + // + g_psb->SetHeight(GetSystemMetrics(SM_CYCAPTION) - 1); + g_psb->SetFont((HFONT)GetStockObject(SYSTEM_FONT)); + g_psb->SetText(OLESTR("")); + g_psb->Show(); + + ShowWindow(g_hwndFrame, nCmdShow); + + UpdateWindow(g_hwndFrame); + + return TRUE; +} + + +void +FrameWndOnCreate(HWND hwnd) +{ + CLIENTCREATESTRUCT ccs; + + ccs.hWindowMenu = NULL; + ccs.idFirstChild = IDM_FIRSTCHILD; + + g_hwndClient = CreateWindow( + TSTR("MDICLIENT"), + 0, + WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, + 0, 0, 0, 0, + hwnd, + (HMENU) 1, + g_hinst, + &ccs); +} + + +void +FrameWndOnSize(HWND hwnd) +{ + RECT rc; + int height; + + // Get the client rectangle for the frame window + GetClientRect(hwnd, &rc); + + height = g_psb->GetHeight(); + + // adjust the client win to make room for the status bar. + // + MoveWindow( + g_hwndClient, + rc.left, + rc.top, + rc.right - rc.left, + rc.bottom - rc.top - height, + TRUE); + + // move the status bar to the bottom of the newly positioned window. + // + g_psb->SetX(rc.left); + g_psb->SetY(rc.bottom - height), + g_psb->SetWidth(rc.right - rc.left); + g_psb->Move(); +} + + +extern "C" long FAR PASCAL +FrameWndProc( + HWND hwnd, + UINT message, + WPARAM wParam, + LPARAM lParam) +{ + switch(message){ + case WM_COMMAND: + switch(wParam){ + case IDM_DUMP: + CPoly::PolyDump(); + return 0; + + case IDM_CLEAR: + InvalidateRect(g_hwndClient, NULL, TRUE); + return 0; + } + break; + + case WM_CREATE: + FrameWndOnCreate(hwnd); + break; + + case WM_SIZE: + FrameWndOnSize(hwnd); + return 1; + + case WM_PAINT: + CPoly::PolyDraw(); + break; + + case WM_CLOSE: + DestroyWindow(hwnd); + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + return DefFrameProc(hwnd, g_hwndClient, message, wParam, lParam); +} + + +#if defined(WIN32) + +extern "C" OLECHAR FAR* +ConvertStrAtoW(char FAR* strIn, OLECHAR FAR* buf, UINT size) +{ + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, + strIn, -1, buf, size) ; + return buf; +} + +extern "C" OLECHAR FAR* +WideString(char FAR* strIn) +{ + static OLECHAR buf[256]; + + return (ConvertStrAtoW(strIn, buf, 256)); +} + +extern "C" char FAR* +ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size) +{ + int badConversion = FALSE; + + WideCharToMultiByte(CP_ACP, NULL, + strIn, -1, + buf, size, + NULL, &badConversion); + return buf; +} + +extern "C" char FAR* +AnsiString(OLECHAR FAR* strIn) +{ + static char buf[256]; + + return (ConvertStrWtoA(strIn, buf, 256)); +} + +#endif + |