#include "StdAfx.h"
#include "mywindow.h"
#include "GraphicObject.h"
CMyWindow::CMyWindow(void)
{
ZeroMemory(m_apGO,sizeof(m_apGO));
}
CMyWindow::~CMyWindow(void)
{
}
BOOL CMyWindow::OnCreate(LPCREATESTRUCT pCS)
{
HDC hDC = GetDC(m_hWnd);
if ( hDC )
{
m_dcMem.CreateDC(hDC,pCS->cx+1,pCS->cy+1);
::ReleaseDC(m_hWnd,hDC);
}
return TRUE;
}
MS_START_MSG_MAP(CMyWindow,CVsWindow)
MS_MSG(WM_SIZE,OnSize)
MS_MSG(WM_ERASEBKGND,OnErazeBk)
MS_MSG(WM_KEYDOWN,OnKeyDown)
MS_END_MSG_MAP()
LONG CMyWindow::OnSize( WPARAM wFlag, LPARAM lSize )
{
if ( wFlag != SIZE_MAXHIDE &&
wFlag != SIZE_MINIMIZED )
{
HDC hDC = GetDC(m_hWnd);
if ( hDC )
{
int iCX = LOWORD(lSize)+1;
int iCY = HIWORD(lSize)+1;
m_dcMem.CreateDC( hDC, iCX, iCY );
ReleaseDC(m_hWnd,hDC);
}
}
return 0;
}
LONG CMyWindow::OnErazeBk( WPARAM, LPARAM )
{
return TRUE;
}
void CMyWindow::OnPaint(HDC hDC)
{
RECT rc;
GetClientRect(m_hWnd,&rc);
HDC hMemDC = m_dcMem.GetDC();
if ( hMemDC )
{
//::PatBlt( hMemDC,0,0,rc.right, rc.bottom,WHITENESS );
::FillRect(hMemDC, &rc, (HBRUSH)GetStockObject(LTGRAY_BRUSH) );
for( int i(0); i < m_ciMaxGraphicObjects; i ++ )
{
if ( m_apGO[i] )
{
m_apGO[i]->Draw(hMemDC);
}
}
::BitBlt( hDC, 0, 0, rc.right, rc.bottom, hMemDC, 0, 0, SRCCOPY );
return;
}
::PatBlt( hDC,0,0,rc.right, rc.bottom,WHITENESS );
}
void CMyWindow::AddObject(CGraphicObject* pGO)
{
for( int i(0); i < m_ciMaxGraphicObjects; i ++ )
{
if ( m_apGO[i] == NULL)
{
m_apGO[i] = pGO;
return;
}
}
}
LONG CMyWindow::OnKeyDown(WPARAM wCode, LPARAM lFlags)
{
BOOL bNeedUpdate = 0;
for( int i(0); i < m_ciMaxGraphicObjects; i ++ )
{
if ( m_apGO[i] )
{
bNeedUpdate |= m_apGO[i]->UserAction( WM_KEYDOWN, (LPVOID)wCode );
}
else
{
break;
}
}
if ( bNeedUpdate )
{
this->Invalidate();
}
return (LONG)::DefWindowProc(m_hWnd,WM_KEYDOWN,wCode,lFlags);
}