喫茶XRAYトップページ

[スレッド全体
]

[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