プレビュー機能作成のため、メタファイルに追加で文字や矩形を追加したいのですが、位置位相がうまくできません。
「中村の里」で解説を読んではみたのですが、ちょっと理解できなかったので教えてください。
やりたいことは、
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
GetDeviceCapsの第一引数は device-context handle。
TMetaFileのHandleじゃないよ。
お返事遅くなりました。
本職が忙しかったり、目的のためにいろいろ試してて時間がかかりました。
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サイズは設定なしでメタ情報を書き込みしてます。
何でなんでしょう?
> MergeMetaFile.MmHeight 等を設定すると思った状態にならないので
> MMサイズは設定なしでメタ情報を書き込みしてます。
> 何でなんでしょう?
これには大変ややこしい事情があります。
そもそも、TMetafIle.Width, Height とは何ぞや。
そして、TMetafIle.MMWidth, MMHeight とは何ぞや、
から始めねばなりません。
詳しくは、中村拓男氏著「Delphi Graphics Secret」第3章第3節「TMetaFile」を参照してください。
この問題を解明しているおそらく唯一の資料と思われます。
電子出版で入手できるはずです。検索をかければすぐ出てきます。
Aldus Placeble Metafile についての知識も必要になりますが、私のサイトの「Wfm フォーマット」の解説がお役に立てるでしょう。
ツイート | ![]() |