質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

3050閲覧

VB.NETのPictureBoxのスクロールで発生した不具合(?)の解決

obaq

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/12/20 15:41

前提・実現したいこと

VB.NETのPictureBoxのスクロールで発生した不具合(?)の解決をしたいです。
※他に代替案があればご教示願います。

発生している問題・エラーメッセージ

VB.NETのPanelにPictureBoxを配置し、BitMap画像を描画。
その画像を水平スクロールバーでスクロールする際に
スクロールバーの移動値分、PictureBoxの位置をずらして
スクロールを実現している。
ところが、PictureBoxのサイズがある範囲(-32768 ~ +32767)を越えると
スクロールが不可能になる。
※下記のコードであれば、PictureBox.Leftに-32768以下の数値を設定不可能となり、
それ以上先にスクロールができない。

該当のソースコード

フォーム作成し、そこに500×200くらいのPanelを配置。
その下に、HScrollBarを配置

VB.NET

1Imports System 2Imports System.Drawing.Printing 3 4Public Class Form1 5 6 Private pic1 As PictureBox 7 8 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 9 10 '画像設定 11 pic1 = New PictureBox 12 pic1.Size = New Size(40000, Panel1.Height) 13 pic1.Location = New Point(0, 0) 14 Panel1.Controls.Add(pic1) 15 Dim bm1 As New Bitmap(pic1.Width, pic1.Height) 16 Dim g As Graphics = Graphics.FromImage(bm1) 17 18 'スクロールが分かりやすいように目盛を描画 19 For index = 0 To 40000 Step 100 20 g.DrawString(index.ToString(), New Font("MS ゴシック", 10), Brushes.Black, index, 100) 21 Next 22 23 'リソースを解放する 24 g.Dispose() 25 26 '作成した画像を表示する 27 pic1.Image = bm1 28 29 '水平スクロールバーの設定 30 HScrollBar1.Maximum = 40000 31 HScrollBar1.SmallChange = 100 32 HScrollBar1.LargeChange = 1000 33 34 35 End Sub 36 37 Private Sub HScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles HScrollBar1.Scroll 38 39 '左にスクロール 40 If e.Type = ScrollEventType.LargeDecrement OrElse e.Type = ScrollEventType.SmallDecrement Then 41 pic1.Left = pic1.Left + (e.OldValue - e.NewValue) 42 Return 43 End If 44 '右にスクロール 45 If e.Type = ScrollEventType.LargeIncrement OrElse e.Type = ScrollEventType.SmallIncrement Then 46 pic1.Left = pic1.Left - (e.NewValue - e.OldValue) 47 Return 48 End If 49 50 51 End Sub 52End Class

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

WM_MOVE message

The low-order word contains the x-coordinate while the high-order word contains the y coordinate.

x 座標 y 座標ともにワード(-32768~32767)という Windows の制限があります。

投稿2018/12/20 22:12

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/12/20 22:51

解決方法はいろいろあると思いますが、私なら PictureBox に巨大な画像を入れるのをやめてスクロールバーの値に合わせて画像の該当する部分を描画するようにします。
obaq

2018/12/22 13:18

ご回答ありがとうございます。こんな制限があるとは知りませんでした。
guest

0

Windowsのメッセージによる制限だと思われます。
Control.Left等の位置、サイズに関わるプロパティはintで宣言されていますが
WM_MOVEやWM_SIZE等のWindowsメッセージはLParamの上位、下位で位置や大きさを表現し、shortの範囲の値しかとれない形になります。

このため、大きいコントロールの場合は、複数のコントロールを繋げてそれらしく見えるようにするしかないのではないかと思います。

もしくは、ビットマップを直接描画する形にすれば、この制限にはかからないと思います。

投稿2018/12/20 22:55

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

obaq

2018/12/22 12:56

ご回答ありがとうございます。こんな制限があるとは知りませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問