Picturebox上で画面をちらつかせず十字線を描くには?

解決


トム  2005-03-21 04:17:08  No: 88954

VB6.0上でグラフを描いておりますが、マウスポインタに追従した、十字線を描くために、Picture1_Mousemove イベントを利用し、マウス座標が変わる毎に、マウスポインタ位置での十字線描画とグラフの描画を行っています。

これをやるとマウスを多量に動かしたとき、当然ながらグラフ描画による画面のちらつきが発生してしまいます。

これを画面のちらつきが発生しないように、十字線を描くことは可能でしょうか?
また、巷のグラフ描画などのものは、C言語等で描かれていて、同じ処理をやっていてもちらつきが発生しない程高速ということなのでしょうか?

どなたかご教示よろしくお願いします。


ぬるぽ  2005-03-21 04:19:10  No: 88955

Refresh()してるぅ?


トム  2005-03-21 04:52:05  No: 88956

回答ありがとうございます。

Refreshとはどういう使い方をすればよろしいですか?
初歩的な質問ですみません。よろしくお願いします。


トム  2005-03-21 05:04:35  No: 88957

一応、Picture1.AutoRedraw = True とすることで、解決しましたが、
Refresh および AutoRedrawの具体的な使い方を教えていただけないで
しょうか?


ぬるぽ  2005-03-21 05:34:06  No: 88958

自分で調べてるかな?
解決できてるのなら、後は自分で調べれるでしょ?


トム  2005-03-24 04:05:00  No: 88959

再度すみません。

上記のように、Form1.Picture1.AutoRedraw = True とすればとりあえず
解決はしましたが、VBの処理が遅いのか、巷のソフトのように滑らかに
十字線(十字カーソル)が動きません。
滑らかに動かすために、何か良い方法はないでしょうか?
ご教示ください。


みい  2005-03-24 22:44:07  No: 88960

私の場合はDrawModeをvbNotXorPen(うろ覚え。とにかく反転の描画モード)にして
十字カーソルを描いています。
で、カーソルが動いたら前回位置と今回位置にカーソルを描画しています
(反転で描画するので同じ線を描く事により線が消える)。


特攻隊長まるるう  2005-03-24 23:46:56  No: 88961

というか原因は十字線の描画処理じゃないんだよね?
グラフ描画の処理(関数?)が重いってだけじゃないの?
それ作ったの誰?その関数を呼び出してるの誰?
そのヒトの問題じゃないの?

>また、巷のグラフ描画などのものは、C言語等で描かれていて、
>同じ処理をやっていてもちらつきが発生しない程高速という
>ことなのでしょうか?
必要最小限の部分だけ再描画してるだけじゃないの?
少なくとも MouseMove なんて頻繁に起こるイベント内で
全ての描画処理を0から始めるような処理を呼び出してしまう
ようなプログラムでない事は確実。そんな変なプログラムでも
作らない限りちらつかないと思うけどなぁ。

質問に詳しいプログラム構造が書かれてないから完全には
判断できないけど、そんなにちらつくような処理に思えない。
描画速度の問題じゃなくてプログラム構造の問題じゃないの?

どっちにしろ、決定的な原因を追求せずに、結果だけ示して
どうにかしてくれ的な書込みしてもレスなんか付かないよ。


通りすがり  2005-03-25 11:50:08  No: 88962

今私は、VB.NETで
黒板方式(その場で消して書く)
→紙芝居方式(裏で書いておいて差し替える)
で対応してますが、VB6って
それやろうとするとむずいんだったっけ・・?


トム  2005-03-25 20:26:16  No: 88963

いろいろご回答いただきありがとうございました。

その後さらに調べましたが、ぬるぽさんご指摘のRefreshを入れると、
大分滑らかになりました。
ただし、この際にこつがあり、
Form1.Refresh --> Form1.Picture1.Refresh
とするとちらつきがなくなりました。(初歩的ミスですみません。)

まとめると
■Form1.Picture1.AutoRedraw = False
■Picture1_MouseMoveイベント内に
  ・グラフ描画
  ・Form1.Picture1.Refresh

とし、ほぼ滑らかになりました。
(完全に滑らかではなく、座標がかなりとぶと一瞬カーソルが消えますが、
  これはこの方が個人的には便利なので、初期の目的は達成と思っています。)

ありがとうございました。


トム  2005-04-01 07:03:36  No: 88964

更に追加です。

上記のPicture1.MouseMoveイベント内に記述する
Form1.Picture1.Refreshを2回記述すれば
完全に滑らかになりました。
(十字カーソル描画の前後に入れています。)

ご参考まで。


トム  2006-01-03 02:10:35  No: 88965

その後、同じことをやる必要に迫られ、再度調べましたが、
上記の  みいさんのおっしゃる方法が最も高速かつ簡単であることが
判明しました。
参考までに調べたことを以下にまとめます。
■DrawMode = 7 (vbXorPen) または 10 (vbNotXorPen)  を指定
■この状態で、同じ図形を2度描けば、1度目は描く図形が得られ、
  2度目は元の背景図に戻る。
  
  ★ただし、1度目は背景と描くパターンが一致する場合はそこのビット
    は表示されない。カラーならば色が変わる。

この方法を用いると十字線の色は指定できないようです。
DrawMode = 7 (vbXorPen)     ---> 十字線は灰色
DrawMode = 10 (vbNotXorPen) ---> 十字線は黒色
になりました。

もし間違いがあればどなたかご指摘いただければ幸いです。

以上ご参考まで。


名無し  2006-01-03 16:42:16  No: 88966

Xorの意味はわかりますか?

>この方法を用いると十字線の色は指定できないようです。
というのを見て、ちょっと…と思ったのですが。
背景とラインの描写色でXorを取った色が描写されるわけです。
だから再度同じところに同じ描写色でXorのラインを描けば元に戻るだけですよ。
論理演算の基本ですから皆さんご存知のことですけどね…。


トム  2006-01-03 20:11:17  No: 88967

ご指摘ありがとうございます。論理演算はわかっているつもりなのですが、元に戻るのが良く分かりません。すみませんがもう少し詳しく教えていただけないでしょうか。よろしくお願いします。


名無し  2006-01-04 16:04:58  No: 88968

再度「Xor」について勉強してください。


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

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






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