初心者掲示板で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%程、横は百数%大きくなってしまいます。
何か対応する方法はありますか?
宜しくお願いいたします。
この、
> Set Picture1.Picture = CreateMeta(Picture1, 170, 125)
の170,125というのは大きさなのでしょうか? その場合、単位系
は何を使っているのでしょうか?
で、この関数の内部で、Pixel単位などに変換して描画などを
している部分があったら、それを取り除いてみるとか。
お世話になります。
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モードで描画しています。
では、Excelに貼り付けたあと、その貼り付けられた側で
「図の書式設定」-「サイズ」-「原型のサイズ」
を確認するとどうなっているのでしょうか?
それが換わっているようであれば、根本的に見直して作り直さ
ないといけなさそうです。
100%になっています。
オブジェクトをPrinterにして
CreateMeta(Printer, 170, 120)
で印刷すると、ちゃんと正しい寸法で印刷できるのですが。
先ほどのCreateMeta(Printer, 170, 120)の120は間違いで125でした。
なお、EXCELに貼り付けた大きさは179.9×141.1になっており、それをPictureBoxの描画寸法170×125に変更すると正しい寸法になります。
念のために伺いますが、
「図の書式設定」-「サイズ」-「原型のサイズ」
でも、170mm x 120mmになっている、ということですよね?
# 100%云々は元画像に対する拡大率を意味しているかどうか不明ですし。
Excel側で印刷すると170mm x 120mmになっている、というのならば、
Excelの表示の問題(?)、もしくはディスプレイの問題だけのように
思えますし、印刷してもサイズが異なる、というのならば、Excelの
取り込み時の処理の問題、と考えられます。
が、本当にそうなのかの確証は乏しすぎます。そのメタファイルを
他のアプリにクリップボード経由で渡してみるとどうなるのでしょうか。
また、SavePictureしてファイルに保存して、様々なアプリから開いて
みるとどうなるのでしょうか?
これにより、どちらに原因があるのか、にある程度の判断材料が
与えられるかも知れません。
# ちなみにExcelのバージョンは?
EXCEL2002のSP3です。
「図の書式設定」-「サイズ」で「原型のサイズ」は
高さ:14.11cm 幅:17.99cmになっています。
縦横比を固定するをはずし、サイズと角度の
高さ:12.5cm 幅:17.0cmににすると正しい寸法になります。
WOEDペーストしても「原型のサイズ」はいっしょで原型のサイズではなく
幅は少し縮小されて表示されています。
PAINTにペーストしてもEXCELと同じ縮尺に見えます。
追伸
SetMapMode hDC, MM_ANISOTROPICで「vbMillimeters」で描画すると
コピー ペーストで正しい寸法で描画しますが、PEN幅を1にすると
線幅が結構太く、1以下ではスクリーン上では良いのですが、プリント
するとプリンタの1ピクセルの線になりあきらめました。
WordとExcelとでは、描画周りのエンジンがおそらく同じなので、
この2つでは似たようなことになるんじゃないかと思います。
前にも書きましたが、VB側で作成したメタファイルをSavePicture
してファイルに保存し、それを使ってみるとどうなるのでしょうか?
また、VB製アプリに貼り付けてみるとどうなりますか?
ファイルに保存してIrfan Viewで開いてみましたが、どうもEXCELと同じ縮尺のようです。
となると、こちらのVB側が問題になりますね。
コードだけではどうすればいいかちょっとわかりません。
とりあえず、可能性がありそうなところを列挙してみます。
http://support.microsoft.com/kb/145999/ja
を参考にして関連する事柄を拾ってみることにしましょう。
まず、バイナリエディタでファイルを開いて、
ファイルの先頭から
http://msdn2.microsoft.com/en-us/library/ms534529.aspx
のメンバーに当てはめてサイズ関連の要素をチェックして、
どこが想定外のものなのか、を調べるとか。
また、下方や右方にはみ出して描画している、ということは
ないのかをチェックしてみるとか。もしそうならば、リージョン
を作って、その中で描画するようにしてみるとか。
本当にありうがとうございます。
もう少し頑張ってみます。
2番目のURLは残念ながら見ることが出来ませんでした。
お世話になります。
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
になっており、この寸法比が変形の比率と同じ値です。
もう少し検討してみます。
VB側の計算がどうもおかしいようですね。
まず、単純に、基にするhDCに、API関数のGetDCを用いて、
GetDC(0&)
で返される値を使うとどうなるのでしょうか?
で、それでも駄目な場合のために、強引な方法を使えるように
しておきます。前回提示したサンプルにコードを加えて、無理矢理
その部分を書き換えるようにしてみました。
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/MetaDraw.lzh
MetaPictureCopyAndResizeというメソッドを追加してあります。
ありがとうございます。
参考にさせていただきます。
ツイート | ![]() |