使用soui4实现一个打印排版软件(一)

实现一个画板容器控件用来放置元素对象。

#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>

效果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值