[リストへもどる]
一括表示

投稿時間:2004/06/02(Wed) 10:15
投稿者名:ken.1
Eメール:
URL :
タイトル:
PictureBoxでズーム・スクロールする
┌───┐↑
│      │
│  絵  │
│      │
└───┘↓
←Hスクロール→
←ズーム→

はじめまして、VB駆け出しのken.1と申します。
上記のように一定の枠内でイメージファイルを拡大縮小・スクロールを実現したいのですが
こちらのサンプルを見てもいまいち理解できません;
どなたか分かりやすくご教授いただけないでしょうか

投稿時間:2004/06/02(Wed) 11:46
投稿者名:ken.1
Eメール:
URL :
タイトル:
Re: PictureBoxでズーム・スクロールする
うあ、環境も何も書いてないですね…失礼しました
VB6 SP5 での開発環境です。
説明不足申し訳ありませんでした。

投稿時間:2004/06/02(Wed) 15:33
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^2: PictureBoxでズーム・スクロールする
http://www.bcap.co.jp/hanafusa/VBHLP/gra_image.htm このサンプルが
貴方にとって、方程式に見えるのなら、足し算・引き算から初めて下さい。
まずは、サンプルを動かして、色々いじって、解らない部分は、ヘルプで
調べ、理解するようにして下さい。
その上で、ヘルプのこの部分の記載内容が解らないとか、この部分をこうするには
どうしたらいいのかと言った具体的な質問をするようにして下さい。

投稿時間:2004/06/02(Wed) 16:14
投稿者名:ken.1
Eメール:
URL :
タイトル:
Re^3: PictureBoxでズーム・スクロールする
> http://www.bcap.co.jp/hanafusa/VBHLP/gra_image.htm このサンプルが
> 貴方にとって、方程式に見えるのなら、足し算・引き算から初めて下さい。
> まずは、サンプルを動かして、色々いじって、解らない部分は、ヘルプで
> 調べ、理解するようにして下さい。
> その上で、ヘルプのこの部分の記載内容が解らないとか、この部分をこうするには
> どうしたらいいのかと言った具体的な質問をするようにして下さい。

そのように小バカにした表現しかできないのなら結構です。
width, heightの位置, 表示サイズの変更くらいは分かります。
ちょっと下手にでれば素人扱いでそのような物言いですか?
ついでにそちらのサンプルはイメージコントロールのように見受けられるのですがいかがでしょうか?
板汚し失礼しました。こちらの全ての方がこのような方ばかりではないと信じております。

投稿時間:2004/06/03(Thu) 08:15
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^4: PictureBoxでズーム・スクロールする
> そのように小バカにした表現しかできないのなら結構です。
別に小バカにしたつもりはありませんが、表現がまずくお気を悪くされたのなら
お詫び致します。

>こちらのサンプルを見てもいまいち理解できません;
>どなたか分かりやすくご教授いただけないでしょうか

結構注釈もつけて解りやすいようにと書いたつもりです。
百聞は一見にしかずといいます。見ても解らないと言われればどう答えればいいのでしょうか
ましてや、拡大・縮小について解らないのか、スクロールについて解らないのか、が私には
判断できませんでした。
せめて、どこの、どの部分が解らないからもう少し詳しく教えて下さいとでも書いて
あれば、それに対して答えられたのですが。
従って、サンプルを動かして、色々いじって、解らない部分は、ヘルプで
調べ、理解するようにして下さい。
としか回答ができませんでした。

> width, heightの位置, 表示サイズの変更くらいは分かります。
> ちょっと下手にでれば素人扱いでそのような物言いですか?
> ついでにそちらのサンプルはイメージコントロールのように見受けられるのですがいかがでしょうか?

私は、貴方と面識がありませんので、貴方の質問内容からしか貴方のレベルが判断できません。
従って、画像処理の一番簡単なイメージコントロールのサンプルを理解して頂ければ、拡大・縮小
や移動等の基本的や方法が理解して頂けるのではないかと紹介したのですが。

最初の質問内容からは、次に投稿されたコードまで出来ているとは誰も想像できないと
思います。

>上記のコードでスクロール機能は実装できているかのように見せられると思っています。
>ズームとの兼ね合いに苦戦していますが、根本的な作りに問題があるかと思ったのですがね

これにしても、どこに問題があって、どこが解らないのか、どのようにしたいのか?が
読み取れないのは、私だけでしょうか?
それともコードを動かして何処に問題があるか調べよと言う事でしょうか。

当サイト(掲示板)をご利用頂いている以上は、[はじめにお読み下さい]や掲示板の
[注意事項]は読んでからご利用頂いたものとして回答しております。

表現やたとえ方が悪かった点はお詫び致します。

投稿時間:2004/06/03(Thu) 11:48
投稿者名:ken.1
Eメール:
URL :
タイトル:
Re^5: PictureBoxでズーム・スクロールする
こちらも申し訳ありませんでした、業務が進まずイライラしていました。
で、ある程度理解でき目標の形に近い形になってきました。サンプル助かりました。
以下のコードでは再描画の際のチラつきが気になるのですが何か妙案はないでしょうか?

↓ピクチャボックスを3個・HScrollを2個・VScrollを1個貼り付けてイメージファイルを指定して実行すれば動く…はず
フォームのリサイズに合わせて描画領域のリサイズも行っています。
フォームサイズを小さくしすぎるとこけるのは未対応な状況です。
------------------------------------------------------------------------
'画像のオリジナルサイズ
Dim lngOrgHeight As Long
Dim lngOrgWidth As Long

'スクロールバーで一度に進む距離(基本値)
Dim pointHeight As Long
Dim pointWidth As Long

'イニシャライズ中かのFLG
Dim iniFlg As Boolean

'ズーム・移動を一度に処理
Private Sub swichPicture()

    'イニシャライズ中は逃げる
    If iniFlg Then Exit Sub

    Dim p1sw    As Long     'picture3.ScaleWidth
    Dim p1sh    As Long     'picture3.ScaleHeight
    
    Dim newPointWidth   As Double
    Dim newPointHeight  As Double
    
    ZoomS = HScroll2 * 10
    
    newPointWidth = pointWidth * (ZoomS / 100)
    newPointHeight = pointHeight * (ZoomS / 100)
    '元の画像サイズを取得して、拡大縮小サイズを求める
    With Picture3
        p1sw = .ScaleWidth * (ZoomS / 100)
        p1sh = .ScaleHeight * (ZoomS / 100)
    End With
    
    'コピー先のサイズを設定する
    With Picture2
        .Cls
        'スクロール表示処理(実際にはコントロールを移動しサイズを変更している)
        .Left = Picture1.Left - newPointWidth * (HScroll1.Value - 1)
        .Width = Picture1.Width + newPointWidth * (HScroll1.Value - 1)
        .Top = Picture1.Top - newPointHeight * (VScroll1.Value - 1)
        .Height = Picture1.Height + newPointHeight * (VScroll1.Value - 1)
        DoEvents
        '元画像をサイズ変更して picture2 にコピー
        .PaintPicture Picture3.Picture, 0, 0, p1sw, p1sh
    End With
    
End Sub

Private Sub Form_Activate()
    Call swichPicture
End Sub

Private Sub Form_Load()

    '画像ファイルの設定
    Set Picture3.Picture = LoadPicture("イメージファイル")

'--位置等のイニシャライズ------
    iniFlg = True
    With HScroll1
        .Min = 1
        .Max = 20
        .Value = 1
    End With
    With HScroll2
        .Min = 1
        .Max = 20
        .Value = 10
    End With
    With VScroll1
        .Min = 1
        .Max = 20
        .Value = 1
    End With
    Picture1.BackColor = &HFFFFFF
    Picture2.BackColor = &HFFFFFF
    With Picture3
        .Visible = False
        .AutoSize = True
    End With
    With Form1
        .Height = 7500
        .Width = 8500
    End With
    iniFlg = False
'------------------------------
    
    'オリジナルのサイズを格納
    lngOrgHeight = Picture3.ScaleHeight
    lngOrgWidth = Picture3.ScaleWidth
    'スクロールバーで一度に進む距離を設定
    pointHeight = lngOrgHeight / 20
    pointWidth = lngOrgWidth / 20
    
    Call swichPicture
    
End Sub

Private Sub Form_Resize()
    
    'Picture1 の位置の基本値
    With Picture1
        .Top = -100
        .Left = -100
        .Height = Form1.Height - Picture1.Top - 1500
        .Width = Form1.Width - Picture1.Left - 500
    End With

    'HScroll1 横スクロールバーの基本値
    With HScroll1
        .Top = Picture1.Height + Picture1.Top
        .Left = 0
        .Height = 300
        .Width = Picture1.Width + Picture1.Left
    End With

    'VScroll1 縦スクロールバーの基本値
    With VScroll1
        .Top = 0
        .Left = Picture1.Width + Picture1.Left
        .Height = Picture1.Height + Picture1.Top
        .Width = 300
    End With
    
    'HScroll2 ズームバー
    With HScroll2
        .Top = Picture1.Height + Picture1.Top + 700
        .Left = 0
        .Height = 300
        .Width = Picture1.Width + Picture1.Left - 2100
    End With
    
    Call swichPicture
    
End Sub

Private Sub HScroll1_Change()
    Call swichPicture
End Sub

Private Sub VScroll1_Change()
    Call swichPicture
End Sub

Private Sub HScroll2_Change()
    Call swichPicture
End Sub

投稿時間:2004/06/03(Thu) 13:03
投稿者名:Renard
Eメール:
URL :
タイトル:
Re^6: PictureBoxでズーム・スクロールする
> こちらも申し訳ありませんでした、業務が進まずイライラしていました。
> で、ある程度理解でき目標の形に近い形になってきました。サンプル助かりました。
> 以下のコードでは再描画の際のチラつきが気になるのですが何か妙案はないでしょうか?

> Private Sub swichPicture()
      Picture2.Visible = False      '<-----追加
>     'イニシャライズ中は逃げる
    略
      'DoEvents                         '<------コメントアウト
>     End With
      Picture2.Visible = True       '<-----追加
> End Sub

> Private Sub Form_Load()
>
>     '画像ファイルの設定
>     Set Picture3.Picture = LoadPicture("イメージファイル")
>
> '--位置等のイニシャライズ------
>     iniFlg = True
>     With HScroll1
>         .Min = 1
>         .Max = 20
>         .Value = 1
>     End With
>     With HScroll2
>         .Min = 1
>         .Max = 20
>         .Value = 10
>     End With
>     With VScroll1
>         .Min = 1
>         .Max = 20
>         .Value = 1
>     End With
>     Picture1.BackColor = &HFFFFFF
>     Picture2.BackColor = &HFFFFFF
      Picture2.AutoRedraw = True        '<-----追加
>     With Picture3
>         .Visible = False
>         .AutoSize = True
>     End With
>     With Form1
>         .Height = 7500
>         .Width = 8500
>     End With
>     iniFlg = False
> '------------------------------
>    
>     'オリジナルのサイズを格納
>     lngOrgHeight = Picture3.ScaleHeight
>     lngOrgWidth = Picture3.ScaleWidth
>     'スクロールバーで一度に進む距離を設定
>     pointHeight = lngOrgHeight / 20
>     pointWidth = lngOrgWidth / 20
>    
>     Call swichPicture
>    
> End Sub

これでちらつきは押さえられると思います。

あと、私見ですがスクロールのイベントは
Changeではなく、Scrollイベントの方が、いいかもしれません。
スクロールバーをドラッグしたときに、リアルタイムで動きます。

【修正】
すみません。
swichPictureプロシージャのDoEventsをコメントアウトするのを忘れてました。

投稿時間:2004/06/03(Thu) 14:11
投稿者名:ken.1
Eメール:
URL :
タイトル:
Re^7: PictureBoxでズーム・スクロールする
お世話になります。
AutoRedrawプロパティの変更でチラつきがいくらか抑えられたように思います。ありがとうございました
ですが結局、スクロール, ズームの度に再描画する設計がおかしい気がむんむんします(笑
またスクロールの制御ですが、Change, Scroll 双方で拾う形でやってみようと思います。
かなり冗長性たっぷりになりましたがマシンパワーに頼ってみます(苦汗

↓こんな感じでいってみます。長々とすいませんでした。
ピクチャボックスを3個・HScrollを2個・VScrollを1個貼り付けてイメージファイルを指定して実行すれば動く…はず
フォームのリサイズに合わせて描画領域のリサイズも行っています。
'画像のオリジナルサイズ
Dim lngOrgHeight As Long
Dim lngOrgWidth As Long

'スクロールバーで一度に進む距離(基本値)
Dim pointHeight As Long
Dim pointWidth As Long

'イニシャライズ中かのFLG
Dim iniFlg As Boolean

'ズーム・移動を一度に処理
Private Sub swichPicture()
    Dim p1sw    As Long     'picture3.ScaleWidth
    Dim p1sh    As Long     'picture3.ScaleHeight
    Dim newPointWidth   As Double
    Dim newPointHeight  As Double
    
    'イニシャライズ中は逃げる
    If iniFlg Then Exit Sub
    
    Zooms = HScroll2 * 10
    
    newPointWidth = pointWidth * (Zooms / 100)
    newPointHeight = pointHeight * (Zooms / 100)
    '元の画像サイズを取得して、拡大縮小サイズを求める
    With Picture3
        p1sw = .ScaleWidth * (Zooms / 100)
        p1sh = .ScaleHeight * (Zooms / 100)
    End With
    
    'コピー先のサイズを設定する
    With Picture2
        'スクロール表示処理(実際にはコントロールを移動しサイズを変更している)
        .Left = Picture1.Left - newPointWidth * (HScroll1.Value - 1)
        .Width = Picture1.Width + newPointWidth * (HScroll1.Value - 1)
        .Top = Picture1.Top - newPointHeight * (VScroll1.Value - 1)
        .Height = Picture1.Height + newPointHeight * (VScroll1.Value - 1)
        '元画像を参照しサイズ変更して picture2 を再描画
        .Cls
        DoEvents
        .PaintPicture Picture3.Picture, 0, 0, p1sw, p1sh
    End With
    
End Sub

Private Sub Form_Activate()
    Call swichPicture
End Sub

Private Sub Form_Load()

    '画像ファイルの設定
    Set Picture3.Picture = LoadPicture("イメージファイル")

'--位置等のイニシャライズ------
    iniFlg = True
    With HScroll1
        .Min = 1
        .Max = 20
        .Value = 1
    End With
    With HScroll2
        .Min = 1
        .Max = 20
        .Value = 10
    End With
    With VScroll1
        .Min = 1
        .Max = 20
        .Value = 1
    End With
    Picture1.BackColor = &HFFFFFF
    With Picture2
        .BackColor = &HFFFFFF
        .AutoRedraw = True
    End With
    With Picture3
        .Visible = False
        .AutoSize = True
    End With
    With Form1
        .Height = 7500
        .Width = 8500
    End With
    iniFlg = False
'------------------------------
    
    'オリジナルのサイズを格納
    lngOrgHeight = Picture3.ScaleHeight
    lngOrgWidth = Picture3.ScaleWidth
    'スクロールバーで一度に進む距離を設定
    pointHeight = lngOrgHeight / 20
    pointWidth = lngOrgWidth / 20
    
    Call swichPicture
    
End Sub

Private Sub Form_Resize()
    
'---最小サイズ(4000*4000)以下にできなくする
    '最小化をトラップ
    If Form1.WindowState = vbMinimized Then
        Exit Sub
    End If
    If Form1.Width < 4000 Then
        Form1.Width = 4000
    End If
    If Form1.Height < 4000 Then
        Form1.Height = 4000
    End If
'-------------------------------------------

    'Picture1 の位置の基本値
    With Picture1
        .Top = -100
        .Left = -100
        .Height = Form1.Height - Picture1.Top - 1500
        .Width = Form1.Width - Picture1.Left - 500
    End With
    'HScroll1 横スクロールバーの基本値
    With HScroll1
        .Top = Picture1.Height + Picture1.Top
        .Left = 0
        .Height = 300
        .Width = Picture1.Width + Picture1.Left
    End With
    'VScroll1 縦スクロールバーの基本値
    With VScroll1
        .Top = 0
        .Left = Picture1.Width + Picture1.Left
        .Height = Picture1.Height + Picture1.Top
        .Width = 300
    End With
    'HScroll2 ズームバー
    With HScroll2
        .Top = Picture1.Height + Picture1.Top + 700
        .Left = 0
        .Height = 300
        .Width = Picture1.Width + Picture1.Left - 2100
    End With
    
    Call swichPicture
    
End Sub

Private Sub HScroll1_Scroll()
    Call swichPicture
End Sub

Private Sub VScroll1_Scroll()
    Call swichPicture
End Sub

Private Sub HScroll2_Scroll()
    Call swichPicture
End Sub

Private Sub HScroll1_Change()
    Call swichPicture
End Sub

Private Sub VScroll1_Change()
    Call swichPicture
End Sub

Private Sub HScroll2_Change()
    Call swichPicture
End Sub

投稿時間:2004/06/03(Thu) 15:18
投稿者名:Renard
Eメール:
URL :
タイトル:
Re^8: PictureBoxでズーム・スクロールする
No.9137の方も修正済みなのですが、
DoEventsをコメントアウトするだけでも、かなり違うはずですが・・・。
削除出来ない理由が何かあるんでしょうか。

#まあ、解決されたようですので無理にとは言いませんけど(^^)

投稿時間:2004/06/03(Thu) 16:09
投稿者名:ken.1
Eメール:
URL :
タイトル:
Re^9: PictureBoxでズーム・スクロールする
> No.9137の方も修正済みなのですが、
> DoEventsをコメントアウトするだけでも、かなり違うはずですが・・・。
> 削除出来ない理由が何かあるんでしょうか。
>
> #まあ、解決されたようですので無理にとは言いませんけど(^^)

たびたびありがとうございます。
結論から、DoEvents捨てたらほぼチラつきがなくなりました!
No.9137の内容をしっかり吟味していなかったようです。すいません
これはイメージ表示が全く分からない頃(逆切れで暴れてた時期、管理人さんすいませんでした)
に思考錯誤して対応した名残です(汗

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

投稿時間:2004/06/02(Wed) 16:17
投稿者名:ken.1
Eメール:
URL :
タイトル:
Re^3: PictureBoxでズーム・スクロールする
'サイズの4500, 8000をベタ数字にしてかっこ悪いですが
'ピクチャーボックス2つ
'Vスクロール, Hスクロール を1つづつ

'画像のオリジナルサイズ
Dim lngOrgHeight As Long
Dim lngOrgWidth As Long

'スクロールバーで一度に進む距離
Dim pointHeight As Long
Dim pointWidth As Long

Private Sub Form_Load()
    Set orgPic.Picture = LoadPicture("*.jpg等")
    'オリジナルのサイズを格納 (orgPicはPictureBoxコントロール)
    'AutoSize = True, Visible = False
    lngOrgHeight = orgPic.ScaleHeight
    lngOrgWidth = orgPic.ScaleWidth
    'スクロールバーで一度に進む距離を設定
    pointHeight = lngOrgHeight / 20
    pointWidth = lngOrgWidth / 20

    '表示するピクチャーボックスの初期設定
    Set viewPic.Picture = LoadPicture("*.jpg等")
    viewPic.Top = 0
    viewPic.Left = 0
    viewPic.Height = 4500
    viewPic.Width = 8000
End Sub

'各スクロールバーの Minは1, Maxは20
Private Sub HScroll1_Change()
    viewPic.Left = pointWidth * (HScroll1.Value - 1)
    viewPic.Width = 8000 - pointWidth * (HScroll1.Value - 1)
End sub

Private Sub VScroll1_Change()
    viewPic.Top = pointHeight * (VScroll1.Value - 1)
    viewPic.Height = 4500 - pointHeight * (VScroll1.Value - 1)
End Sub

上記のコードでスクロール機能は実装できているかのように見せられると思っています。
ズームとの兼ね合いに苦戦していますが、根本的な作りに問題があるかと思ったのですがね