#include "pch.h"
class WindowTopPaneSiteImpl : public TopPaneSite {
private:
PaneWindow* m_pwindow;
public:
WindowTopPaneSiteImpl(PaneWindow* pwindow) :
m_pwindow(pwindow)
{
}
Point TransformLocalToImage(const Point& point)
{
return m_pwindow->TransformLocalToImage(point);
}
void SurfaceChanged()
{
m_pwindow->PaneSurfaceChanged();
}
void SizeChanged()
{
m_pwindow->PaneSizeChanged();
}
};
const WPARAM IDD_SizeChanged = 0;
const WPARAM IDD_SurfaceChanged = 1;
PaneWindow::PaneWindow(
Window* pwindow,
Engine* pengine,
Pane* ppane,
SurfaceType stype
) :
ChildWindow(
pwindow,
WinRect(0, 0, 0, 0)
),
m_pengine(pengine)
{
m_ptopPane =
new TopPane(
pengine,
stype,
false,
new WindowTopPaneSiteImpl(this),
ppane
);
SetMouseInput(m_ptopPane);
UpdateSize();
}
void PaneWindow::SetPane(Pane* ppane)
{
m_ptopPane->RemoveAllChildren();
m_ptopPane->InsertAtTop(ppane);
UpdateSize();
}
Point PaneWindow::TransformLocalToImage(const Point& point)
{
return point;
}
void PaneWindow::UpdateSize()
{
SetClientSize(m_ptopPane->GetSurfaceSize());
}
void PaneWindow::PaneSizeChanged()
{
PostMessage(WM_COMMAND, IDD_SizeChanged, 0);
}
void PaneWindow::PaneSurfaceChanged()
{
PostMessage(WM_COMMAND, IDD_SurfaceChanged, 0);
}
bool PaneWindow::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch(wParam) {
case IDD_SizeChanged:
UpdateSize();
return true;
case IDD_SurfaceChanged:
HDC hdc = GetDC();
OnPaint(hdc, WinRect(WinPoint(0, 0), GetClientRect().Size()));
ReleaseDC(hdc);
return true;
}
return false;
}
void PaneWindow::OnPaint(HDC hdc, const WinRect& rect)
{
Surface* psurface = m_ptopPane->GetSurface();
m_pengine->BltToWindow(
this,
WinPoint(0, 0),
psurface,
WinRect(
WinPoint(0, 0),
psurface->GetSize()
)
);
}