home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / gdi / gdidemo / xform.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  7KB  |  292 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 Microsoft Corporation.
  5. *       All rights reserved. 
  6. *       This source code is only intended as a supplement to 
  7. *       Microsoft Development Tools and/or WinHelp documentation.
  8. *       See these sources for detailed information regarding the 
  9. *       Microsoft samples programs.
  10. \******************************************************************************/
  11.  
  12. /*-------------------------------------------------------------------------*\
  13. | XFORM MODULE
  14. \*---------------------------------------------------------------------------*/
  15.  
  16. #include <windows.h>
  17. #include "gdidemo.h"
  18. #include "xform.h"
  19.  
  20. VOID ResetXForm(HWND);
  21. VOID DrawXForm(HWND);
  22.  
  23.  
  24. /*---------------------------------------------------------------------------*\
  25. | CREATE XFORM WINDOW PROCEDURE
  26. \*---------------------------------------------------------------------------*/
  27. HWND FAR CreateXFormWindow(HWND hWndClient, int nItem)
  28. {
  29.     HANDLE          hInstance;
  30.     MDICREATESTRUCT mcs;
  31.     static char buffer[256];
  32.  
  33.  
  34.     hInstance = GETINSTANCE(hWndClient);
  35.     LoadString (hInstance, XFORMTITLE, buffer, 256);
  36.  
  37.     /*
  38.     ** Initialize the MDI create struct for creation of the
  39.     ** test window.
  40.     */
  41.     mcs.szClass = XFORMCLASS;
  42.     mcs.szTitle = buffer;
  43.     mcs.hOwner  = hInstance;
  44.     mcs.x       = CW_USEDEFAULT;
  45.     mcs.y       = CW_USEDEFAULT;
  46.     mcs.cx      = CW_USEDEFAULT;
  47.     mcs.cy      = CW_USEDEFAULT;
  48.     mcs.style   = 0l;
  49.     mcs.lParam  = (LONG)nItem;
  50.  
  51.     return((HWND)SendMessage(hWndClient,WM_MDICREATE,0,(LONG)(LPMDICREATESTRUCT)&mcs));
  52. }
  53.  
  54.  
  55. /*---------------------------------------------------------------------------*\
  56. | XFORM WINDOW PROCEDURE
  57. \*---------------------------------------------------------------------------*/
  58. LONG APIENTRY XFormProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam)
  59. {
  60.     switch(wMsg)
  61.     {
  62.         case WM_CREATE:
  63.             XFormCreateProc(hWnd);
  64.             break;
  65.  
  66.  
  67.         case WM_MOVE:
  68.             ResetXForm(hWnd);
  69.             break;
  70.  
  71.  
  72.         case WM_TIMER:
  73.             DrawXForm(hWnd);
  74.             break;
  75.  
  76.  
  77.         case WM_COMMAND:
  78.             XFormCommandProc(hWnd,wParam,lParam);
  79.             break;
  80.  
  81.  
  82.         case WM_PAINT:
  83.             XFormPaintProc(hWnd);
  84.             break;
  85.  
  86.  
  87.         case WM_DESTROY:
  88.             XFormDestroyProc(hWnd);
  89.             break;
  90.  
  91.  
  92.         default:
  93.             return(DefMDIChildProc(hWnd,wMsg,wParam,lParam));
  94.     }
  95.     return(0l);
  96. }
  97.  
  98.  
  99. /*---------------------------------------------------------------------------*\
  100. | XFORM CREATE PROCEDURE
  101. \*---------------------------------------------------------------------------*/
  102. BOOL XFormCreateProc(HWND hWnd)
  103. {
  104.     PXFORMDATA pxd;
  105.  
  106. #ifndef NOT_IMPLEMENTED
  107.  
  108.     RECT       rect;
  109.     int        dx,dy;
  110.  
  111. #endif
  112.  
  113.     if(AllocWindowInfo(hWnd,sizeof(XFORMDATA)))
  114.     {
  115.         if(pxd = (PXFORMDATA)LockWindowInfo(hWnd))
  116.         {
  117.  
  118. #ifndef NOT_IMPLEMENTED
  119.  
  120.             GetClientRect(hWnd,&rect);
  121.  
  122.             dx = (rect.right + rect.left) >> 4;
  123.             dy = (rect.bottom + rect.top) >> 4;
  124.  
  125.             pxd->pObject[0].x = dx << 1;
  126.             pxd->pObject[0].y = 0;
  127.             pxd->pObject[1].x = dx;
  128.             pxd->pObject[1].y = dy;
  129.             pxd->pObject[2].x = 0;
  130.             pxd->pObject[2].y = dy;
  131.             pxd->pObject[3].x = dx << 1;
  132.             pxd->pObject[3].y = 0;
  133.             pxd->nObject      = 4;
  134.  
  135.             pxd->xForm.eM11 = (float) 0.866;
  136.             pxd->xForm.eM12 = (float) 0.5;
  137.             pxd->xForm.eM21 = (float)-0.5;
  138.             pxd->xForm.eM22 = (float) 0.866;
  139.             pxd->xForm.eDx  = (float) 0;
  140.             pxd->xForm.eDy  = (float) 0;
  141.  
  142. #endif
  143.  
  144.             UnlockWindowInfo(hWnd);
  145.  
  146.             SetTimer(hWnd,1,500,NULL);
  147.  
  148.             return(TRUE);
  149.         }
  150.         FreeWindowInfo(hWnd);
  151.     }
  152.     return(FALSE);
  153. }
  154.  
  155.  
  156. /*---------------------------------------------------------------------------*\
  157. | XFORM COMMAND PROCEDURE
  158. \*---------------------------------------------------------------------------*/
  159. BOOL XFormCommandProc(HWND hWnd, WPARAM wParam, LONG lParam)
  160. {
  161.     hWnd   = hWnd;
  162.     wParam = wParam;
  163.     lParam = lParam;
  164.  
  165.     return(TRUE);
  166. }
  167.  
  168.  
  169. /*---------------------------------------------------------------------------*\
  170. | XFORM PAINT PROCEDURE
  171. \*---------------------------------------------------------------------------*/
  172. VOID XFormPaintProc(HWND hWnd)
  173. {
  174.     HDC         hDC;
  175.     PAINTSTRUCT ps;
  176.  
  177.  
  178.     if(hDC = BeginPaint(hWnd,&ps))
  179.         EndPaint(hWnd,&ps);
  180.  
  181.     ResetXForm(hWnd);
  182.  
  183.     return;
  184. }
  185.  
  186.  
  187. /*---------------------------------------------------------------------------*\
  188. | XFORM DESTROY PROCEDURE
  189. \*---------------------------------------------------------------------------*/
  190. VOID XFormDestroyProc(HWND hWnd)
  191. {
  192.     KillTimer(hWnd,1);
  193.     FreeWindowInfo(hWnd);
  194.     return;
  195. }
  196.  
  197.  
  198.  
  199. VOID ResetXForm(HWND hWnd)
  200. {
  201.     PXFORMDATA pxd;
  202.     HDC        hDC;
  203.  
  204. #ifndef NOT_IMPLEMENTED
  205.  
  206.     RECT       rect;
  207.  
  208. #endif
  209.  
  210.  
  211.     if(pxd = (PXFORMDATA)LockWindowInfo(hWnd))
  212.     {
  213.         if(hDC = GetDC(hWnd))
  214.         {
  215.  
  216. #ifndef NOT_IMPLEMENTED
  217.  
  218.             GetClientRect(hWnd,&rect);
  219.             BitBlt(hDC,0,0,rect.right,rect.bottom,(HDC)0,0,0,0);
  220.  
  221.             SetViewportOrgEx(hDC,rect.right >> 1,rect.bottom >> 1,NULL);
  222.             SetWorldTransform(hDC,(LPXFORM)&pxd->xForm);
  223.             Polyline(hDC,pxd->pObject,pxd->nObject);
  224.             ModifyWorldTransform(hDC,(LPXFORM)&pxd->xForm,MWT_IDENTITY);
  225.  
  226.  
  227.             // I have to put this in since GDI currently doesn't
  228.             // reset the drawing attributes -- 5/24/91
  229.             //
  230.             SetViewportOrgEx(hDC,0,0,NULL);
  231.  
  232. #endif
  233.  
  234.             ReleaseDC(hWnd,hDC);
  235.         }
  236.         UnlockWindowInfo(hWnd);
  237.     }
  238.     return;
  239. }
  240.  
  241.  
  242. VOID DrawXForm(HWND hWnd)
  243. {
  244.     PXFORMDATA pxd;
  245.     HDC        hDC;
  246. #ifndef NOT_IMPLEMENTED
  247.     XFORM      xForm;
  248.     RECT       rect;
  249. #endif
  250.  
  251.  
  252.     if(pxd = (PXFORMDATA)LockWindowInfo(hWnd))
  253.     {
  254.         if(hDC = GetDC(hWnd))
  255.         {
  256.  
  257. #ifndef NOT_IMPLEMENTED
  258.  
  259.             GetClientRect(hWnd,&rect);
  260.             SetViewportOrgEx(hDC,rect.right >> 1, rect.bottom >> 1,NULL);
  261.  
  262.  
  263.             SetWorldTransform(hDC,(LPXFORM)&pxd->xForm);
  264.             Polyline(hDC,pxd->pObject,pxd->nObject);
  265.  
  266.             ModifyWorldTransform(hDC,(LPXFORM)&pxd->xForm,MWT_RIGHTMULTIPLY);
  267.             Polyline(hDC,pxd->pObject,pxd->nObject);
  268.  
  269.             GetWorldTransform(hDC,(LPXFORM)&xForm);
  270.             pxd->xForm.eM11 = xForm.eM11;
  271.             pxd->xForm.eM12 = xForm.eM12;
  272.             pxd->xForm.eM21 = xForm.eM21;
  273.             pxd->xForm.eM22 = xForm.eM22;
  274.             pxd->xForm.eDx  = xForm.eDx;
  275.             pxd->xForm.eDy  = xForm.eDy;
  276.  
  277.             ModifyWorldTransform(hDC,(LPXFORM)&pxd->xForm,MWT_IDENTITY);
  278.  
  279.  
  280.             // I have to put this in since GDI currently doesn't
  281.             // reset the drawing attributes -- 5/24/91
  282.             //
  283.             SetViewportOrgEx(hDC,0,0,NULL);
  284.  
  285. #endif
  286.             ReleaseDC(hWnd,hDC);
  287.         }
  288.         UnlockWindowInfo(hWnd);
  289.     }
  290.     return;
  291. }
  292.