• ベストアンサー

VB で作図

VBで作図しているのですが、どうしても  矢印 "→","←" の作図に時間が掛かります VBの標準機能で"→"矢印を作図する方法があるのでしょうか? また無い場合、何か便利なツールが御座いませんでしょうか? 初歩的な質問で申し訳御座いません 宜しくお願い申し上げます

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

また勝手な思い込みでプログラムを作ってみました。 Lineというのはメソッドではなく、コントロールかと思い、 Option Explicit Dim OB As Object Private Sub Form_Activate() Set OB = Form1 PrintArrow Line1(0), False, True PrintArrow Line1(1), True, False PrintArrow Line1(2), True, True PrintArrow Line2, True, True End Sub Sub PrintArrow(Ln As Line, SArrow As Boolean, EArrow As Boolean) Dim Ang As Integer '矢印の角度 Dim Lng As Integer '矢印の長さ Dim a As Single 'xの距離 Dim b As Single 'yの距離 Dim TS As Single 'Sin(Ang) Dim TC As Single 'Cos(Ang) Dim PI As Single '円周率 Dim xx1 As Integer Dim yy1 As Integer Dim xx2 As Integer Dim yy2 As Integer With Ln If (SArrow = True Or EArrow = True) Then PI = 3.14159265358979 Ang = 30 Lng = 200 a = .x2 - .x1 b = .y2 - .y1 TS = Sin(Ang * PI / 180) TC = Cos(Ang * PI / 180) xx1 = Lng / Sqr(a ^ 2 + b ^ 2) * (a * TC + b * TS) yy1 = Lng / Sqr(a ^ 2 + b ^ 2) * (b * TC - a * TS) xx2 = Lng / Sqr(a ^ 2 + b ^ 2) * (a * TC - b * TS) yy2 = Lng / Sqr(a ^ 2 + b ^ 2) * (b * TC + a * TS) If (SArrow = True) Then OB.Line (.x1, .y1)-(.x1 + xx1, .y1 + yy1) OB.Line (.x1, .y1)-(.x1 + xx2, .y1 + yy2) End If If (EArrow = True) Then OB.Line (.x2, .y2)-(.x2 - xx1, .y2 - yy1) OB.Line (.x2, .y2)-(.x2 - xx2, .y2 - yy2) End If End If End With End Sub としてみました。 これは、ちょっとインチキのような気もしますが・・・ Lineコントロールをフォームに貼り付けてLineのみ作っておいて プログラムを実行するときに、矢印部分のみ線画するという方法です。 Form_Activateイベントに PrintArrow [Lineコントロール名],[LineコントロールのX1,Y1側の矢印の線画(True/False)]    ,[LineコントロールのX2,Y2側の矢印の線画(True/False) のように書いてください(例をのせてあります) これも違うようでしたら、また補足してください。

その他の回答 (6)

回答No.6

ちょっと仕様が見えてきません。 プログラムで矢印を書くのでは無くて、実行中に矢印を書きたいのでしょうか? それとも、プログラムに矢印を書く作業で、先回答のX1,Y1,X2,Y2を求めるのが大変ということでしょうか? それとも、プログラムを作成している時に、矢印を表示したいのでしょうか? もう少し、どの工程で何をしたいのか、具体的に教えていてだければ打つ手もあると思いますが、 こちらの勝手な思い込みで作ってもしかたないので、補足していただけますか? そもそもNao0さんのおっしゃる「開発時」とは、プログラム開発時の事ですか?

回答No.5

ちょっと状況が分かりませんが、 記述するイベントはどこですか? Form_Loadイベントへの記述でしたら FormのAutoRedrawプロパティをTrueにしてみてください。 それ以外でしたら、コーディング内容を補足に書き足して頂けますか? 私の方では、現象が起こりません。

nao0
質問者

補足

大変分かりにくく申し訳御座いません 作図に時間が掛かるといいますのは、プログラムが実行されるまでの時間ではなく 開発時にformに矢印の絵を書くのに手間がかかり、プログラムで矢印を描画できないかな?と思いご質問させて頂きました 矢印の向きも様々でできれば、角度をプログラム上、定数とする仕様の関数があればいいなぁ?または、VBでこのような仕様および設定方法がありばと思い、 勝手をいい申し訳御座いません 以上、宜しくお願い申し上げます

回答No.4

>例えば line 機能を用いて先端のみを→に換えれるとか という事で関数を作ってみました。 今作ったので、ある程度テストはしましたが、おかしな場合は、ご了承を。 Sub PrintArrow(x1, y1, x2, y2) Dim Ang As Integer '矢印の角度 Dim Lng As Integer '矢印の長さ Dim a As Single 'xの距離 Dim b As Single 'yの距離 Dim TS As Single 'Sin(Ang) Dim TC As Single 'Cos(Ang) Dim PI As Single '円周率 Dim xx As Integer Dim yy As Integer PI = 3.14159265358979 Ang = 30 Lng = 200 a = x2 - x1 b = y2 - y1 TS = Sin(Ang * PI / 180) TC = Cos(Ang * PI / 180) Picture1.Line (x1, y1)-(x2, y2) xx = Lng / Sqr(a ^ 2 + b ^ 2) * (a * TC + b * TS) yy = Lng / Sqr(a ^ 2 + b ^ 2) * (b * TC - a * TS) Picture1.Line (x2, y2)-(x2 - xx, y2 - yy) xx = Lng / Sqr(a ^ 2 + b ^ 2) * (a * TC - b * TS) yy = Lng / Sqr(a ^ 2 + b ^ 2) * (b * TC + a * TS) Picture1.Line (x2, y2)-(x2 - xx, y2 - yy) End Sub フォームにということなので、picture1→Form1に変更してください。 ScaleMode は1-Twipに・・・ 他の場合は Lng=200を10位に変更してください。 片方向矢印のみ対応(X2,y2)側です。 Angは矢印の角度、Lngは矢印の長さです。変更してみてください。 指定は、[PrintArrow 1000, 2000, 2000, 1000]のようなかんじで・・・

nao0
質問者

お礼

試みてみたのですが線がひけません???? clickイベント関数内に直接書くといけるのですが call PrintArrow で実行すると線がひけません・・・ どうしてでしょうか? お手数で御座いますが教えて頂けないでしょうか

回答No.3

再びNo.2のものです。 >しかし、多数の→矢印をフォームに書こうとしておりまして 少し手間かなと感じご質問させて頂きました 矢印の数が多ければ、VBでペーストして配置を整えるより、 例えばExcelで複数の矢印を描画し、全部選択してこれをコピー&ペーストするほうが効率的かもしれません。 例えばExcelで複数の矢印を描画し、 図形描画ツールバーのオブジェクトの選択で、複数の矢印を選択し、図形の調整で、配置を整列させて、 (あるいは、一つの矢印をCtrlキーとShiftキーを押しながらドラッグ&ドロップ) したあと、図形描画ツールバーのオブジェクトの選択で、複数の矢印を選択し、コピー&ペーストすれば、より効率的に作業できるかもしれませんね。 既にやってらしたら蛇足でした。・・・・m(__)m

回答No.2

ExcelやWordで矢印を描画し、これをクリップボードにコピーして貼り付けるのはいかがでしょうか? イメージの非連結OLEになるとは思いますが、これの背景を透明、境界線色も透明にすれば簡単にできると思います。 もっと簡単な方法や標準的な方法もあるかと思いますがご参考まで。

nao0
質問者

お礼

ご回答有難う御座います 現在、教えていただきました手法とよく似た方法でしております しかし、多数の→矢印をフォームに書こうとしておりまして 少し手間かなと感じご質問させて頂きました

  • ahoojpn
  • ベストアンサー率53% (7/13)
回答No.1

Labelプロパティで"→","←"の書かれたラベルを作っておき、それをコピーして貼り付ける、というのはどうでしょうか。

nao0
質問者

お礼

ご回答有難う御座います 今、そのようにしているのですが 例えば line 機能を用いて先端のみを→に換えれるとか いうVB標準の機能はないのかな? と思いご質問させて頂きました

関連するQ&A