電子書籍の厳選無料作品が豊富!

いつもお世話になっております。
VBAでオシロスコープのような表示をさせたいです。
継続的に発生する数値データをX方向に時系列に数値の量をY方向に
線でグラフのように表示させたいと思い、フォーム内にフォームの横
幅と同じフレームを置いて、このフレームにデータにあったY方向に
点表示させるループを作成しようと思います。

フォームに点表示させることは、できたのですが、フレームに表示さ
らせれず困っています。

フォームの場合は、フォームのハンドルを取得しハンドルからフォー
ムのデバイスコンテキストを取得する。

'Formのデバイスコンテキストを取得
F_Handle = FindWindow(vbNullString, UserForm1.Caption)
hF_DC = GETDC(F_Handle)

SetPixelV hF_DC、x座標、Y座標、色 で点表示されます。

フレームの場合、デバイスコンテキスト取得の記述方法がわかりません。

尚、表示したあと、フレームを左方向に移動させ、近接した2つ目の
フレームをフォームの左端から同時に左方向に移動させながら点表示
させることによってオシロスコープのような表示ができると思ってい
ます。

2つのフレーム(ラベルでもイメージでも、移動さえることができる
コントロールならなんでもいいです)のそれぞれのデバイスコンテキ
ストを取得する方法をお教えいただけないでしょうか。
よろしくお願いします。

A 回答 (2件)

最新のデータをまず最右端で描画し、


そのx座標を左にずらしていけば同じことができるのではないでしょうか?

例えば、
const X = 0, Y = 1, WIDTH = (画面の横幅)
Dim cnt = 0

‘data配列の初期化

Function Draw()
For i = 0 To cnt
data( i, Y ) = data( i, Y ) - 1

‘もし0以下なら表示しない

Next

‘データの取得

data(cnt, X) = (最新のデータ)
data(cnt, Y) = WIDTH
cnt = cnt + 1

‘点の描画

End Function

残念ながら私はフレームのコンテキストを取得する方法は知りません。
しかし、このようにすれば、(修正は必要ですが)今質問者さんが持っている情報だけでもやりたいことができるはずです。
    • good
    • 0
この回答へのお礼

再度のアドバイスありがとうございます。
お示し頂いた方法で、試してみました。1ループの中で全体の描画済の点
を1ピクセルだけシフトして再表示する方法でうまくいきました。

但し、シフトしたデータの全体の再表示前に前回表示した点を消す(フォ
ームのBackColorで点描画)する作業が必要になり、倍の作業時間がかか
ってしまうのと画面のチラツキが目立ちます。
もうしばらく、フォーム上のコントロールのデバイスコンテキストを取得
する方法をご教示いただける方の投稿をお待ちしたいと思います。
また、X1,Y1からX2,Y2へ線をひける(旧VB6のLINEのような)APIがあ
ればベストなのですが・・・・。

お礼日時:2019/09/19 20:28

フォーム内では点が打てているので、


フレームをいくつも用意してオシロスコープを再現するよりも、次の点の位置を計算していって再現すればいいのではないでしょうか?

的外れだったらすみません。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
実際のオシロのように既に表示した軌跡が右から左へ流れていき
常に最新のデータの位置(Y軸)が最右端に表示されるような表現がしたいため
既に点表示されたコントロール自身を左方向に移動させることによって軌跡全体
が同時に左へ流れるような仕様が出来ればと思っています。

お礼日時:2019/09/18 20:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!