实现一个画板容器控件用来放置元素对象。
#pragma once
#include "CRulerBar.h"
class CPaletteContainer : public SWindow
{
DEF_SOBJECT(SWindow, L"palettecontainer")
public:
CPaletteContainer(void);
~CPaletteContainer(void);
protected:
void OnPaint(IRenderTarget* pRT);
void OnMouseMove(UINT nFlags, SOUI::CPoint point);
void OnLButtonDown(UINT nFlags, SOUI::CPoint point);
void OnLButtonUp(UINT nFlags, SOUI::CPoint point);
SOUI_MSG_MAP_BEGIN()
MSG_WM_PAINT_EX(OnPaint)
MSG_WM_MOUSEMOVE(OnMouseMove)
MSG_WM_LBUTTONDOWN(OnLButtonDown)
MSG_WM_LBUTTONUP(OnLButtonUp)
SOUI_MSG_MAP_END()
SOUI_ATTRS_BEGIN()
SOUI_ATTRS_END()
private:
CRulerBar* m_pLeftBar; //左标尺
CRulerBar* m_pTopBar; //上标尺
int m_nPix2CM;
SOUI::CPoint m_ptDown; //鼠标按下的位置
SOUI::CRect m_rcDrawArea; //鼠标移动区域
bool m_bCrossLine; //是否绘制网格线
};
#include "stdafx.h"
#include "CPaletteContainer.h"
CPaletteContainer::CPaletteContainer(void)
{
m_pLeftBar = NULL;
m_pTopBar = NULL;
m_nPix2CM = 20;
m_bCrossLine = true;
}
CPaletteContainer::~CPaletteContainer(void)
{
}
void CPaletteContainer::OnPaint(IRenderTarget* pRT)
{
SetMsgHandled(FALSE);
pRT->SetAntiAlias(FALSE);
CRect rcClient = GetClientRect();
if (m_bCrossLine)
{
//draw cross lines
CAutoRefPtr<IPen> pen, oldpen;
pRT->CreatePen(PS_DASHDOT, RGBA(0, 0, 0, 60), 1, &pen);
pRT->SelectObject(pen, (IRenderObj**)&oldpen);
//draw h lines
for (int i = 1; i < 100; i++)
{
CPoint pts[2];
pts[0].x = rcClient.left;
pts[0].y = rcClient.top + i * m_nPix2CM;
pts[1].x = rcClient.right;
pts[1].y = rcClient.top + i * m_nPix2CM;
pRT->DrawLines(pts, 2);
}
//draw v lines
for (int i = 1; i < 100; i++)
{
CPoint pts[2];
pts[0].x = rcClient.left + i * m_nPix2CM;
pts[0].y = rcClient.top;
pts[1].x = rcClient.left + i * m_nPix2CM;
pts[1].y = rcClient.bottom;
pRT->DrawLines(pts, 2);
}
pRT->SelectObject(oldpen, NULL);
}
}
void CPaletteContainer::OnMouseMove(UINT nFlags, SOUI::CPoint point)
{
SetMsgHandled(FALSE);
CPoint ptVeriner(point);
if ((nFlags & MK_LBUTTON))
{
if (!m_rcDrawArea.IsRectEmpty())
m_rcDrawArea.SetRectEmpty();
if (m_ptDown == point)
return;
}
Invalidate();
}
void CPaletteContainer::OnLButtonDown(UINT nFlags, SOUI::CPoint point)
{
std::ostringstream os;
SetMsgHandled(FALSE);
SetCapture();
m_ptDown = point;
CRect rcContainer = GetClientRect();
}
void CPaletteContainer::OnLButtonUp(UINT nFlags, SOUI::CPoint point)
{
SetMsgHandled(FALSE);
ReleaseCapture();
Invalidate();
}
注册控件
m_theApp->RegisterWindowClass<CPaletteContainer>();
在布局中使用控件
<caption pos="[0,{0,-0,-0" colorBkgnd="#FFFFFF" font="face:微软雅黑,size:10">
<caption pos="0,0,@40,@40">
<text pos="|0,|0" offset="-0.5,-0.5" >cm</text>
</caption>
<!--顶部游标-->
<caption pos="40,0,-0,@40" colorBkgnd="#FFFFFF">
<scrollview name="scrollview_topruler" pos="0,0,-0,-0" viewSize="-1,-1" sbwid="0" scrollSpeed="40" >
<rulerbar name="ruler_top" pos="0,0,@2000,@40" bar_position="0"></rulerbar>
</scrollview>
</caption>
<!--左侧游标-->
<caption pos="0,40,@40,-0" colorBkgnd="#FFFFFF">
<scrollview name="scrollview_leftruler" pos="0,0,-0,-0" viewSize="-1,-1" sbwid="0" scrollSpeed="40" >
<rulerbar name="ruler_left" pos="0,0,@40,@2000" bar_position="3"></rulerbar>
</scrollview>
</caption>
<!--画布-->
<caption pos="40,40,-0,-0">
<scrollview name="scrollview" pos="0,0,-0,-0" viewSize="-1,-1" sbSkin="skin_scrollbar" sbwid="8" scrollSpeed="40" >
<palettecontainer name="palette_container" pos="0,0,@2000,@2000"></palettecontainer>
</scrollview>
</caption>
</caption>
效果图: