home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / oleaut / spoly / winmain.cpp < prev   
C/C++ Source or Header  |  1997-10-05  |  6KB  |  299 lines

  1. /*** 
  2. *winmain.cpp
  3. *
  4. *  This is a part of the Microsoft Source Code Samples.
  5. *
  6. *  Copyright (C) 1992-1997 Microsoft Corporation. All rights reserved.
  7. *
  8. *  This source code is only intended as a supplement to Microsoft Development
  9. *  Tools and/or WinHelp documentation.  See these sources for detailed
  10. *  information regarding the Microsoft samples programs.
  11. *
  12. *Purpose:
  13. *  This module is the main entry point for the sample IDispatch polygon
  14. *  server, spoly.exe.
  15. *
  16. *  This program is intended to demonstrate an implementation of the IDispatch
  17. *  interface. Spoly is a very simple app, that implements two simple objects,
  18. *  CPoly and CPoint and exposes their properties and methods for programatic
  19. *  and cross-process access via IDispatch.
  20. *
  21. *Implementation Notes:
  22. *
  23. *****************************************************************************/
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27.  
  28. #include "spoly.h"
  29. #include "cpoint.h"
  30. #include "cpoly.h"
  31.  
  32.  
  33. HINSTANCE g_hinst = 0;
  34.  
  35. HWND g_hwndFrame = 0;
  36. HWND g_hwndClient = 0;
  37.  
  38. TCHAR g_szFrameWndClass[] = TSTR("FrameWClass");
  39.  
  40. CStatBar FAR* g_psb = NULL;
  41.  
  42.  
  43. BOOL InitApplication(HINSTANCE);
  44. BOOL InitInstance(HINSTANCE, int);
  45.  
  46. extern "C" int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
  47. extern "C" long FAR PASCAL FrameWndProc(HWND, UINT, WPARAM, LPARAM);
  48.  
  49.  
  50. extern "C" int PASCAL
  51. WinMain(
  52.     HINSTANCE hinst,
  53.     HINSTANCE hPrevInstance,
  54.     LPSTR lpCmdLine,
  55.     int nCmdShow)
  56. {
  57.     MSG msg;
  58.     int retval;
  59.     HRESULT hresult;
  60.  
  61.     if(!hPrevInstance)
  62.       if(!InitApplication(hinst))
  63.     return FALSE;
  64.  
  65.     if((hresult = InitOle()) != NOERROR)
  66.       return FALSE;
  67.  
  68.     if(!InitInstance(hinst, nCmdShow)){
  69.       retval = FALSE;
  70.       goto LExit;
  71.     }
  72.  
  73.     while(GetMessage(&msg, NULL, NULL, NULL)) {
  74.       TranslateMessage(&msg);
  75.       DispatchMessage(&msg);
  76.     }
  77.  
  78.     g_psb->Release();
  79.     CPoly::PolyTerm();
  80.  
  81.     retval = msg.wParam;
  82.  
  83. LExit:;
  84.     UninitOle();
  85.  
  86.     return retval;
  87. }
  88.  
  89.  
  90. BOOL
  91. InitApplication(HINSTANCE 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, TSTR("SPOLY"));
  101.     wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
  102.     wc.hbrBackground    = (HBRUSH) (COLOR_APPWORKSPACE+1);
  103.     wc.lpszMenuName    = TSTR("SPolyMenu");
  104.     wc.lpszClassName    = g_szFrameWndClass;
  105.  
  106.     if(!RegisterClass(&wc))
  107.       return FALSE;
  108.  
  109.     return TRUE;
  110. }
  111.  
  112. #ifdef WIN32
  113. #define szAppTitle TSTR("IDispatch Polygon Server (32-bit)")
  114. #else //WIN32
  115. #define szAppTitle TSTR("IDispatch Polygon Server")
  116. #endif //WIN32
  117.  
  118. BOOL
  119. InitInstance(HINSTANCE hinst, int nCmdShow)
  120. {
  121.     g_hinst = hinst;
  122.  
  123.     // Create a main frame window
  124.     //
  125.     g_hwndFrame = CreateWindow(
  126.       g_szFrameWndClass,
  127.       szAppTitle,
  128.       WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  129.       CW_USEDEFAULT,
  130.       CW_USEDEFAULT,
  131.       CW_USEDEFAULT,
  132.       CW_USEDEFAULT,
  133.       NULL,
  134.       NULL,
  135.       hinst,
  136.       NULL);
  137.     if(!g_hwndFrame)
  138.       return FALSE;
  139.  
  140.     g_hwndClient = GetWindow(g_hwndFrame, GW_CHILD);
  141.     if(!g_hwndClient)
  142.       return FALSE;
  143.  
  144.     // create the status bar
  145.     //
  146.     g_psb = CStatBar::Create(g_hinst, g_hwndFrame);
  147.     if(!g_psb)
  148.       return FALSE;
  149.  
  150.     // initialize and show the status bar
  151.     //
  152.     g_psb->SetHeight(GetSystemMetrics(SM_CYCAPTION) - 1);
  153.     g_psb->SetFont((HFONT)GetStockObject(SYSTEM_FONT));
  154.     g_psb->SetText(OLESTR(""));
  155.     g_psb->Show();
  156.  
  157.     ShowWindow(g_hwndFrame, nCmdShow);
  158.  
  159.     UpdateWindow(g_hwndFrame);
  160.  
  161.     return TRUE;
  162. }
  163.  
  164.  
  165. void
  166. FrameWndOnCreate(HWND hwnd)
  167. {
  168.     CLIENTCREATESTRUCT ccs;
  169.  
  170.     ccs.hWindowMenu = NULL;
  171.     ccs.idFirstChild = IDM_FIRSTCHILD;
  172.  
  173.     g_hwndClient = CreateWindow(
  174.       TSTR("MDICLIENT"),
  175.       0,
  176.       WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
  177.       0, 0, 0, 0,
  178.       hwnd,
  179.       (HMENU) 1,
  180.       g_hinst,
  181.       &ccs);
  182. }
  183.  
  184.  
  185. void
  186. FrameWndOnSize(HWND hwnd)
  187. {
  188.     RECT rc;
  189.     int height;
  190.  
  191.     // Get the client rectangle for the frame window
  192.     GetClientRect(hwnd, &rc);
  193.  
  194.     height = g_psb->GetHeight();
  195.  
  196.     // adjust the client win to make room for the status bar.
  197.     //
  198.     MoveWindow(
  199.       g_hwndClient,
  200.       rc.left,
  201.       rc.top,
  202.       rc.right - rc.left,
  203.       rc.bottom - rc.top - height,
  204.       TRUE);
  205.  
  206.     // move the status bar to the bottom of the newly positioned window.
  207.     //
  208.     g_psb->SetX(rc.left);
  209.     g_psb->SetY(rc.bottom - height),
  210.     g_psb->SetWidth(rc.right - rc.left);
  211.     g_psb->Move();
  212. }
  213.  
  214.  
  215. extern "C" long FAR PASCAL
  216. FrameWndProc(
  217.     HWND hwnd,
  218.     UINT message,
  219.     WPARAM wParam,
  220.     LPARAM lParam)
  221. {
  222.     switch(message){
  223.     case WM_COMMAND:
  224.       switch(wParam){
  225.       case IDM_DUMP:
  226.     CPoly::PolyDump();
  227.     return 0;
  228.  
  229.       case IDM_CLEAR:
  230.     InvalidateRect(g_hwndClient, NULL, TRUE);
  231.     return 0;
  232.       }
  233.       break;
  234.  
  235.     case WM_CREATE:
  236.       FrameWndOnCreate(hwnd);
  237.       break;
  238.  
  239.     case WM_SIZE:
  240.       FrameWndOnSize(hwnd);
  241.       return 1;
  242.  
  243.     case WM_PAINT:
  244.       CPoly::PolyDraw();
  245.       break;
  246.  
  247.     case WM_CLOSE:
  248.       DestroyWindow(hwnd);
  249.       return 0;
  250.  
  251.     case WM_DESTROY:
  252.       PostQuitMessage(0);
  253.       return 0;
  254.     }
  255.     return DefFrameProc(hwnd, g_hwndClient, message, wParam, lParam);
  256. }
  257.  
  258.  
  259. #if defined(WIN32)
  260.  
  261. extern "C" OLECHAR FAR*
  262. ConvertStrAtoW(char FAR* strIn, OLECHAR FAR* buf, UINT size)
  263. {
  264.   MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, 
  265.                        strIn, -1, buf, size) ; 
  266.   return buf;
  267. }
  268.  
  269. extern "C" OLECHAR FAR*
  270. WideString(char FAR* strIn)
  271. {
  272.   static OLECHAR buf[256];
  273.   
  274.   return (ConvertStrAtoW(strIn, buf, 256));
  275. }
  276.  
  277. extern "C" char FAR*
  278. ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
  279. {
  280.   int badConversion = FALSE;
  281.   
  282.   WideCharToMultiByte(CP_ACP, NULL, 
  283.                   strIn, -1, 
  284.               buf, size, 
  285.               NULL, &badConversion);
  286.   return buf;
  287. }
  288.  
  289. extern "C" char FAR*
  290. AnsiString(OLECHAR FAR* strIn)
  291. {
  292.   static char buf[256];
  293.   
  294.   return (ConvertStrWtoA(strIn, buf, 256));    
  295. }
  296.  
  297. #endif
  298.  
  299.