Initial commit: OtozaiPrinter (AveryDennisonUtil) ラベル/レシート レイアウト設計・印刷 MFC アプリ
- 用紙設計キャンバス(1/100mm 基準)・テキスト/画像/矩形/直線アイテム - コピー/複製/Zオーダー/整列/グリッドスナップ、原紙(下絵)読込と印刷可否 - GDI 直接印刷、.otz 保存/再読込(版数つき) - MFC/CRT 静的リンクで VS2022 IDE から F5 デバッグ可
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user