MetaFileのサイズ指定

解決


印刷屋  2007-06-30 19:00:01  No: 26902

プレビュー機能作成のため、メタファイルに追加で文字や矩形を追加したいのですが、位置位相がうまくできません。
「中村の里」で解説を読んではみたのですが、ちょっと理解できなかったので教えてください。

やりたいことは、
1.まず、BaseMetafileにLoadFromFileで既存のEMFやWMFを用意
2.MergeMetaFileを印刷想定サイズで用意。
3.BaseMetaFileをMergeMetaFileの境界boxいっぱいにStretchDraw
4.mm単位で用意した位置情報を使って文字や矩形を追加する

で、理解できないのは2.です。
たとえばA4(210x297)で用意するにはどうしたらよいのでしょうか?
//
begin
  MergeMetaFile := TMetaFile.Create;
  MergeMetaFile.MMHeight := 297 * 100;
  MergeMetaFile.MMWidth  := 210 * 100;
  MergeMetaFile.Height := ???;
  MergeMetaFile.Width  := ???;
  //描画
  with TMetafileCanvas.Create(MergeMetaFile, 0) do
    try
      //既存のメタファイル
      StrechDraw(Rect(0,0,MergeMetaFile.Width,MergeMetaFile.Height),BaseFile);
    //その他の文字矩形情報配置
//
MergeMetaFile.Create直後に
  dpiX := GetDeviceCaps(MergeMetaFile.Handle, LOGPIXELSX);
とすると[0]しか返ってこないので、何を元に比率を計算していいのかわからない状況です。

Win2K + Delphi7


かんつがい  2007-06-30 22:24:05  No: 26903

GetDeviceCapsの第一引数は device-context handle。
TMetaFileのHandleじゃないよ。


印刷屋  2007-07-06 22:07:20  No: 26904

お返事遅くなりました。
本職が忙しかったり、目的のためにいろいろ試してて時間がかかりました。

var DC:HDC;
  DC := GetDC(0);
  dpiX := GetDeviceCaps(DC, LOGPIXELSX);
こんな感じなんですね。
いっつもPrinter.Handleしか突っ込んでなかったんで、勘違いしてました。

とりあえずわかったことは、
内包済みのメタファイルをサイズ変更しても、境界矩形が変わるだけで、印字位置や印字サイズは変わらないってことです。
StrechDrawでImage.Canvasいっぱいに表示しようとしたら、何でDrawで印字されるサイズより縮むんだろうってずっと悩んでました。

  MergeMetaFile := TMetaFile.Create;

  MergeMetaFile.Height := BaseMetafile.Height;
  MergeMetaFile.Width  := BaseMetafile.Width;
で用意することでサイズが正常に移動できました。

ただ、
  MergeMetaFile.MmHeight 等を設定すると思った状態にならないのでMMサイズは設定なしでメタ情報を書き込みしてます。
何でなんでしょう?


さどやま  URL  2007-07-07 03:29:48  No: 26905

> MergeMetaFile.MmHeight 等を設定すると思った状態にならないので
> MMサイズは設定なしでメタ情報を書き込みしてます。
> 何でなんでしょう?
  
  これには大変ややこしい事情があります。
  そもそも、TMetafIle.Width, Height とは何ぞや。
  そして、TMetafIle.MMWidth, MMHeight とは何ぞや、
から始めねばなりません。
  詳しくは、中村拓男氏著「Delphi Graphics Secret」第3章第3節「TMetaFile」を参照してください。
  この問題を解明しているおそらく唯一の資料と思われます。
  電子出版で入手できるはずです。検索をかければすぐ出てきます。

  Aldus Placeble Metafile についての知識も必要になりますが、私のサイトの「Wfm フォーマット」の解説がお役に立てるでしょう。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加