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

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

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

Re[7]: マウスホイールで画像の拡大縮小


(過去ログ 108 を表示中)

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

■64286 / inTopicNo.1)  マウスホイールで画像の拡大縮小
  
□投稿者/ yama (1回)-(2012/11/21(Wed) 21:01:59)

分類:[VB.NET/VB2005 以降] 

2012/11/21(Wed) 21:04:43 編集(投稿者)
vb2010です。
PanelにPictureBoxを入れて、
パネルのマウスホイールイベントでピクチャーボックスの拡大縮小しようと思っています。

パネルのポイントした位置をピクチャーボックスに連動させ、
画像のポイント位置を固定した状態で画像サイズを拡大縮小したいのですが、
以下のコードでは、マウスホイールの回転1回目のみ位置がずれてしまいます。

どこが間違っているのでしょうか?
よろしくお願いいたします。

Public Class Form1

    Dim MyWide As Single
    Dim MyHeight As Single
    Dim MyLeft As Single
    Dim MyTop As Single


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

         With PictureBox1
            .SizeMode = PictureBoxSizeMode.Zoom
            .Image = Image.FromFile(ファイルパス)

            MyWide = .Width
            MyHeight = .Height
            .Left = Panel1.Width / 2 - .Width / 2
            .Top = Panel1.Height / 2 - .Height / 2
            MyLeft = .Left
            MyTop = .Top
        End With

    End Sub

    Private Sub Panel1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseWheel
        Dim RateX As Single
        Dim RateY As Single
        Dim 倍率 As Single

        RateX = e.X / Panel1.Width
        RateY = e.Y / Panel1.Height
        If e.Delta > 0 Then
            倍率 = 1.1
        Else
            倍率 = 0.9
        End If

        With PictureBox1
            MyWide = MyWide * 倍率
            MyHeight = MyHeight * 倍率
            .Width = MyWide
            .Height = MyHeight
            MyLeft = e.X - .Width * RateX
            MyTop = e.Y - .Height * RateY
            .Left = MyLeft
            .Top = MyTop
        End With
    End Sub

End Class

引用返信 編集キー/
■64297 / inTopicNo.2)  Re[1]: マウスホイールで画像の拡大縮小
□投稿者/ howling (90回)-(2012/11/22(Thu) 11:25:16)
No64286 (yama さん) に返信
んー、VB初めて触りました(笑
なんでできなかったんだろうね???
RateXとYが謎っていうのと、
ロケーション位置が左上固定だったので、ずらしてみました。
普通にできたんだけど、原因がわからん…。
しかし、変数名が日本語って普通なのかなぁ?
VBやってないからわからんけど、キモかったーw

Public Class Form1

Dim MyWide As Single
Dim MyHeight As Single
Dim MyLeft As Single
Dim MyTop As Single



Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim RateX As Single
Dim RateY As Single
Dim 倍率 As Single

RateX = PictureBox1.Width
RateY = PictureBox1.Height
If e.Delta > 0 Then
倍率 = 1.1
Else
倍率 = 0.9
End If

With PictureBox1

MyWide = MyWide * 倍率
MyHeight = MyHeight * 倍率
.Width = MyWide
.Height = MyHeight
MyLeft -= (.Width - RateX) / 2
MyTop -= (.Height - RateY) / 2
.Left = MyLeft
.Top = MyTop
End With
End Sub


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

MyWide = .Width
MyHeight = .Height
'ロケーションはデザイナでやってます。
MyLeft = .Left
MyTop = .Top

End With
AddHandler MouseWheel, AddressOf Form1_MouseWheel

End Sub

End Class

引用返信 編集キー/
■64301 / inTopicNo.3)  Re[2]: マウスホイールで画像の拡大縮小
□投稿者/ yama (2回)-(2012/11/22(Thu) 17:16:31)
2012/11/22(Thu) 17:17:41 編集(投稿者)

howlingさま、ご回答ありがとう御座います。

>普通にできたんだけど、原因がわからん…。

今、試させて頂きましたが、こちらでは1回目の回転時のズレと云うより
連続して一定のズレが出ているように思いますが・・・

説明しにくいんですが、
例えば人の顔の写真を読み込み、目の瞳部分でマウスホイールを回転させると、
拡大でも縮小でもマウスの位置から目の瞳が離れないという状態にしたいのです。


>しかし、変数名が日本語って普通なのかなぁ?

洋画を見る時など字幕どころか日本語吹き替えじゃないと内容が理解できないタイプなんです。(^^;)
引用返信 編集キー/
■64302 / inTopicNo.4)  Re[3]: マウスホイールで画像の拡大縮小
□投稿者/ ヴァン (18回)-(2012/11/22(Thu) 17:35:16)
こんにちは。

> >しかし、変数名が日本語って普通なのかなぁ?
>
> 洋画を見る時など字幕どころか日本語吹き替えじゃないと内容が理解できないタイプなんです。(^^;)

ここに反応。
とあるプロジェクトを複数人でやったのですが、日本語使うと判りやすかったですよ。
意味不明な英単語の羅列より。

でもそれだけじゃなんなので、

>拡大でも縮小でもマウスの位置から目の瞳が離れないという状態にしたいのです。

難しい計算じゃないから、エクセル使ってデータがどの様に変化するかシミュレートして、
その結果と比較してみるのはどうでしょうか?

引用返信 編集キー/
■64303 / inTopicNo.5)  Re[4]: マウスホイールで画像の拡大縮小
□投稿者/ howling (92回)-(2012/11/22(Thu) 17:42:59)
ヴァン さん

> とあるプロジェクトを複数人でやったのですが、日本語使うと判りやすかったですよ。

そうかもしれない。
普段見慣れていないだけで、実際書いてあること自体はすぐわかりますからね。
慣れないからキモい…となってしまうだけで^^;

yamaさん

なるほど、だいぶ勘違いしていました。
そのホイールしたポイントを中心に拡大・縮小するんですね。
てっきり全体を拡大or縮小すればいいものだとばかり…。
前述のコードは忘れてください。すみません。
どうすればいいのかなぁ?
1回目ってあたり、前回の値を引き継ぐような何かの初期値がおかしいだけな気がするんですが。
なので、Loadメソッド内が怪しいのかなーとか思ってます。最初しか呼ばれないですし。
今ちょっと時間が無いもので、やれないのが残念。すみませんお役に立てず(涙
引用返信 編集キー/
■64311 / inTopicNo.6)  Re[5]: マウスホイールで画像の拡大縮小
□投稿者/ yama (3回)-(2012/11/22(Thu) 19:58:35)
ヴァン さん

ご理解いただき感謝します。
日本語じゃないと微妙なニュアンスが伝わらない事もありますよね。

エクセルじゃないけど値のシミュレーションはやってみたんだけど現時点では原因解明には至らないんです。


howling さん、

>今ちょっと時間が無いもので、やれないのが残念。すみませんお役に立てず(涙

まったくの趣味ですから急いでいるわけでもありません、お気になさらないでください。
又何かお気づきの点だどありましたらよろしくお願いいたします。m(_ _)m
引用返信 編集キー/
■64313 / inTopicNo.7)  Re[6]: マウスホイールで画像の拡大縮小
□投稿者/ yama (4回)-(2012/11/23(Fri) 00:07:15)
希望している動作と同じ結果になるサンプルを見つけました。
Graphicsを対象とPictureBox1を対象にする違いはありますが。
C#のソースコードなので私は理解できません。

PictureBox1を対象にする方が簡単な気がするんですが、
VBだとどんなコードになるのでしょうか?
よろしくお願いいたします。

http://imagingsolution.blog107.fc2.com/blog-category-17.html
引用返信 編集キー/
■64317 / inTopicNo.8)  Re[7]: マウスホイールで画像の拡大縮小
□投稿者/ yama (5回)-(2012/11/23(Fri) 17:50:41)
難しく考え過ぎていたようです。
あっけなく解決してしまいました。(^^;)

お付き合いくださいました皆様、ありがとう御座いました。

Public Class Form1

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

        With PictureBox1
            .SizeMode = PictureBoxSizeMode.Zoom
            .Image = Image.FromFile(ファイルパス)
        End With
    End Sub

    Private Sub Panel1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseWheel
        
        Dim 倍率 As Single
        Dim MyPointx As Single
        Dim Mypointy As Single

        If e.Delta > 0 Then
            倍率 = 1.1
        Else
            倍率 = 0.9
        End If

        With PictureBox1

            MyPointx = e.X - .Left
            Mypointy = e.Y - .Top

            .Width = .Width * 倍率
            .Height = .Height * 倍率
            .Left = e.X - MyPointx * 倍率
            .Top = e.Y - Mypointy * 倍率

        End With

    End Sub

End Class

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -