Pictureを高速プレビューするには?

解決


走れメロス!  2001-05-20 11:24:04  No: 74344  IP: [192.*.*.*]

現在お絵かきソフトを作成中です。
Pictureに色々と描けるようにしているのですが、
直線描画でつまずきました。
クリックで始点を選択し、ドラッグしている間は描く直線のプレビューが表示されて、
クリックを離すと描く直線が決定して描画する、という基本的なものです。
Pictureを二つ用意して、ドラッグされるたびに(描く直線のプレビューが変化するたびに)
再描画してなんとか実現できたのですが、
pictureのサイズを大きくすると(800×600)処理が間に合わないようで、ぎこちない動作になってしまいます。
サイズを大きくしてもなめらかにプレビューが表示されるようにするにはどうしたらいいのでしょうか?
参考までに、メモリ196MB、CPU500MHzです。お願いいたします。

編集    削除
PAPY  2001-05-22 19:33:02  No: 74345  IP: [192.*.*.*]

VBの場合はグラフィックが弱いのでAutoRedrawをFalseにして描画する方法を行わないとダメだと思います。

(描画する方法)
その都度にビットマップを作成してPictureに代入するなど・・

編集    削除
こころ  URL  2001-05-27 09:16:36  No: 74346  IP: [192.*.*.*]

何か、スペックがすごいんですが・・・。
あくまで、こころのマシンと比べて。

プレビューをどのように処理されているのか、
また、線の形状がどのようなものかわかりませんので
思ったことを適当に書いておきます。

転送はBitBlt,StretchBltを使うといいでしょう。
転送する際、再描画が必要な部分等計算してもいいかもしれません。
画像が大きくても転送範囲が狭ければ高速です。

ピクチャーボックスにプレビューサイズの原画を設定すれば
clsの後にラインを描画すれば、簡単ですね。

また、描画更新もドラッグする度に行うよりも
タイマー等で定期的に行った方がいいかもしれません。
マウスの移動イベントはかなりの回数来ますので。

編集    削除
走れメロス!  2001-05-28 09:28:56  No: 74347  IP: [192.*.*.*]

PAPYさん、こころさん、レスありがとうございました。
今度API使用&タイマーで挑戦してみます。
今までどんな方法でやろうとしていたか詳しく書きますと、
ちょっと(かなり?)強引な方法でして、
・PictureBoxを二つ用意する
(一つはお絵かき用のキャンバス、もう一つはダミーかつ非表示)
で、直線描画する前の画像をダミーのPictureBoxに格納して、
    Picture2.Height = Picture1.Height
    Picture2.Width = Picture1.Width
    Picture2.Picture = Picture1.Image
マウスをドラッグしている間、
    Picture1.Picture = Picture2.Image
    Picture1.Line (最初の座標)-(X, Y), Label9.BackColor
をひたすら繰り返します(マシンの悲鳴が聞こえそう・・・)
PictureBoxのサイズが400×400ぐらいなら対応できるのですが、
あまり大きくすると、ぎこちない動作になってしまいました。
やはりAPIを使わないと苦しいですか。頑張ってみます。
実はまだ一度もVBでAPIを使用したことがありません。
これからAPI初体験・・・

編集    削除
こころ  URL  2001-05-29 06:06:01  No: 74348  IP: [192.*.*.*]

非表示の画像保持に、PictureBoxを使わないでやるには
CreateCompatibleDC
CreateCompatibleBitmap
SelectObject
DeleteObject
等のAPIを使用します。
別に使わなくてもいいんですが、参考までに。

編集    削除
走れメロス!  2001-06-01 02:02:54  No: 74349  IP: [192.*.*.*]

VBで初めてAPIを使ってみました。
Bitblt使用であっけなく解決しました。
APIの使用に関しては、ここのサイトの「API技術関連」ページを参考にさせていただきました。
PAPYさん、こころさん、どうもありがとうございました!

編集    削除