印刷処理でプレビュー画面を作るには?


なー  2004-06-04 11:05:23  No: 83809  IP: [192.*.*.*]

お世話になっています。

現在、PrinterObjectを使って印刷処理を行っているのですが、機能として
プレビュー画面を別FormのPictureBoxで表示したいと思います。
描画はできるのですが、スクロールバーがない為、一部しか表示されません。
又、そのままの表示(vbPixelsで設定)では大きすぎるので、縮小して表示させたい
です。できれば次ページ以降も表示できればよいです。

描画は、PrinterObjectのオブジェクト名をPictureBoxに切り替えて
印刷とプレビューを行っています。
調べた結果、一旦BMPにおとし、APIのStretchBlt等でPictureBoxに
転送すればよいのかなと思いましたが、BMPに落とす方法とスクロールバーで
画像を表示させる方法がいまいちわかりません。
単純なプレビュー機能でよいのですが、商品として成り立たせるには、或いは
市販のコントロール等を使うのがベストでしょうか?
どなたかご教授お願いします。(Win2k,1024*768限定)

編集 削除
nanashi  2004-06-04 11:29:37  No: 83810  IP: [192.*.*.*]

PictureBoxを2つ使えばBMPに落とさなくてもStretchBltで縮小できます。

スクロールは表示用のPictureBoxをコンテナに入れて
スクロールバーでTopとLeftを変えてあげれば出来ます。

私もプレビュー画面が欲しいと思い、以前自作したことがありますが、
VB付属のコントロールでも充分な物が作れました。
頑張ってください。

編集 削除
まつ  2004-06-04 12:49:54  No: 83811  IP: [192.*.*.*]

私は、
1.エクセルに表示
2.クリスタルレポート

以上2つを使用してます、エクセルに表示印刷が、面白いですよ。

編集 削除
まつ  2004-06-04 13:06:03  No: 83812  IP: [192.*.*.*]

はずかしい、話題の間違いでした。

画像を表示させる方法なんですね、
私も、tif ファイルを98で作成をし、XPで  ocxが標準で無くなり困っています。


VB6.です、、、どなたか授お願いします。

編集 削除
なー  2004-06-05 12:04:47  No: 83813  IP: [192.*.*.*]

ご回答どうもありがとうございます!

とあるサイトを参考にして、PictureBoxを2つより読み込み用をBMPにしたら
処理速度も速く、又次ページ以降も楽に表示できるかなと思ってBMPと書きました。

色々テストをしてBMPからの読込み、縮小表示は出来たのですが、PrinterObject
での描画→PictureBox(0)→StretchBlt→PictureBox(1)が上手くいきません。

frmPrintでの処理
    Call mobjPnt.cSubPnt(frmPreview.picDraw(0)) ←PrinterObjectで描画
    frmPreview.Show
frmPreviewでの処理
    StretchBlt picDraw(1).hdc, 0, 0, picDraw(1).ScaleWidth / 2, _
    picDraw(1).ScaleHeight / 2, picDraw(0).hdc, 0, 0, _
    picDraw(0).ScaleWidth, picDraw(0).ScaleHeight, SrcCopy
    picDraw(1).Refresh

という感じです。picDraw(0)をフレームに、picDraw(1)が上に貼っています。
インデックスを逆にしたりと試行錯誤していますが、frmPrintだけの処理は
上手く描画されますが、StretchBltを入れると何も表示されなくなります。
何が悪いのでしょうか?再度ご教授頂けると幸いです。

編集 削除
NOK  2004-06-05 15:59:05  No: 83814  IP: [192.*.*.*]

StrechBltの単位系はpixelです。twipsで渡していませんか?

ただ、ピクチャボックスを使うなら、わざわざAPIをつかわずとも
PaintPictureメソッドでいいんじゃないでしょうか?

編集 削除
なー  2004-06-05 16:27:49  No: 83815  IP: [192.*.*.*]

初めに書きましたが、描画の単位もPictureBoxもvbPixelsにしています。
PaintPictureよりもAPIを使うのは、処理速度を考慮してのことです。
できればAPIで実現できればと思っています。

編集 削除
NOK  2004-06-05 17:26:09  No: 83816  IP: [192.*.*.*]

ピクチャボックスのDCにはビットマップの実体は割り当てられていませんが
ちゃんと描画用のビットマップを作成してSelectObjectしてますか?
いきなりピクチャボックスにStretchBltしてもうまくいかないと思いますが

編集 削除
NOK  2004-06-05 17:49:30  No: 83817  IP: [192.*.*.*]

後、気になったことを言うとpicDraw(P0)(ソース画像?)のPictureBox
のScaleWidth=画像の幅になっているんですか?
普通、PicutureBoxのPictureプロパティのWidthとHeight(picDraw(0).Picture.Width)が
画像の大きさをあらわしているのですが。(HiMetric単位で)

編集 削除
なー  2004-06-07 11:01:16  No: 83818  IP: [192.*.*.*]

私の説明不足でしょうか?

>描画は、PrinterObjectのオブジェクト名をPictureBoxに切り替えて
>印刷とプレビューを行っています。

>frmPrintでの処理
>    Call mobjPnt.cSubPnt(frmPreview.picDraw(0)) ←PrinterObjectで描画
(ややこしい書き方だったかもしれませんが、ここの引数にオプジェクト名を送り、picDraw(0)に描画しています。はみだしていますがPictureBoxにも一部描画されます。ここからpicDraw(1))にStretchBltすると何も表示されなくなります)

と書きましたように、BMPは使っていません。BMPを使った方法の方が
次ページ以降の描画がし易いかと思い、質問させてもらいました。

参考にさせていただいたURLは以下のところです。
http://www.galliver.co.jp/writing/nikkei_tokushu/prn908/
このプレビュー画面の作成方法で作りたいと思っていますがうまくいきません。

編集 削除
うにぃ  2004-06-07 11:21:44  No: 83819  IP: [192.*.*.*]

frmPreview.picDraw(0)のAutoRedrawプロパティはTrueになっていますでしょうか?

このプロパティがTrueになっていないと、描画内容が消えてしまいますので、
frmPreview.picDraw(0)のPaintイベントで再度描画をしてやらないとなりません。

編集 削除
NOK  2004-06-07 11:42:55  No: 83820  IP: [192.*.*.*]

それでしたら根本的にStretchBltを使うことが間違ってますね
StretchBltは転送もとのビットマップを拡大・縮小して転送先の
DCに書き込む動作をしています。
ビットマップができていないのであればStretchBltを使っても
何も転送されませんよ。

転送先のピクチャボックスにScaleを調整して描画する方が簡単でしょう

編集 削除
NOK  2004-06-07 12:20:13  No: 83821  IP: [192.*.*.*]

>転送先のピクチャボックスにScaleを調整して描画する方が簡単でしょう
というのはStretchBltを使うにしても

1.デバイスコンテキストを作成する
2.作成したデバイスコンテキストに希望のサイズのビットマップを割当てる
3.作成したデバイスコンテキストに描画処理を行う
4.StretchBltで表示させたいピクチャボックスに合うように拡大・縮小
    してビットマップを転送

という処理になるので、はじめから表示させたいピクチャボックスの
スケールモードをカスタムにして適当なScaleWidthとScaleHeightを
設定してやればいいのではということです。

編集 削除
なー  2004-06-24 13:53:37  No: 83822  IP: [192.*.*.*]

書込みが遅くなりました。

>ここからpicDraw(1))にStretchBltすると何も表示されなくなります
は、Form_Loadイベントの中で書いていたからでした。初歩的なミスです。。
描画・拡大縮小は実現出来ました。画像の一部のみですが。

nanashiさんがご回答下さったPictureBoxを使っての描画は、PictureBoxよりも
大きな画像になる場合のはみ出た部分の画像の保持の仕方が分かりませんでした。

それから、メモリデバイスコンテキストに描画するという方法ですが、
メタファイルやBitMapを作成するにしろ、どう描画するのか分かりません。
グラフィックスメソッドで描画するには、PrinterやPictureBoxのような
オブジェクトでないと描画出来ないような気もします。
未だ解決出来ずです。

編集 削除
水無月  2004-07-02 09:35:18  No: 83823  IP: [192.*.*.*]

すみません。APIを使わないやりかたなんですが、こんな方法を使ったことがあります。

Private sngSukusho as Single'表示のための縮小率
Private myObject as Object'表示ピクチャかプリンタかのための変数
と宣言し、
プレビュー表示開始する際にどっかで表示縮小率を計算し、sngSukusho に代入します。
プレビューで、たとえばPicture1に描画するなら
Set myObject = Picture1
プリンタならば 上のSet...の文章を書き換えます
そして sngSukusho = 1 としておきます

With myObject
    '*** 字を書く場合
    .Font = "MS ゴシック": .FontSize = 16 * sngSukusho
    .CurrentY = 60 * sngSukusho
    .CurrentX = 150 * sngSukusho
    myObject.Print "あいうえお"
    '*** ラインを書く場合
    myObject.Line (10* sngSukusho, 20* sngSukusho)-(10 * sngSukusho, 200* sngSukusho) 
    '*** 塗りつぶし四角を書く場合
    myObject.Line (10* sngSukusho, 20* sngSukusho)-(100 * sngSukusho, 200* sngSukusho) ,&H80000012&,B,F
....................(以降、後処理を書く)
End With

大雑把な感じでは以上です…
プレビューを等倍にするなら sngSukusho =1 とし、画像をスクロールさせる方法としては
スクロールヘルプのキーワード「スクロール可能なグラフィックス ビューポートの作成」
を参考にして下さい。

もし質問を外していたらごめんなさいですm(__)m

編集 削除