191 lines
3.4 KiB
C++
191 lines
3.4 KiB
C++
|
|
// BiomeViewWnd.cpp
|
|
|
|
// Implements the cBiomeViewWnd class representing the window that displays biomes
|
|
|
|
#include "Globals.h"
|
|
#include "BiomeViewWnd.h"
|
|
#include "BiomeCache.h"
|
|
#include "GeneratorBiomeSource.h"
|
|
#include "../iniFile/iniFile.h"
|
|
|
|
|
|
|
|
|
|
|
|
const int TIMER_RERENDER = 1200;
|
|
|
|
|
|
|
|
|
|
|
|
cBiomeViewWnd::cBiomeViewWnd(void) :
|
|
m_Wnd(NULL),
|
|
m_Thunk(&cBiomeViewWnd::WndProc, this),
|
|
m_IsLButtonDown(false)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool cBiomeViewWnd::Create(HWND a_ParentWnd, LPCTSTR a_Title)
|
|
{
|
|
ASSERT(m_Wnd == NULL);
|
|
|
|
// Create a regular STATIC window, then override its window procedure with our own. No need for obnoxious RegisterWindowClass() stuff.
|
|
m_Wnd = CreateWindow("STATIC", a_Title, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 400, 300, a_ParentWnd, NULL, GetModuleHandle(NULL), NULL);
|
|
if (m_Wnd == NULL)
|
|
{
|
|
LOGERROR("Cannot create main window: %d", GetLastError());
|
|
return false;
|
|
}
|
|
SetWindowLongPtr(m_Wnd, GWLP_WNDPROC, m_Thunk);
|
|
|
|
cIniFile IniFile;
|
|
cBiomeGen * BioGen = new cBioGenMultiStepMap(0);
|
|
BioGen->Initialize(IniFile);
|
|
m_Renderer.SetSource(new cGeneratorBiomeSource(BioGen));
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::WndProc(HWND a_Wnd, UINT a_Msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (a_Msg)
|
|
{
|
|
case WM_CLOSE: return OnClose();
|
|
case WM_COMMAND: return OnCommand(wParam, lParam);
|
|
case WM_LBUTTONDOWN: return OnLButtonDown(wParam, lParam);
|
|
case WM_LBUTTONUP: return OnLButtonUp (wParam, lParam);
|
|
case WM_MOUSEMOVE: return OnMouseMove (wParam, lParam);
|
|
case WM_PAINT: return OnPaint();
|
|
case WM_TIMER: return OnTimer(wParam);
|
|
}
|
|
return ::DefWindowProc(a_Wnd, a_Msg, wParam, lParam);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::OnClose(void)
|
|
{
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// TODO: Handle menu commands, when we get menu
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
m_IsLButtonDown = true;
|
|
GetCursorPos(&m_MouseDown);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::OnMouseMove(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (!m_IsLButtonDown)
|
|
{
|
|
return 0;
|
|
}
|
|
POINT pnt;
|
|
GetCursorPos(&pnt);
|
|
m_Renderer.MoveViewBy(pnt.x - m_MouseDown.x, pnt.y - m_MouseDown.y);
|
|
if (m_Renderer.Render(m_Pixmap))
|
|
{
|
|
SetTimer(m_Wnd, TIMER_RERENDER, 200, NULL);
|
|
}
|
|
m_MouseDown = pnt;
|
|
InvalidateRect(m_Wnd, NULL, FALSE);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::OnLButtonUp(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
OnMouseMove(wParam, lParam); // Last movement - if the mouse move hasn't been reported due to speed
|
|
m_IsLButtonDown = false;
|
|
InvalidateRect(m_Wnd, NULL, FALSE);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::OnPaint(void)
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC DC = BeginPaint(m_Wnd, &ps);
|
|
|
|
RECT rc;
|
|
GetClientRect(m_Wnd, &rc);
|
|
int Wid = rc.right - rc.left;
|
|
int Hei = rc.bottom - rc.top;
|
|
if ((m_Pixmap.GetWidth() != Wid) || (m_Pixmap.GetHeight() != Hei))
|
|
{
|
|
m_Pixmap.SetSize(Wid, Hei);
|
|
if (m_Renderer.Render(m_Pixmap))
|
|
{
|
|
SetTimer(m_Wnd, TIMER_RERENDER, 200, NULL);
|
|
}
|
|
}
|
|
|
|
m_Pixmap.DrawToDC(DC, 0, 0);
|
|
|
|
EndPaint(m_Wnd, &ps);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::OnTimer(WPARAM wParam)
|
|
{
|
|
switch (wParam)
|
|
{
|
|
case TIMER_RERENDER:
|
|
{
|
|
if (!m_Renderer.Render(m_Pixmap))
|
|
{
|
|
KillTimer(m_Wnd, TIMER_RERENDER);
|
|
}
|
|
InvalidateRect(m_Wnd, NULL, FALSE);
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|