クリップボード経由でのメタファイルの画像(罫線寸法)が変わらないようにするには


Poohさん  2007-02-13 20:28:56  No: 97996

初心者掲示板でK.J.K.さんにお世話になった者です。Windoew2000でVB6.0を使っています。
APIを使いメタファイルでMM_HIMETRICを使ってPictureBoxに正確な寸法で罫線や文字の描画や印刷は可能になりました。
ところが、
Set Picture1.Picture = CreateMeta(Picture1, 170, 125)
Clipboard.Clear
Clipboard.SetData Picture1.Picture
でクリップボードに渡した後、EXCELにペーストすると縦は113%程、横は百数%大きくなってしまいます。
何か対応する方法はありますか?
宜しくお願いいたします。


K.J.K.  2007-02-13 21:06:21  No: 97997

この、
> Set Picture1.Picture = CreateMeta(Picture1, 170, 125)
の170,125というのは大きさなのでしょうか? その場合、単位系
は何を使っているのでしょうか?

で、この関数の内部で、Pixel単位などに変換して描画などを
している部分があったら、それを取り除いてみるとか。


Poohさん  2007-02-13 21:53:24  No: 97998

お世話になります。
Private Function CreateMeta(Target As Object, Width&, Height&, Optional ScaleMode As ScaleModeConstants = vbMillimeters) As Picture
で巾と高さをmmで渡しているつもりです。
その後
    MyRect.Left = 0
    MyRect.Top = 0
    MyRect.Right = Width * 100
    MyRect.Bottom = Height * 100
    hDCRef = Target.hdc
    hDC = CreateEnhMetaFile(hDCRef, vbNullString, MyRect, vbNullString)

     '座標系の設定
    SetMapMode hDC, MM_HIMETRIC    'HI_METRIC
   
    '実際に描く
     Call BkDraw(hDC, Width, Height)
この関数内も*100してすべてMM_HIMETRICモードで描画しています。


K.J.K.  2007-02-13 23:05:24  No: 97999

では、Excelに貼り付けたあと、その貼り付けられた側で
「図の書式設定」-「サイズ」-「原型のサイズ」
を確認するとどうなっているのでしょうか?

それが換わっているようであれば、根本的に見直して作り直さ
ないといけなさそうです。


Poohさん  2007-02-13 23:13:41  No: 98000

100%になっています。
オブジェクトをPrinterにして
CreateMeta(Printer, 170, 120)
で印刷すると、ちゃんと正しい寸法で印刷できるのですが。


Poohさん  2007-02-14 01:14:35  No: 98001

先ほどのCreateMeta(Printer, 170, 120)の120は間違いで125でした。
なお、EXCELに貼り付けた大きさは179.9×141.1になっており、それをPictureBoxの描画寸法170×125に変更すると正しい寸法になります。


K.J.K.  2007-02-14 01:15:31  No: 98002

念のために伺いますが、
「図の書式設定」-「サイズ」-「原型のサイズ」
でも、170mm x 120mmになっている、ということですよね?
# 100%云々は元画像に対する拡大率を意味しているかどうか不明ですし。

Excel側で印刷すると170mm x 120mmになっている、というのならば、
Excelの表示の問題(?)、もしくはディスプレイの問題だけのように
思えますし、印刷してもサイズが異なる、というのならば、Excelの
取り込み時の処理の問題、と考えられます。

が、本当にそうなのかの確証は乏しすぎます。そのメタファイルを
他のアプリにクリップボード経由で渡してみるとどうなるのでしょうか。
また、SavePictureしてファイルに保存して、様々なアプリから開いて
みるとどうなるのでしょうか?

これにより、どちらに原因があるのか、にある程度の判断材料が
与えられるかも知れません。
# ちなみにExcelのバージョンは?


Poohさん  2007-02-14 01:42:41  No: 98003

EXCEL2002のSP3です。

「図の書式設定」-「サイズ」で「原型のサイズ」は
高さ:14.11cm  幅:17.99cmになっています。

縦横比を固定するをはずし、サイズと角度の
高さ:12.5cm  幅:17.0cmににすると正しい寸法になります。

WOEDペーストしても「原型のサイズ」はいっしょで原型のサイズではなく
幅は少し縮小されて表示されています。

PAINTにペーストしてもEXCELと同じ縮尺に見えます。


Poohさん  2007-02-14 01:53:23  No: 98004

追伸

SetMapMode hDC, MM_ANISOTROPICで「vbMillimeters」で描画すると
コピー  ペーストで正しい寸法で描画しますが、PEN幅を1にすると
線幅が結構太く、1以下ではスクリーン上では良いのですが、プリント
するとプリンタの1ピクセルの線になりあきらめました。


K.J.K.  2007-02-14 06:04:42  No: 98005

WordとExcelとでは、描画周りのエンジンがおそらく同じなので、
この2つでは似たようなことになるんじゃないかと思います。

前にも書きましたが、VB側で作成したメタファイルをSavePicture
してファイルに保存し、それを使ってみるとどうなるのでしょうか?

また、VB製アプリに貼り付けてみるとどうなりますか?


Poohさん  2007-02-14 18:26:18  No: 98006

ファイルに保存してIrfan Viewで開いてみましたが、どうもEXCELと同じ縮尺のようです。


K.J.K.  2007-02-14 22:10:47  No: 98007

となると、こちらのVB側が問題になりますね。
コードだけではどうすればいいかちょっとわかりません。
とりあえず、可能性がありそうなところを列挙してみます。
http://support.microsoft.com/kb/145999/ja
を参考にして関連する事柄を拾ってみることにしましょう。

まず、バイナリエディタでファイルを開いて、
ファイルの先頭から
http://msdn2.microsoft.com/en-us/library/ms534529.aspx
のメンバーに当てはめてサイズ関連の要素をチェックして、
どこが想定外のものなのか、を調べるとか。

また、下方や右方にはみ出して描画している、ということは
ないのかをチェックしてみるとか。もしそうならば、リージョン
を作って、その中で描画するようにしてみるとか。


Poohさん  2007-02-14 23:07:57  No: 98008

本当にありうがとうございます。
もう少し頑張ってみます。
2番目のURLは残念ながら見ることが出来ませんでした。


Poohさん  2007-02-14 23:40:54  No: 98009

お世話になります。
1番目のURLでダウンロードした「EMHMETA.EXE」でファイルを開き

[EDIT]の[Metafile Info]のMetafileSurface(0.01mm)は
Top    : 0
Left   : 0
Right  : 17000
Bottom : 12500
で希望通りになっていますが

Metafile Bounds(Divice Units)が
Top    : 0
Left   : 0
Right  : 678
Bottom : 531
になっており、この寸法比が変形の比率と同じ値です。
もう少し検討してみます。


K.J.K.  2007-02-15 01:54:53  No: 98010

VB側の計算がどうもおかしいようですね。
まず、単純に、基にするhDCに、API関数のGetDCを用いて、
GetDC(0&)
で返される値を使うとどうなるのでしょうか?

で、それでも駄目な場合のために、強引な方法を使えるように
しておきます。前回提示したサンプルにコードを加えて、無理矢理
その部分を書き換えるようにしてみました。
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/MetaDraw.lzh
MetaPictureCopyAndResizeというメソッドを追加してあります。


Poohさん  2007-02-15 02:14:21  No: 98011

ありがとうございます。
参考にさせていただきます。


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

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






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