# AveryDennisonUtil ラベル/レシートの**レイアウトを画面上で設計し、Windows プリンターへ印刷**する MFC (VC++) デスクトップアプリ。 高価な中華製ラベルソフトの置き換えを目的とする。**ダイアログベース**アプリ(左側にボタン列、右側に編集キャンバス)。 ## できること - 全印刷領域(用紙/ラベルサイズ)の確定(`用紙サイズ` ボタン。ロールラベルのプリセット + 余白指定) - 複数の印刷領域(ゾーン)の配置・サイズ変更(ドラッグ移動 / ハンドルでリサイズ) - 各領域に印刷するデータの入力 - テキスト(フォント・サイズ・揃え・太字) - 矩形枠 / 直線(区切り) - 画像(PNG/JPG/BMP、`.otz` に埋め込み) - 編集操作 - コピー / 貼付け / 複製(`Ctrl+C` / `Ctrl+V` / `Ctrl+D`) - 重なり順(`前面` / `背面` ボタン、`Ctrl+]` / `Ctrl+[` で前後へ) - 整列(`整列...` ボタン → 用紙/余白を基準に 左右中央/上下中央など) - グリッド/スナップ(`グリッド/スナップ` チェック、1mm グリッド。矢印キーで微調整、`Shift` で大きく) - 原紙(位置合わせ用の背景下絵) - `原紙...` ボタンで画像を読み込み、用紙全体に敷く(画面では薄く表示し、上に載せるアイテムの位置合わせを容易にする) - 読み込み時に **用紙サイズを原紙ファイルのサイズに合わせる**。px→mm 換算の基準を選択可能: - 画像の埋め込みDPI(ファイル本来の実寸)/ 用紙のDPI設定 / 変更しない - `原紙を印刷` チェックで、原紙自身を印刷する/しないを選択(既定 = 印刷しない=既存の印刷済みラベルに重ねる用途) - `消去` で原紙を除去。原紙画像は `.otz` に埋め込み保存 - Windows プリンターへ印刷(GDI、`CPrintDialog` 経由の直接印刷。ラベル mm(0,0) を印字可能領域の左上に合わせて出力) - レイアウトの保存・再読込(`*.otz`。版数つきヘッダで前方/後方互換に配慮) ## アーキテクチャ(要点) - すべてのジオメトリは **1/100 mm の整数**で保持(ピクセルで持たない)。 - 描画は各アイテムの `Draw(CDC&, const CoordMap&)` ただ 1 つに集約し、 **画面エディタと印刷で同一コードを共有**。違いは [`CoordMap`](CoordMap.h) が持つ DPI とズームだけ。 - これにより画面(≒96dpi)とサーマルラベル(≒203dpi)で同一レイアウトが 物理的に正しいサイズで出力される。 | 役割 | クラス | |------|--------| | アプリ(ダイアログ起動のみ) | `CAveryDennisonUtilApp` ([AveryDennisonUtil.cpp](AveryDennisonUtil.cpp)) | | メイン ダイアログ(ボタン・ファイル・印刷) | `CMainDialog : CDialog` ([MainDialog.cpp](MainDialog.cpp)) | | 編集キャンバス(子ウィンドウ・マウス操作) | `CCanvas : CWnd` ([Canvas.cpp](Canvas.cpp)) | | データモデル(用紙+アイテム列・.otz 保存) | `CLabelLayout` ([LabelLayout.cpp](LabelLayout.cpp)) | | 共有描画(画面・印刷) | `Render::DrawLayout` ([RenderScene.cpp](RenderScene.cpp)) | | 単位変換 | `CoordMap` ([CoordMap.h](CoordMap.h)) | | アイテム | `CPrintItem` 派生:`CTextItem` / `CShapeItem` / `CImageItem` | ## ビルド / デバッグ - VS2022 (v143) / x64 / **MFC・CRT は静的リンク**。単一 exe で外部 DLL に依存しないため、 **Visual Studio 2022 で `AveryDennisonUtil.sln` を開き、構成 Debug(または Release)/x64 を選んで F5(デバッグ実行)するだけで動く**(Debug 用 DLL の配置は不要)。 - コマンドラインからビルドする場合: ``` & "C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe" ` AveryDennisonUtil.sln /p:Configuration=Debug /p:Platform=x64 ``` - 出力: `bin\Debug\AveryDennisonUtil.exe`(Release は `bin\Release\`)。 - 補足: このマシンには vcpkg のグローバル統合が入っているが、本プロジェクトは未使用のため `.vcxproj` で `VcpkgEnabled=false` にして無効化済み(不要な include 注入と pwsh デプロイ手順を回避)。 ## 使い方 1. `用紙サイズ` ボタンでラベル寸法を設定(ロールラベルのプリセットあり。`余白` を入れると破線ガイドが出て整列の基準になる)。 2. `テキスト`/`画像`/`矩形枠`/`直線` ボタンでアイテムを追加。 3. キャンバス上でドラッグ移動、ハンドルでリサイズ。ダブルクリック(または `プロパティ` ボタン)で編集。`Del` キー / `削除` ボタンで削除。 4. コピー/複製(`コピー`+`貼付` または `複製` / `Ctrl+C,V,D`)、重なり順(`前面`/`背面`)、`整列...` で配置を整える。`グリッド/スナップ` を入れると 1mm グリッドへ吸着し、矢印キーで微調整できる(`Shift` で大きく移動)。 5. 既存ラベル等に合わせたい場合は `原紙...` で下絵を読み込む。読込時に用紙を原紙サイズへ合わせるか(埋め込みDPI / 用紙DPI)を選択。薄く表示された原紙に合わせてアイテムを配置し、原紙そのものも印刷したいときは `原紙を印刷` をチェック。 6. `印刷` ボタン → プリンタを選んで印刷。 7. `保存` / `名前を付けて保存` で `.otz` 保存、`開く` で再読込。 ## 検証のヒント 実機が無い場合、`Microsoft Print to PDF` へ印刷すると 203dpi 相当の解像度差を含めて 配置・サイズが mm 通りかを PDF 上で確認できる。