• 締切済み

同じ長方形を連続してが描けません。

Microsoft visual basic 6.0 を使って図形を描いているのですが、タイトル通り同じ大きさの長方形が描けません。 フォームにPictureBoxを貼り付けフォームをロードすると一定間隔の塗りつぶした長方形をPictureBox全体に描くようにプログラムを作っています。 プログラムソースは以下の通り簡単なものです。 Private Sub Form_Load() Picture1.Scale (0, 1000)-(1000, 0) For i = 1 To 100 Picture1.Line (0, (i - 1) * 10)-(1000, (i - 1) * 10 + 3), 0, BF Next i End Sub Private Sub Command1_Click() End End Sub このようにして実行すると実際現れる長方形は、高さがバラバラな長方形が描かれます。 これはどうしてでしょうか? また、高さが一定な長方形を連続して描く場合はどうしたらよいのでしょうか? PCのOSは、WindowsXP HomeEdition です。

みんなの回答

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.2

VBが無いので確認できませんが、整数に丸められた時の誤差じゃないですか? (0, 1000)-(1000, 0)の座標系で4ピクセル分の高さの長方形を描いているようですが、実際表示されるときにはPicture1の画面での座標系(Width, Height)に合わせて拡大・縮小されるわけで、その時小数部が丸められたせいで、1ドット分の誤差が出ているのだと思います。 VBがアンチエイリアスをしてくれていれば問題無いわけですが。 Picture1.Line (0, (i - 1) * 10)-(1000, (i - 1) * 10 + int(3 * Picture1.Height / 1000) * 1000 / Picture1.Height), 0, BF ぐらいでできないですかね。

回答No.1

Picture1.Line (0, (i - 1) * 10)-(1000, (i - 1) * 10 + 3), 0, BF Picture1.Line (0, (i - 1) * 10)-(1000, (i - 1) * 10 ), 0, BF 「+ 3」を削除すれば、斜めになることはないですが。

gotkat667
質問者

補足

回答されている通りただ線を引くだけであるのならば「+3」を消せばいいだけです。ただ、ここでの質問は、線が斜めになることではなく、「同じ長方形を描くようにプログラムを組んでいるけど実行すると同じ長方形は描けない。これはどうして?」ということです。 しかし、Pictureのscaleいっぱいに長方形を描くのであれば、[drawwidth]を指定して水平な線を描くと確かに長方形を描けますが、この場合詳細な長方形の高さの指定は、できないこともないですが、かなり面倒になります。 そして、もしこれがPictureのscaleいっぱいに描かないのであれば、そのLineの端は丸みを帯びたものになり使えません。 また、この質問に載せているソース以外にPictureの[Fillstyle]を指定し、閉じたLineを描いて長方形を描いてみても結果は同じく、高さのばらばらな長方形が描かれるだけでした。

関連するQ&A

  • Picture1.Printとしてもpicture1には何も表示されません

    Private Sub Form_Load() Call kansu End sub --------------------------- Private Sub kansu() a="文字" Picture1.Print a End sub --------------------------- のように、pictureコントロールに 文字を入れる処理をする関数を呼んでいるのですが、 Formが表示されてもpicture1には何も表示されません。 Msgboxを入れておくとメッセージボックスが出るので 呼び出されてはいるようなのです。 この関数をCommand1_Click()などから呼ぶとpicture1コントロールに ちゃんと表示されます。 どうすればよいのでしょうか?

  • VBについて教えてください。初心者です。

    日系ソフトウェアの参考書で勉強しているのですが、FORMのLOADイベントは動作を開始するとほぼ最初に発生するイベントって書かれているのですが、どうやったら発生するのか解らないのです。 Private sub form_load() Dim i% DIm J$ J% = weekday(date$) if J% = 1 then d$ = "(日)" elseif J% = 2then と、言うようにend subのところまで最後まで参考書にのってるプログラムをきちんと書いたのですが、実行してもなんにもおこらずなのです。 このプログラムはタイトルバーに日付け、曜日、時刻を表示するプログラムらしいのですが、いったいどうしたらよろしいのでしょうか・・?。 そもそも、Private sub form_load()は、自分で打ち込むものですか?コマンドボタンを押してウィンドウを開くと自動的にPrivate sub command1_click()って出てきますが、それといっしょじゃないのですか? ご存知の方はぜひぜひお教えください。よろしくお願いいたします。ちなみにツールはXPのエクセルの中に入ってるVBツールです。フォームをダブルクリックすると Private sub userform_Clickって出てきます。

  • 配列の値を渡す

    (VB.NET2003) Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click Dim a(0) As Integer ・・・略 IF ・・・ a(0) = 1 ←"この値をピクチャーボックス2へ渡す" ・・・略 End Sub Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click Dim b(0) As Integer ・・・略 IF ・・・ b(0) = 1 IF b(0) >= a(0) Then ←"ココにa(0)の値を渡す" このプログラムは深く考えなくていいです。 IF文を使ってるから・・・など。 ・・・略 End Sub 上記の通り、ピクチャーボックス1、a1(0)の値を、 ピクチャーボックス2の処理にa(0)の値を渡す"プログラム"を教えてください┏○

  • 挿入されている画像をクリアする(VB.2003)

    VB.NET2003 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ピクチャーボックス1~2のイメージをクリア For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} picBox.Image = Nothing Next 'ピクチャーボックス3~4にイメージを設定 PictureBox3.Image = Image.FromFile("C:\image03.jpg") PictureBox4.Image = Image.FromFile("C:\image04.jpg") End Sub Private Sub PictureBox3to4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox3.Click, PictureBox4.Click For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} If picBox.Image Is Nothing Then picBox.Image = sender.Image Exit Sub End If Next End Sub 上記は、ピクチャーボックス3~4のどれかが押されるとピクチャーボックス1に押された画像が挿入され、 次にピクチャーボックス3~4のどれかが押されると次はピクチャーボックス2に押された画像が挿入されるプログラムなのですが、 ボタン1を押すと、元に戻す「ピクチャーボックス1、2に挿入されている画像があればクリアする」プログラムを 作りたいのですが、サッパリ分かりません。 どなたかご教授願います┏○

  • どこにどの画像が入ったか判定してくれるプログラム(VB.NET2003)

    VB.NET2003 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ピクチャーボックス1~2のイメージをクリア For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} picBox.Image = Nothing Next 'ピクチャーボックス3~4にイメージを設定 PictureBox3.Image = Image.FromFile("C:\image03.jpg") PictureBox4.Image = Image.FromFile("C:\image04.jpg") End Sub Private Sub PictureBox3to4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox3.Click, PictureBox4.Click For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} If picBox.Image Is Nothing Then picBox.Image = sender.Image Exit Sub End If Next End Sub 上記は、ピクチャーボックス3~4のどれかが押されるとピクチャーボックス1に押された画像が挿入され、 次にピクチャーボックス3~4のどれかが押されると次はピクチャーボックス2に押された画像が挿入されるプログラムなのですが、 あるカードゲームの役判定をするため、どこにどの画像が挿入されたか判定するプログラムを作りたいのですが、 (例えば、ピクチャーボックス1にピクチャーボックス3の画像が挿入されているのなら「1-3」、4なら「1-4」です。と出力する) 難しすぎて全く分かりません・・・。  どなたかご教授願いします┏○

  • 表示プログラムについて

    テキストの中の”あいうえお”のような文章を表示させるプログラムを作りたいんですが Private Sub Command1_Click() Open "c:\mydata\test.txt" For Input As #1 End Sub Private Sub Command2_Click() Close #1 End Sub では表示されませんでした。何がおかしいかとかどうすればいいか教えてください。お願いします。

  • アクセスフォームのサイズの調整について

    一つは全画面表示(Maximize)で開きもう一つは普通の表示(Restore)で開くには? フォーム1とフォーム2があります。画像をご覧ください。 フォーム1は Private Sub Form_Load() DoCmd.Maximize End Sub で、 フォーム2は Private Sub Form_Load() DoCmd.Restore End Sub としてます。 フォーム1にコマンドボタンを設置して、 Private Sub フォーム2を開く_Click() DoCmd.OpenForm "フォーム2" End Sub として、フォーム2を開くのですが、 フォーム2が開くとフォーム1まで、元の大きさに戻ってしまいます。 行いたいことは、 フォーム1は全画面表示、フォーム2は、ノーマルな表示(全画面でも最小化でもない) にしたいのですが、不可能なのでしょうか?

  • AccessVBAにおけるOpenArgsの使用について

    AccessVBAを最近はじめた初心者です。 ~~~フォーム1~~~ Private Sub コマンド0_Click() DoCmd.OpenForm "フォーム2", , , , , , "コマンド0" End Sub Private Sub コマンド1_Click() DoCmd.OpenForm "フォーム2", , , , , , "コマンド1" End Sub ~~~フォーム2~~~ Private Sub Form_Load() Dim strFormName As String strFormName = Forms.フォーム1.OpenArgs DoCmd.PrintOut strFormName End Sub 上のプログラムのようにフォーム1でクリックしたボタンによってフォーム2を読み込んだ時の動作を変えるプログラムを作成しようとしています。 しかし、実際に起動させると、『strFormName = Forms.フォーム1.OpenArgs』の辺りで 「Null の使い方が不正です。」 というエラーメッセージが表示されます。 Accessのヘルプを参照に組んでみたのですが、どの箇所が間違っているのでしょうか? 回答、よろしくお願いします。

  • 【VB6.0】 あるフォームから他のフォームへ値を受け渡したい

    タイトルの通り、あるフォームから他のフォームに値の受け渡しを行いたいのですが、どのようにしたらよいのでしょうか?? 以下のようなコードできんのかなぁ~~って、やったみだけど、 むりでした。。サンプルコード内でいうParamsのような値を 受け渡しさせたいのですが・・・。ご存知の方、申し訳ないですが 教えて頂けると非常にありがたいです。それと、、私はVB初心者です。 ---FormA--- Public Params as new Params Private sub Command1_Click() Call Me.Hide FormB.Show vbModeless, Me End sub ---FormB--- Private Sub Form_Load() 'Owner.Paramsのような形で参照できるかと思ったができませんでした。 End sub

  • [VB6]オーナーウィンドウを設定したShowメソッド

    こんにちは。 XP(SP2),VB6(SP6)で 親フォーム -> 子ダイアログ -> 孫ダイアログを表示する処理を作成し実行すると、 子ダイアログを閉じた際、親フォームが他のアプリケーションの下 にもぐってしまいます。 (例えばメモ帳上で実行して、子ダイアログを閉じた時にメモ帳の下に隠れてしまう、デバッグ時ならばVBの下に隠れる) 孫ダイアログを表示させずに、子を閉じるとこの様に減少は起こりません。 なぜこの様になるのでしょうか? 又、回避策はあるでしょうか?ご存じの方、教えてください。 以下、現象再現用のテストプログラムです。 親フォーム Private Sub Command1_Click() dlg1.Show vbModeless, Me End Sub 子ダイアログ(dlg1) Private Sub Command1_Click() dlg2.Show vbModal, Me End Sub Private Sub CancelButton_Click() Unload Me End Sub 孫ダイアログ(dlg2) Private Sub CancelButton_Click() Unload Me End Sub

専門家に質問してみよう