- 用紙設計キャンバス(1/100mm 基準)・テキスト/画像/矩形/直線アイテム - コピー/複製/Zオーダー/整列/グリッドスナップ、原紙(下絵)読込と印刷可否 - GDI 直接印刷、.otz 保存/再読込(版数つき) - MFC/CRT 静的リンクで VS2022 IDE から F5 デバッグ可
61 lines
1.5 KiB
C++
61 lines
1.5 KiB
C++
// ShapeItem.cpp
|
|
#include "pch.h"
|
|
#include "ShapeItem.h"
|
|
|
|
IMPLEMENT_SERIAL(CShapeItem, CPrintItem, 1)
|
|
|
|
// コンストラクタ。既定は矩形枠・線幅0.3mm。
|
|
CShapeItem::CShapeItem()
|
|
: m_shape(0)
|
|
, m_lineWidthHu(30) // 0.3mm
|
|
{
|
|
}
|
|
|
|
// 図形(矩形枠 or 直線)を描画する。線幅は 1/100mm 指定なので
|
|
// CoordMap で device ピクセルへ換算してから GDI ペンを作る。
|
|
void CShapeItem::Draw(CDC& dc, const CoordMap& map, bool selected)
|
|
{
|
|
CRect dr = map.MmToDev(m_rect);
|
|
|
|
int penW = map.LenToDevX(m_lineWidthHu);
|
|
if (penW < 1) penW = 1;
|
|
|
|
CPen pen(PS_SOLID, penW, RGB(0, 0, 0));
|
|
CPen* pOld = dc.SelectObject(&pen);
|
|
|
|
if (m_shape == 1)
|
|
{
|
|
// 直線: 矩形の左上→右下
|
|
dc.MoveTo(dr.left, dr.top);
|
|
dc.LineTo(dr.right, dr.bottom);
|
|
}
|
|
else
|
|
{
|
|
// 矩形枠(塗りつぶしなし)
|
|
CBrush* pOldBrush = (CBrush*)dc.SelectStockObject(NULL_BRUSH);
|
|
dc.Rectangle(dr);
|
|
dc.SelectObject(pOldBrush);
|
|
}
|
|
|
|
dc.SelectObject(pOld);
|
|
|
|
if (selected)
|
|
DrawSelection(dc, dr);
|
|
}
|
|
|
|
// 自身の複製を生成して返す。
|
|
CPrintItem* CShapeItem::Clone() const
|
|
{
|
|
return new CShapeItem(*this);
|
|
}
|
|
|
|
// 永続化。基底(矩形)に続けて図形種別と線幅を読み書きする。
|
|
void CShapeItem::Serialize(CArchive& ar)
|
|
{
|
|
CPrintItem::Serialize(ar);
|
|
if (ar.IsStoring())
|
|
ar << m_shape << m_lineWidthHu;
|
|
else
|
|
ar >> m_shape >> m_lineWidthHu;
|
|
}
|