/******************************************************************************\
* This is a part of the Microsoft Source Code Samples.
* Copyright 1993 - 1998 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/
/*-------------------------------------------------------------------------*\
| XFORM MODULE
\*---------------------------------------------------------------------------*/
#include <windows.h>
#include "gdidemo.h"
#include "xform.h"
VOID ResetXForm(HWND);
VOID DrawXForm(HWND);
/*---------------------------------------------------------------------------*\
| CREATE XFORM WINDOW PROCEDURE
\*---------------------------------------------------------------------------*/
HWND FAR CreateXFormWindow(HWND hWndClient, int nItem)
{
HANDLE hInstance;
MDICREATESTRUCT mcs;
static char buffer[256];
hInstance = GETINSTANCE(hWndClient);
LoadString (hInstance, XFORMTITLE, buffer, 256);
/*
** Initialize the MDI create struct for creation of the
** test window.
*/
mcs.szClass = XFORMCLASS;
mcs.szTitle = buffer;
mcs.hOwner = hInstance;
mcs.x = CW_USEDEFAULT;
mcs.y = CW_USEDEFAULT;
mcs.cx = CW_USEDEFAULT;
mcs.cy = CW_USEDEFAULT;
mcs.style = 0l;
mcs.lParam = (LONG)nItem;
return((HWND)SendMessage(hWndClient,WM_MDICREATE,0,(LONG)(LPMDICREATESTRUCT)&mcs));
}
/*---------------------------------------------------------------------------*\
| XFORM WINDOW PROCEDURE
\*---------------------------------------------------------------------------*/
LONG APIENTRY XFormProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam)
{
switch(wMsg)
{
case WM_CREATE:
XFormCreateProc(hWnd);
break;
case WM_MOVE:
ResetXForm(hWnd);
break;
case WM_TIMER:
DrawXForm(hWnd);
break;
case WM_COMMAND:
XFormCommandProc(hWnd,wParam,lParam);
break;
case WM_PAINT:
XFormPaintProc(hWnd);
break;
case WM_DESTROY:
XFormDestroyProc(hWnd);
break;
default:
return(DefMDIChildProc(hWnd,wMsg,wParam,lParam));
}
return(0l);
}
/*---------------------------------------------------------------------------*\
| XFORM CREATE PROCEDURE
\*---------------------------------------------------------------------------*/
BOOL XFormCreateProc(HWND hWnd)
{
PXFORMDATA pxd;
#ifndef NOT_IMPLEMENTED
RECT rect;
int dx,dy;
#endif
if(AllocWindowInfo(hWnd,sizeof(XFORMDATA)))
{
if(pxd = (PXFORMDATA)LockWindowInfo(hWnd))
{
#ifndef NOT_IMPLEMENTED
GetClientRect(hWnd,&rect);
dx = (rect.right + rect.left) >> 4;
dy = (rect.bottom + rect.top) >> 4;
pxd->pObject[0].x = dx << 1;
pxd->pObject[0].y = 0;
pxd->pObject[1].x = dx;
pxd->pObject[1].y = dy;
pxd->pObject[2].x = 0;
pxd->pObject[2].y = dy;
pxd->pObject[3].x = dx << 1;
pxd->pObject[3].y = 0;
pxd->nObject = 4;
pxd->xForm.eM11 = (float) 0.866;
pxd->xForm.eM12 = (float) 0.5;
pxd->xForm.eM21 = (float)-0.5;
pxd->xForm.eM22 = (float) 0.866;
pxd->xForm.eDx = (float) 0;
pxd->xForm.eDy = (float) 0;
#endif
UnlockWindowInfo(hWnd);
SetTimer(hWnd,1,500,NULL);
return(TRUE);
}
FreeWindowInfo(hWnd);
}
return(FALSE);
}
/*---------------------------------------------------------------------------*\
| XFORM COMMAND PROCEDURE
\*---------------------------------------------------------------------------*/
BOOL XFormCommandProc(HWND hWnd, WPARAM wParam, LONG lParam)
{
hWnd = hWnd;
wParam = wParam;
lParam = lParam;
return(TRUE);
}
/*---------------------------------------------------------------------------*\
| XFORM PAINT PROCEDURE
\*---------------------------------------------------------------------------*/
VOID XFormPaintProc(HWND hWnd)
{
HDC hDC;
PAINTSTRUCT ps;
if(hDC = BeginPaint(hWnd,&ps))
EndPaint(hWnd,&ps);
ResetXForm(hWnd);
return;
}
/*---------------------------------------------------------------------------*\
| XFORM DESTROY PROCEDURE
\*---------------------------------------------------------------------------*/
VOID XFormDestroyProc(HWND hWnd)
{
KillTimer(hWnd,1);
FreeWindowInfo(hWnd);
return;
}
VOID ResetXForm(HWND hWnd)
{
PXFORMDATA pxd;
HDC hDC;
#ifndef NOT_IMPLEMENTED
RECT rect;
#endif
if(pxd = (PXFORMDATA)LockWindowInfo(hWnd))
{
if(hDC = GetDC(hWnd))
{
#ifndef NOT_IMPLEMENTED
GetClientRect(hWnd,&rect);
BitBlt(hDC,0,0,rect.right,rect.bottom,(HDC)0,0,0,0);
SetViewportOrgEx(hDC,rect.right >> 1,rect.bottom >> 1,NULL);
SetWorldTransform(hDC,(LPXFORM)&pxd->xForm);
Polyline(hDC,pxd->pObject,pxd->nObject);
ModifyWorldTransform(hDC,(LPXFORM)&pxd->xForm,MWT_IDENTITY);
// I have to put this in since GDI currently doesn't
// reset the drawing attributes -- 5/24/91
//
SetViewportOrgEx(hDC,0,0,NULL);
#endif
ReleaseDC(hWnd,hDC);
}
UnlockWindowInfo(hWnd);
}
return;
}
VOID DrawXForm(HWND hWnd)
{
PXFORMDATA pxd;
HDC hDC;
#ifndef NOT_IMPLEMENTED
XFORM xForm;
RECT rect;
#endif
if(pxd = (PXFORMDATA)LockWindowInfo(hWnd))
{
if(hDC = GetDC(hWnd))
{
#ifndef NOT_IMPLEMENTED
GetClientRect(hWnd,&rect);
SetViewportOrgEx(hDC,rect.right >> 1, rect.bottom >> 1,NULL);
SetWorldTransform(hDC,(LPXFORM)&pxd->xForm);
Polyline(hDC,pxd->pObject,pxd->nObject);
ModifyWorldTransform(hDC,(LPXFORM)&pxd->xForm,MWT_RIGHTMULTIPLY);
Polyline(hDC,pxd->pObject,pxd->nObject);
GetWorldTransform(hDC,(LPXFORM)&xForm);
pxd->xForm.eM11 = xForm.eM11;
pxd->xForm.eM12 = xForm.eM12;
pxd->xForm.eM21 = xForm.eM21;
pxd->xForm.eM22 = xForm.eM22;
pxd->xForm.eDx = xForm.eDx;
pxd->xForm.eDy = xForm.eDy;
ModifyWorldTransform(hDC,(LPXFORM)&pxd->xForm,MWT_IDENTITY);
// I have to put this in since GDI currently doesn't
// reset the drawing attributes -- 5/24/91
//
SetViewportOrgEx(hDC,0,0,NULL);
#endif
ReleaseDC(hWnd,hDC);
}
UnlockWindowInfo(hWnd);
}
return;
}