喫茶XRAYトップページ

[スレッド全体
]

[6558] Re4:メタファイルとマッピング返信 削除
2012/12/16 (日) 23:08:37 taki
▼ Mr.XRAYさん

> ただ,今回の兆戦は,結構難しい部類になるような気もします.

マスターの予告どおり、なかなか思うようにいきません。

マッピングの処理の意味がなんとなく分かってきました。

ビットマップのようなイメージの場合は切り取り処理をすると
切り取った範囲だけになるのでファイルサイズは減少しますが、
メタファイルの場合は、元のデータを全て持った状態で
切り取った範囲の部分だけ見えるように穴を開けているようです。

元のソースのメタファイルのサイズが933kに対して、切り取った
メタファイルのサイズが1.3Mもあります。
マスク?の分が増えたと想像します。

だから、受け取り側のメタファイルのキャンバスに対して
マッピング処理をしているのですね。(T_T)


[6559] Re5:メタファイルとマッピング返信 削除
2012/12/17 (月) 14:01:09 taki
▼ Mr.XRAYさん

マッピングを使ってSourceMetaからDestMetaを切り取った場合、
DestMetaは
  Image1.AutoSize := True;
  Image1.Picture.Assign(DestMeta);
の方法でしか正しく表示しないようです。

特に、Image1.AutoSize := True; は大切で、こうすることにより
余計な部分の表示をクリッピングして(隠して)いるようです。

Image1.Canvas.Draw(20,20,DestMeta); とか

PrintRect := Bounds(20,20,DestMeta.Width,DestMeta.Height);
Image1.Canvas.StretchDraw(PrintRect,DestMeta) とかすると、

DestMetaのサイズ以外の余白部分まで前後左右のデータがImage1に
表示されてしまいます。

例えば、1ページが50行で前後にいくらかの余白を持たせる場合、
2ページ目を表示すると、べたっとデータで埋め尽くされます。

Image1の上端------------------------
49行目のデータ (本来は上の余白)
50行目のデータ ( 〃 )
51行目のデータ ここからが2ページ目の内容


100行目のデータ ここまでが2ページ目の内容
101行目のデータ (本来は下の余白)
102行目のデータ ( 〃 )
Image1の下端------------------------

のように余白部分にまでデータが書き込まれてしまうのです。

これは、メタファイルとはこういうものなんだと諦めるしか
ないようです。(T_T)


[6560] Re6:メタファイルとマッピング返信 削除
2012/12/17 (月) 17:10:15 おかぽん
余計な部分の描画を抑えたいということであれば・・・

CreateRectRgnで1ページ分の矩形範囲のリージョンを作成
SelectClipRgnで、キャンバスにクリッピングリージョンを設定する。

メタファイルの描画を行い

再度SelectClipRgnで、クリッピングリージョンを削除し
DeleteObjectで、リージョンを廃棄する。

コードで書けばこんな感じ
var
  hrgn:Thandle;
bgein
  hrgn := CreateRectRgn(20,20,200,250);
  SelectClipRgn(Image1.Canvas.Handle, hrgn);
  //ここでImage1.Canvasにメタファイル描画
  SelectClipRgn(Image1.Canvas.Handle, 0);
  DeleteObject(hrgn);
end;

試していないので、できるかわかりませんけど。

[6561] Re7:メタファイルとマッピング返信 削除
2012/12/17 (月) 17:43:47 taki
▼ おかぽんさん

ありがとうございます。
試してみます。


[6562] Re7:メタファイルとマッピング返信 削除
2012/12/17 (月) 19:27:42 taki
▼ おかぽんさん

Image1へのクリッピングは簡単にできました。

さらに、プリンターへの出力のクリッピングもうまくできました。

こんな方法があるのですね。
大変勉強になりました。 (^_^)

[6563] Re7:メタファイルとマッピング返信 削除
2012/12/17 (月) 19:47:06 Mr.XRAY
▼ おかぽんさん

>CreateRectRgnで1ページ分の矩形範囲のリージョンを作成
>SelectClipRgnで、キャンバスにクリッピングリージョンを設定する。


なるほどね.
ホントに,よくまぁ,考えつくもんですね.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82