Files
yoshikazu 19d1c39370 Initial commit: OtozaiPrinter (AveryDennisonUtil) ラベル/レシート レイアウト設計・印刷 MFC アプリ
- 用紙設計キャンバス(1/100mm 基準)・テキスト/画像/矩形/直線アイテム
- コピー/複製/Zオーダー/整列/グリッドスナップ、原紙(下絵)読込と印刷可否
- GDI 直接印刷、.otz 保存/再読込(版数つき)
- MFC/CRT 静的リンクで VS2022 IDE から F5 デバッグ可
2026-06-05 17:27:29 +09:00

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