// 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; }