C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: VBで線画が上手くいきません


(過去ログ 96 を表示中)

[トピック内 22 記事 (1 - 20 表示)]  << 0 | 1 >>

■56769 / inTopicNo.1)  VBで線画が上手くいきません
  
□投稿者/ ダメなネコさん (1回)-(2011/01/31(Mon) 13:32:00)

分類:[.NET 全般] 

サイズW:924、H:638のFORM1に、
画像サイズW1000、H:1600を、
PictureBox1.SizeMode = PictureBoxSizeMode.Zoomを使って表示させます。
その画像にマウスを使ってw.FillEllipseで線画します。
そうするとマウスで指定した場所に線画してくれず、ズレてしまいます。
FORM1で200あたりを指定すると、
PictureBox1からの場所の200に線が出てしまいます。
STRECH−MODEは、不恰好だから
使うとダメだと言われました。
マウスと線の位置を一致させるために
どうしたらよいのでしょうか?
素人以下なので、文章が変で通じないかもしれません。
どなたかわかる方がいましたら、
教えてほしいのですが・・・。
引用返信 編集キー/
■56770 / inTopicNo.2)  Re[1]: VBで線画が上手くいきません
□投稿者/ shu (390回)-(2011/01/31(Mon) 13:45:19)
No56769 (ダメなネコさん さん) に返信

> PictureBox1.SizeMode = PictureBoxSizeMode.Zoomを使って表示させます。
こんなことをしないでDrawImageでリサイズして描画すればいいんじゃないかな?

引用返信 編集キー/
■56772 / inTopicNo.3)  Re[2]: VBで線画が上手くいきません
□投稿者/ ダメなネコさん (2回)-(2011/01/31(Mon) 15:07:19)
No56770 (shu さん) に返信
> ■No56769 (ダメなネコさん さん) に返信
>
>>PictureBox1.SizeMode = PictureBoxSizeMode.Zoomを使って表示させます。
> こんなことをしないでDrawImageでリサイズして描画すればいいんじゃないかな?
>
「DrawImageでリサイズ 」・・・???
素人なので全くわかりません。
w.FillEllipseで線画で線画しないといけないのです。
投稿ありがとうございました。

引用返信 編集キー/
■56773 / inTopicNo.4)  Re[1]: VBで線画が上手くいきません
□投稿者/ 魔界の仮面弁士 (2041回)-(2011/01/31(Mon) 15:28:56)
No56769 (ダメなネコさん さん) に返信
> FORM1で200あたりを指定すると、
> PictureBox1からの場所の200に線が出てしまいます。

座標の指定方法に問題があるのかも知れませんので、まずは
現象を再現可能な現状のソースコードを提示してみてください。


問題の発生しているコードはおろか、VB なのか C# なのかすら
書かれていない状況では、問題箇所を指摘する事さえできませんので…。
引用返信 編集キー/
■56774 / inTopicNo.5)  Re[3]: VBで線画が上手くいきません
□投稿者/ shu (392回)-(2011/01/31(Mon) 15:45:31)
No56772 (ダメなネコさん さん) に返信

> その画像にマウスを使ってw.FillEllipseで線画します。
これがなんだかわかりません。マウスダウンしてマウスアップするまで
マウスムーブ中、楕円をマウスポジションを中心に書いていくということですか?

書いた後にファイルに保存とかするのでしょうか?
PictureBoxのサイズは変更されたりするのでしょうか?

Graphics.ScaleTransformなどの座標変換が必要になるかもしれません。

引用返信 編集キー/
■56780 / inTopicNo.6)  Re[3]: VBで線画が上手くいきません
□投稿者/ PATIO (82回)-(2011/01/31(Mon) 18:29:15)
No56772 (ダメなネコさん さん) に返信
> 「DrawImageでリサイズ 」・・・???
> 素人なので全くわかりません。
> w.FillEllipseで線画で線画しないといけないのです。
> 投稿ありがとうございました。

素人なのになぜプログラミングをするハメになっているのかまではわかりませんが、
基本的に掲示板ではヒントはもらえても解決するのは自分になるので
分からないなら勉強しましょうとしか言えないです。
掲示板上でやり取りするにしてもある程度の知識は必要です。
掲示板上で一から十まで説明するわけにもいきません。
(基本的に掲示板で全てを説明するのはスペース的に無理です)

少なくとも全くわかりませんでは前に進めません。
VBの文法は少なくとも理解していないとプログラム自体を書けませんし、
言われているような画面描画のプログラムを書くためには
座標変換だの描画用のメソッドはどれを使えば良いだのと言った
グラフィック描画に関する知識が必要になるので
ラベルとかエディットコントロールにデータを設定すれば、
勝手に表示してくれると言うような話よりも一歩突っ込んだ知識が
要求されます。
時間がないとか諸々理由はあると思いますが、
知識がない人が掲示板で尋ねながら進めて行くのでは
相当時間が掛かると思うのでその辺も考慮に入れて検討された方が
良いかもしれません。

引用返信 編集キー/
■56782 / inTopicNo.7)  Re[2]: VBで線画が上手くいきません
□投稿者/ なし (21回)-(2011/01/31(Mon) 19:54:23)
No56769 (ダメなネコさん さん) に返信
>FORM1で200あたりを指定すると、
>PictureBox1からの場所の200に線が出てしまいます。

たぶん、PictureBox1のPointToClientメソッドを使って座標を変換する必要があるんだと思います。

' 今使われているのは画面の座標(マウスの座標)で、
Dim screenXY As New Point(200, 200)
' それをPictureBox1の座標に変換し、
Dim pictureboxXY As Point = PictureBox1.PointToClient(screenXY)
' このpictureboxXYで描画しては?
引用返信 編集キー/
■56784 / inTopicNo.8)  Re[3]: VBで線画が上手くいきません
□投稿者/ なし (23回)-(2011/01/31(Mon) 20:47:27)
補足ですが、PointToClientと対になる機能としてPointToScreenがあります。
フォームの座標をPictureBox1の座標に変換する場合は、次のように画面の座標を経由すると楽です。

Dim formXY As New Point(200, 200)
Dim screenXY = Me.PointToScreen(formXY)
Dim pictureboxXY = PictureBox1.PointToClient(screenXY)

関係なかったらごめんなさい。
Zoomが関係するのかなと思って試してみたのですが、そうじゃなさそうでしたので、ScaleTransformも関係ないかもと思って返信しました。

引用返信 編集キー/
■56786 / inTopicNo.9)  Re[4]: VBで線画が上手くいきません
□投稿者/ shu (393回)-(2011/01/31(Mon) 22:03:19)
2011/02/01(Tue) 08:53:34 編集(投稿者)
多分こんな感じ?Zoomは設定したままで出来そうでした。
Disposeは省いてありますmm

    Private bmp As Bitmap
    Private grp As Graphics
    Private m_blnDown As Boolean = False

    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        bmp = New Bitmap(PictureBox1.Width * 2, PictureBox1.Height * 2)   '<--- 分かりやすくするためPictureBoxの2x2倍の大きさにしてみた
        grp = Graphics.FromImage(bmp)
        grp.Clear(Color.White)
        grp.ScaleTransform(2, 2)    '<--- 2×2倍なのでScaleTransformで座標変換を指定
        PictureBox1.Image = bmp
        PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    End Sub

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        m_blnDown = True   '<--- MouseDownで描画開始
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If m_blnDown Then
            '--- マウスポジションを中心に半径2の円、Scaleがきくので実際は4になると思う。
            grp.FillEllipse(Brushes.Black, e.X - 2, e.Y - 2, 4, 4)    
            PictureBox1.Refresh()
        End If
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        m_blnDown = False   '<--- MouseUpで描画終了
    End Sub

引用返信 編集キー/
■56793 / inTopicNo.10)  Re[5]: VBで線画が上手くいきません
□投稿者/ shu (395回)-(2011/02/01(Tue) 08:46:49)
No56786 (shu さん) に返信
> 多分こんな感じ?Zoomは設定したままで出来そうでした。
> Disposeは省いてありますmm
>
> Private bmp As Bitmap
> Private grp As Graphics
> Private m_blnDown As Boolean = False
>
> Public Sub New()
>
> ' この呼び出しはデザイナーで必要です。
> InitializeComponent()
>
> ' InitializeComponent() 呼び出しの後で初期化を追加します。
> bmp = New Bitmap(PictureBox1.Width * 2, PictureBox1.Height * 2) '<--- 分かりやすくするためPictureBoxの2x2倍の大きさにしてみた
> grp = Graphics.FromImage(bmp)
> grp.Clear(Color.White)
> grp.ScaleTransform(2, 2) '<--- 2×2倍なのでScaleTransformで座標変換を指定
> PictureBox1.Image = bmp
> PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
> End Sub
>
> Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
> m_blnDown = True '<--- MouseDownで描画開始
> End Sub
>
> Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
> If m_blnDown Then
> '--- マウスポジションを中心に2×2の円、Scaleがきくので実際は4×4になると思う。
> grp.FillEllipse(Brushes.Black, e.X - 2, e.Y - 2, 4, 4)
> PictureBox1.Refresh()
> End If
> End Sub
>
> Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
> m_blnDown = False '<--- MouseUpで描画終了
> End Sub
引用返信 編集キー/
■56794 / inTopicNo.11)  Re[6]: VBで線画が上手くいきません
□投稿者/ shu (396回)-(2011/02/01(Tue) 08:50:25)
↑間違えて返信にしてしましました。こちらで削除出来ないので、削除お願いします。
引用返信 編集キー/
■56831 / inTopicNo.12)  Re[7]: VBで線画が上手くいきません
□投稿者/ ダメなネコさん (3回)-(2011/02/02(Wed) 16:04:24)
No56794 (shu さん) に返信
> ↑間違えて返信にしてしましました。こちらで削除出来ないので、削除お願いします。

削除の仕方が・・・

皆さん、本当にありがとうございます。
時間がなく、あれからVBを作っていません。
参考にして、時間のある際、検討してみます。
ありがとうございました。

引用返信 編集キー/
■56888 / inTopicNo.13)  Re[1]: VBで線画が上手くいきません
□投稿者/ 南場智子 (4回)-(2011/02/03(Thu) 20:08:05)
にゃお〜。
はじめまして!!^_^ok/
VB2010でよければ。どうぞ。はい。

Option Strict On
Option Explicit On

'VisualBasic2010(無料版)
'<<title>>お絵かき..Mini<</title>
'1__form1配置>pictureBox1,button1,button2
'2__すべてのコードを消してから、このコードのコピーを貼る
'1番2番の手順を間違えないように。
'説明>>
'クリックすると描画できます。もう1度クリックすると描画できません。
'Colorボタンで11色を選べます
'Sizeボタンで描画する点の大きさを変更できます
'最大描画数は3千個にしてありますが、増やせます。
'書き込まれたデータの抽出方法は今回はありません。(よく考えれば作れますよ)
'とりあえず2010(無料版)上ではバグは無いはずです。<バグ=エラー>

Public Class Form1

'入力データ格納配列
Const max_suu As Integer = 3000 '-----------------------|(最大描画点の数)
Dim Point_x(max_suu - 1) As Integer ' (横位置
Dim Point_y(max_suu - 1) As Integer ' (縦位置
Dim Color_(max_suu - 1) As Integer '入力データ用配列 (色
Dim Size_(max_suu - 1) As Integer ' (大きさ
Dim Counter_ As Integer = 0 '---------------------------|

Dim MouseClick_flag As Boolean = False 'true=描画Ok___false=描画不可
Dim byouga_msg As String = "描画不可..."
Dim Color_Ch As Integer = 0 '現在の指定色
Dim Size_Ch As Integer = 10 '現在の点の大きさ(最低の大きさ=3に設定)

Const my_color_suu As Integer = 11 '11種類の色
Dim my_ColorP(my_color_suu - 1) As Brush 'my_ColorPを宣言

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
data_clear()
Start_P()
my_color()
End Sub

Sub data_clear() '入力データオールリセット
For i = 0 To max_suu - 1
Point_x(i) = -1
Point_y(i) = -1
Color_(i) = 0
Size_(i) = 0
Next
Counter_ = 0
End Sub

Sub Start_P() 'コントロールプロパティ
With Me
.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedToolWindow
.Location = New Point(300, 100)
.Size = New Size(700, 500)
.BackColor = Color.Gray
End With
me_text()
With PictureBox1
.Size = New Size(600, 400)
.BackColor = Color.Black
.Location = New Point(50, 50)
' .BackgroundImage = My.Resources.gifu(背景画像を入れれば、下絵を見ながらお絵かきできる
End With
With Button1
.Size = New Size(80, 20)
.Location = New Point(30, 20)
.Text = "Colorチェンジ"
End With
With Button2
.Size = New Size(80, 20)
.Location = New Point(150, 20)
.Text = "Sizeチェンジ"
End With
End Sub

Sub my_color() '使用する色_ARGBは格納情報量が多いので使用しない
my_ColorP(0) = Brushes.Blue
my_ColorP(1) = Brushes.Red
my_ColorP(2) = Brushes.Yellow
my_ColorP(3) = Brushes.Green
my_ColorP(4) = Brushes.White
my_ColorP(5) = Brushes.Purple
my_ColorP(6) = Brushes.Aqua
my_ColorP(7) = Brushes.Pink
my_ColorP(8) = Brushes.DarkGray
my_ColorP(9) = Brushes.Orange
my_ColorP(10) = Brushes.Black
End Sub

Sub me_text() 'フォーム1のテキスト
Me.Text = byouga_msg & "Color=" & Color_Ch & "...Size=" & Size_Ch
End Sub

Sub pic_color(ByVal g As Graphics) '現在の指定色を表示
g.FillRectangle(my_ColorP(Color_Ch), 0, 0, 600, 10)
End Sub

Sub pic_data(ByVal g As Graphics) '配列格納データを参照してピクチャーボックスに表示する
For i = 0 To max_suu - 1
g.FillEllipse(my_ColorP(Color_(i)), Point_x(i), Point_y(i), Size_(i), Size_(i))
Next
End Sub


Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
'ピクチャーボックス1マウスクリックイベントハンドラ(描画できるかどうかの処理)
If MouseClick_flag = True Then
MouseClick_flag = False : byouga_msg = "描画不可..."
Else
MouseClick_flag = True : byouga_msg = "描画OK..."
End If
me_text()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'ボタン1クリックイベントハンドラ(色変更処理)
Color_Ch += 1 : If Color_Ch = 11 Then Color_Ch = 0
me_text()
PictureBox1.Invalidate()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'ボタン2クリックイベントハンドラ(点の大きさ変更処理)
Size_Ch += 1 : If Size_Ch = 51 Then Size_Ch = 10
me_text()
End Sub

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
'ピクチャーボックス1ペイントイベントハンドラ
Dim p_g As Graphics = e.Graphics
p_g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias '描画を綺麗にする
pic_data(p_g) 'データ内容通り表示
pic_color(p_g) '色バーを表示
End Sub

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If MouseClick_flag = False Then Exit Sub
Dim x As Integer = e.X : Dim y As Integer = e.Y
x -= CInt(Size_Ch / 2) : y -= CInt(Size_Ch / 2) 'マウスの中心値を計算処理する
Point_x(Counter_) = x '横位置データを格納
Point_y(Counter_) = y '縦位置データを格納
Color_(Counter_) = Color_Ch '色を格納
Size_(Counter_) = Size_Ch 'サイズを格納
Counter_ += 1 '配列のカウントを1つ増やす
If Counter_ = max_suu Then '_________描画最大数をオーバーした時の処理
Counter_ -= 2 : MsgBox("これ以上描画できません")
MouseClick_flag = False : byouga_msg = "描画不可..."
me_text()
End If
PictureBox1.Invalidate() 'ピクチャ-イベントを発生させる
End Sub

End Class
引用返信 編集キー/
■56889 / inTopicNo.14)  Re[2]: VBで線画が上手くいきません
□投稿者/ shu (405回)-(2011/02/03(Thu) 21:40:58)
No56888 (南場智子 さん) に返信


> Const max_suu As Integer = 3000 '-----------------------|(最大描画点の数)
> Dim Point_x(max_suu - 1) As Integer ' (横位置
> Dim Point_y(max_suu - 1) As Integer ' (縦位置
> Dim Color_(max_suu - 1) As Integer '入力データ用配列 (色
> Dim Size_(max_suu - 1) As Integer ' (大きさ
> Dim Counter_ As Integer = 0 '---------------------------|
>
> Dim MouseClick_flag As Boolean = False 'true=描画Ok___false=描画不可
> Dim byouga_msg As String = "描画不可..."
> Dim Color_Ch As Integer = 0 '現在の指定色
> Dim Size_Ch As Integer = 10 '現在の点の大きさ(最低の大きさ=3に設定)
>
> Const my_color_suu As Integer = 11 '11種類の色
> Dim my_ColorP(my_color_suu - 1) As Brush 'my_ColorPを宣言


この辺は全部Dimや省略ではなくPrivateとした方が分かりやすいです。

引用返信 編集キー/
■57178 / inTopicNo.15)  Re[3]: VBで線画が上手くいきません
□投稿者/ ダメなネコさん (4回)-(2011/02/16(Wed) 15:48:24)
皆さん、ありがとうございます。
でも・・・全く理解出来ませんでした、ごめんなさい。
皆さんが書いた、いろんなコンピュータ用語?をあてはめてみたものの・・・。
相変わらず、矢印(カーソル?)と線の位置が合わないのです。
画像サイズはwidth1200 height500、
width500 height1200・・・などなど、
両方とも、矢印から離れた場所に線画されてしまいます・・・。
全然わからないので、「プログラム」を添えます。
素人以下の私でも、対応出来る方がいましたら、
よろしくお願いします。

わかる人がいたら天才だと思います・・・



Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim h, w As Integer
'ディスプレイの作業領域の高さ()
h = System.Windows.Forms.Screen.GetWorkingArea(Me).Height
'ディスプレイの作業領域の幅
w = System.Windows.Forms.Screen.GetWorkingArea(Me).Width

Me.Width = w
Me.Height = h


'ピクチャーボックスの大きさ
PictureBox1.Width = w - 100
PictureBox1.Height = h - 100


(500×1200の画像読み込み)

PictureBox1.Image = System.Drawing.Image.FromFile("C:\Documents and Settings\main\デスクトップ\ww500hh1200.JPG")


'縦長はつぶれて画面いっぱいに不恰好に入る(使うとダメだそうです)
'PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

'縦長はサイズいっぱいで画面に入る
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom

End Sub



Private Sub picturebox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
Dim pos As Point
Dim img As Image = PictureBox1.Image
    Dim g As Graphics = PictureBox1.CreateGraphics

If PictureBox1.Image Is Nothing Then
Else
g = Graphics.FromImage(PictureBox1.Image)
End If

If e.Button = MouseButtons.Left Then
pos.X = e.X * img.Width / PictureBox1.Width
pos.Y = e.Y * img.Height / PictureBox1.Height
g.FillEllipse(Brushes.Red, pos.X, pos.Y, 10, 10)

ElseIf e.Button = MouseButtons.Right Then
pos.X = e.X * img.Width / PictureBox1.Width
pos.Y = e.Y * img.Height / PictureBox1.Height
g.FillEllipse(Brushes.Blue, pos.X, pos.Y, 10, 10)
End If
PictureBox1.Refresh()
End Sub

End Class
引用返信 編集キー/
■57185 / inTopicNo.16)  Re[4]: VBで線画が上手くいきません
□投稿者/ shu (445回)-(2011/02/16(Wed) 16:34:12)
2011/02/16(Wed) 17:00:50 編集(投稿者)
2011/02/16(Wed) 16:58:35 編集(投稿者)
2011/02/16(Wed) 16:53:18 編集(投稿者)

No57178 (ダメなネコさん さん) に返信

> If e.Button = MouseButtons.Left Then
> pos.X = e.X * img.Width / PictureBox1.Width
> pos.Y = e.Y * img.Height / PictureBox1.Height
> g.FillEllipse(Brushes.Red, pos.X, pos.Y, 10, 10)
>
> ElseIf e.Button = MouseButtons.Right Then
> pos.X = e.X * img.Width / PictureBox1.Width
> pos.Y = e.Y * img.Height / PictureBox1.Height
> g.FillEllipse(Brushes.Blue, pos.X, pos.Y, 10, 10)
> End If
〜.width / 〜.Widthを 〜.Height / 〜.Heightでどうでしょう?
横の位置が中央に表示されているようならさらにxにその分をマイナスする必要があります。(PictureBox1.Width -(img.Width * PictureBox1.Height / img.Height) / 2 だと思う)

引用返信 編集キー/
■57218 / inTopicNo.17)  Re[5]: VBで線画が上手くいきません
□投稿者/ ダメなネコさん (5回)-(2011/02/17(Thu) 15:56:36)
>
>> If e.Button = MouseButtons.Left Then
>> pos.X = e.X * img.Width / PictureBox1.Width
>> pos.Y = e.Y * img.Height / PictureBox1.Height
>> g.FillEllipse(Brushes.Red, pos.X, pos.Y, 10, 10)
>>
>> ElseIf e.Button = MouseButtons.Right Then
>> pos.X = e.X * img.Width / PictureBox1.Width
>> pos.Y = e.Y * img.Height / PictureBox1.Height
>> g.FillEllipse(Brushes.Blue, pos.X, pos.Y, 10, 10)
>> End If

shuさん、ありがとうございます!
ごめんなさい。全然理解できなかったので、
とりあえず・・・
pos.X = e.X * img.Width / PictureBox1.Width
pos.Y = e.Y * img.Height / PictureBox1.Height
この2行を
pos.x = e.x * (PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height) / 2)
pos.Y = e.Y * (PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height) / 2)
にして実行したら、線が全く出なくなりました。
来週、考える時間があったら、
また挑戦します。
ありがとうございました。


引用返信 編集キー/
■57220 / inTopicNo.18)  Re[6]: VBで線画が上手くいきません
□投稿者/ shu (452回)-(2011/02/17(Thu) 16:40:56)
No57218 (ダメなネコさん さん) に返信

'Dim pos as Point    '<--- Pointとして使用するとこないので不要
Dim X as Integer
Dim X2 as Integer
Dim Y as Integer

・・・・

X2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)
X = CInt((e.X - X2) * img.Height / PictureBox1.Height)
Y = CInt(e.Y * img.Height / PictureBox1.Height)
If e.Button = MouseButtons.Left Then
    g.FillEllipse(Brushes.Red, X-5, Y-5, 10, 10)
else
    g.FillEllipse(Brushes.Blue, X-5, Y-5, 10, 10)
end if 


縦長の場合です。横長とかPictureBoxより小さい場合はまた処理が変わります。

-----

縦長、横長両対応

        Dim x As Integer
        Dim x2 As Integer
        Dim y As Integer
        Dim y2 As Integer

        ・・・・

        x2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)
        y2 = CInt((PictureBox1.Height - (img.Height * PictureBox1.Width / img.Width)) / 2)

        If x2 > 0 Then
            x = CInt((e.X - x2) * img.Height / PictureBox1.Height)
            y = CInt(e.Y * img.Height / PictureBox1.Height)
        Else
            x = CInt(e.X * img.Width / PictureBox1.Width)
            y = CInt((e.Y - y2) * img.Width / PictureBox1.Width)
        End If

        If e.Button = MouseButtons.Left Then
            g.FillEllipse(Brushes.Red, x, y, 10, 10)
        ElseIf e.Button = MouseButtons.Right Then
            g.FillEllipse(Brushes.Blue, x, y, 10, 10)
        End If


引用返信 編集キー/
■57372 / inTopicNo.19)  Re[7]: VBで線画が上手くいきません
□投稿者/ ダメなネコさん (6回)-(2011/02/24(Thu) 14:53:43)
No57220 (shu さん) に返信

shuさん!いつも本当にありがとうございます!

縦長、横長両対応のプログラムで実行したら・・・
なんと、矢印と線が一致していました!!
ビックリしました!!!
ただ、残念なことに、点が1つ表示されるだけで、
線画が出来ないのです。
たぶん、自分自身の前後のプログラムに、
問題があると思うので検討しています。

そして、ひとつ、質問があるのですが・・・

PictureBox1.SizeMode = PictureBoxSizeMode.Zoomを使って表示させた
画像の大きさや、四隅の位置(座標というのでしょうか?)を
調べるには、どうしたらよいのでしょうか?
わかるようでしたら、教えてほしいのですが・・・

また来週、プログラムを検討します・・・

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




引用返信 編集キー/
■57375 / inTopicNo.20)  Re[8]: VBで線画が上手くいきません
 
□投稿者/ shu (472回)-(2011/02/24(Thu) 15:41:49)
No57372 (ダメなネコさん さん) に返信

> ただ、残念なことに、点が1つ表示されるだけで、
> 線画が出来ないのです。
> たぶん、自分自身の前後のプログラムに、
> 問題があると思うので検討しています。
線と言っているのにFillEllipseを使うと書いてあったので変だと思ってたのですが
線を引くならDrawLineを使います。開始点と終了点が必要になるので
開始点クリック時の動き、終了点クリックまでの動き、終了点クリック時の動きをそれぞれ
どう表現するかで処理が変わってきます。


>
> PictureBox1.SizeMode = PictureBoxSizeMode.Zoomを使って表示させた
> 画像の大きさや、四隅の位置(座標というのでしょうか?)を
> 調べるには、どうしたらよいのでしょうか?
> わかるようでしたら、教えてほしいのですが・・・

左上:(x2, 0)
幅:(img.Width * PictureBox1.Height / img.Height)
高:(img.Height * PictureBox1.Height / img.Height)
または
左上:(0,y2)
幅:(img.Width * PictureBox1.Width / img.Width)
高:(img.Height * PictureBox1.Width / img.Width)
のどちらかです。
PictureBox内の座標ですよね?

実際の画像は左上(0,0)で幅img.width, 高img.heightです。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -