変な質問かもしれませんが、
ビットマップファイルを二次元配列のように幾つか並べたものを一つのファイルとして印刷することって可能ですかね?
わかる方、どうか教えてください。
バイナリコードそのままを…ってことですか?
それなら、バイト配列に入れた絵を、
丸ごとループして、Printerオブジェクトにかきこんでいけば…。
(絵はバイト配列にちゃんと入ってくれるはずです。
もし入ってなければ、CByteで変換してみてください、
それでもだめなら、APIのCopyMemoryを…)
ビットマップの絵をそのままってことなんですが・・・(汗)
ばかげた事を言っていますでしょうか?
たかみちえさんはよくVBのことを知っていらっしゃいますがどのように覚えられたのでしょうか?参考に教えてもらえないでしょうか?
> ばかげた事を言っていますでしょうか?
あ、ちっともそんなことありません。失礼しました。
"二次元配列"とかいてあったので、ついそのことだと思っちゃいました^^;
ええと、ビットマップの印刷は試したことがないのでよくわかりません。
普通の印刷なら一回ほどやったことありますけど…。
でも、なんだか使ってみたとき、"PictureBoxとあんまり変わらないなぁ…"という印象を受けました。
(APIを使うと扱いが変わるかもしれませんけど…)
PaintPictureというメソッドがある(多分Printerにもあるんじゃないでしょうか…?)んですけど、
それを使って、任意の場所にはりつけます。
タイルみたいにならべて貼り付けたいのなら…。うまく計算するしかありません。
(いったんStdPictureオブジェクトに入れて、サイズを調べてから出力すると、楽だと思います)
サイズの単位をTwipsで計算するときと、Pixelでするときがあったと思うので、
Screenオブジェクトの、TwipsParPixel(ごめんなさい、スペルは違うかも^^;)プロパティで計算します。
(ここで1Pixelが何Twipsかわかるので、それをかけたりわったりすれば、相互変換できますね)
たしか、PictureBoxに貼り付けるときも、このへんで相当苦労した記憶があります。
PictureBoxに貼り付けてテストしつつ、
成功したらそれをプリントする…。が、いいと思います。
(うまく核心をつけなくてごめんなさい^^;)
> たかみちえさんはよくVBのことを知っていらっしゃいますが
え?わたしガですかぁ?
わたしは…となりのQ&A掲示板に出ている人と比べると、
何も知らないほうだと思うんですけど…。
わたしは、まず、MSDNライブラリのVB関数リファレンスを全部印刷して、それを手書きで一行程度にまとめ、関数を覚えました。
あと、どうしても使い方がわからなかった関数もありましたけど、
(インターネット上で)身を置いた環境が、
うれしいことにプログラマの多い環境でしたので、
いくつか教えてもらいました。
それから、APIなどの情報は、ここのサンプルだったり、検索エンジンでVisualBasicといれて見つかったサイトで見つけたり、Webリングもあるので、そこを探したり…。
関数を全部覚えておくと、結構いろいろなことができるので、あとは創造で、したことのないことも考えてみてます。
(だからまったくの間違いがあったらごめんなさい^^;)
ちなみに、これらのページ(またはその中のリンク)を見てます。
花ちゃんのホームページ(http://www.bcap.co.jp/hanafusa/)
み〜くんパパの仕事部屋(http://www.mitene.or.jp/~sugisita/family/papa/vb/)
VisualBasic UsersRing(http://www.chry.com/web/)
VisualBasic Station(http://www1.harenet.ne.jp/cgi-bin/cgiwrap/unaap/index/) Operaではまったく見られないので、最近は行きませんけど…。
参考になったでしょうか?
PictureBoxやFormに絵をタイル状に貼り付ける処理をしたことがあるので、
その処理の一部です。
参考になればいいんですけど…。
mTextureには、貼り付ける絵の入ったStdPictureオブジェクト(テクスチャー)、
eとiは、カウンタ数値(小数点が絡むので、
Integer型などより、Currency型やSingle型やDouble型のほうがいいです)、
描く対象のオブジェクトは、その前にWithで省略しています。
If mTexture Is Nothing Or mTexture = 0 Then Exit Sub
'mTextureが空っぽだったり、白紙キャンバスなら抜ける
For i = 0 To .ScaleWidth / (mTexture.Width / Screen.TwipsPerPixelX) Step 0.56
'よこがわにループ(0〜フォームサイズ割るピクセル換算したテクスチャサイズ) ステップは0.56(謎))
For e = 0 To .ScaleHeight / (mTexture.Height / Screen.TwipsPerPixelY) Step 0.56
'たてがわループ(〃)
.PaintPicture mTexture, i * mTexture.Width / Screen.TwipsPerPixelX, e * mTexture.Height / Screen.TwipsPerPixelY
’テクスチャをはる
Next
'たてがわループのほうをさきにすませる
Next
'よこがわループをすませる
159
2610
3711
4812
の順に貼り付けるはずです。
プログラムは日本語になおしながらやるとうまくいきやすいです。
("よく知っている"といわれて少し舞い上がってしまいました^^;)
たかみちえさん、ありがとうございました。
まだ、教えていただいたことが勉強不足なので暗号のようにしか見えませんが
やってみたいと思います。
いや〜しかしやはりできた方は謙遜なさいますね。
たかみちえさんのようにアドバイスできる側になれたらいいな。
勉強します。
やってみた結果(勉強して←本当に?)ピクチャーボックスにタイルのように並べることができたのですが、さてこのピクチャーボックスをどうすればプリンタ出力できるのでしょう・・・という壁にぶち当たり次のようなことを試みたのですがうまくいきません。どうしてなんでしょ?なぜなんでしょ?
Dim picTest As New StdPicture
Dim i
Dim e
Set picTest = LoadPicture(App.Path & "\test.bmp")
With picDaisi
If picTest Is Nothing Or picTest = 0 Then Exit Sub
For i = 0 To .ScaleWidth / picTest.Width Step 0.56
For e = 0 To .ScaleHeight / picTest.Height Step 0.56
.PaintPicture picTest, i * picTest.Width, e * picTest.Height
Next
Next
End With
MsgBox ("owari")
って感じでpicDaisiに思いどおりのイメージが絵がけれたのですが次に
Printer.PaintPicture picDaisi.Picture, 0, 0
または
Printer.PaintPicture picDaisi.Image, 0, 0
Printer.EndDoc
ってやったのですが・・・
う〜ん 勉強不足でした。
PictuerBoxのAutoRedrawを有効にしたら印刷することができました。
たかみちえさん いろいろありがとうございました。
うまくいったんですね、よかったよかった。
0.56というのは…。謎です…^^;
もうちょっとちゃんとした計算をすれば、なぜこうなるかわかるんでしょうけど…。
(しらみつぶしに探して、うまく言ったってそれだけです。
実際解像度が変わったりすると、失敗するかもしれないです…)
ちなみに
Dim i
Dim e
ですけど、ちゃんと As 〜で宣言しないと、なんでもはいるVariantになってしまい、
Double型などよりさらに重たくなってしまいます。
今回はループを使ってるので、大きくなると、ちょっと深刻な事態になりえるかも…。
この場合、ステップが0.56で、小数点第3位の数字が出ることはないので、
Single型か、Currency型で宣言しておくことをおすすめします。
(Currencyは説明書にもあるとおり通貨型ですけど、ちょっとした小数を混ぜる計算にはつかえます。
上にも1万くらいは数えられたと思うので、意外と使いやすいと思いますよ)
> いや〜しかしやはりできた方は謙遜なさいますね。
うーん、ほんとに知らないんですけど…。
Q&A掲示板に出ている人のホームページなどを見ると、
本気を出したらどんなにすごいものができるだろうと思うとがく然とします^^;
ただ、Q&A掲示板に出てる人って、あんまりこちらにきませんね…。
ツイート | ![]() |