none
マウスで指定した画像をピクチャビューアで表示したいのですが。 RRS feed

  • 質問

  • 下記サイトを見ながらピクチャビューアを作成して、昨年12月20日以来色々質問させて頂いている者です。

    https://msdn.microsoft.com/ja-jp/library/dd492135.aspx

    エクスプローラーでピクチャーフォルダーを開いて、開きたいファイルを右クリックしてビューアを選択したら、そのビューアの起動と共に画像が表示されますが、これはビューアがマウスで指定した画像ファイルを起動パラメーター(言葉が相違しているかもしれません)にして立ち上がったからだ、と言う解釈でよろしいのでしょうか?

    そうだとしたら、先日来ヤッサモッサしている画像ビューアにもそのような機能を持たせることは可能でしょうか?
    可能だけれどかなり高度な知識が必要なので高齢者の素人には無理だ、と言うことならあっさり諦めますので、ご教示よろしくお願いします。

    2018年1月19日 13:13

回答

  • C29W Renewed さま 拝見しました。

    元の投稿では分かり難いと思いましたので。 参考コードを。

    以前のご質問で返信したコードに追加する形で書いて見ました。
    https://social.msdn.microsoft.com/Forums/ja-JP/8e669e37-9bf6-4cc5-9f07-f5eaa32f0b5e#2d2f9e0e-87f4-4623-add5-7079ad2f4cb6

    Public Class Form1
        Dim listPics As New List(Of String)
        Dim currentPicIndex As Integer
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Form デザイン追加指定
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            Me.PictureBox1.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right
            Me.upButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
    
            'コマンドライン引数処理
            Dim args() As String = GetCmdArgs()
            If args.Count > 0 Then
                listPics.Clear()
                listPics.AddRange(args)
                currentPicIndex = 0
                PictureBox1.Load(listPics(0))
                Dim t = ""      'for Debug Point
            End If
        End Sub
    
        Private Sub showButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles showButton.Click
            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                PictureBox1.Load(OpenFileDialog1.FileName)
    
                '変数にファイル群取得
                Dim path As String = IO.Path.GetDirectoryName(OpenFileDialog1.FileName)
                Dim files As String() = IO.Directory.GetFiles(path, "*.jpg")
                listPics.Clear()
                listPics.AddRange(files)
                currentPicIndex = listPics.IndexOf(OpenFileDialog1.FileName())
                Dim t = ""      'for Debug Point
            End If
    
        End Sub
    
        Private Sub upButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles upButton.Click
            '画像ナシなら何もしない
            If Me.PictureBox1.Image Is Nothing Then
                Exit Sub
            End If
            Dim t = ""      'for Debug Point
    
            '画像切り替え 戻る
            currentPicIndex = currentPicIndex - 1
            If currentPicIndex < 0 Then
                currentPicIndex = listPics.Count - 1
            End If
    
            PictureBox1.Load(listPics(currentPicIndex))
    
        End Sub
    
        Private Function GetCmdArgs() As String()
            Dim value() As String = Nothing
            Dim valueList As New List(Of String)
            Dim cmdArgs() As String = Environment.GetCommandLineArgs
            Dim cmdArgTxt As New System.Text.StringBuilder
            If cmdArgs.Count > 1 Then
                For i As Integer = 1 To cmdArgs.Count - 1   'First Is AppFile
                    If IsMatchTarget(cmdArgs(i)) Then
                        valueList.Add(cmdArgs(i))
                    End If
                Next
            End If
            value = valueList.ToArray
            Return value
        End Function
    
        Private Function IsMatchTarget(ByVal fileName As String) As Boolean
            Dim fileExt() As String = {".jpg", ".jpeg"}   'Set Lower Char.
            Dim value As Boolean = False
    
            'Check File Exists (For Mistyping)
            If Not IO.File.Exists(fileName) Then
                Return value
                Exit Function
            End If
    
            'Check File's Extension
            For i As Integer = 0 To fileExt.Count - 1
                If IO.Path.GetExtension(fileName).ToLower = fileExt(i) Then
                    value = True
                    Exit For
                End If
            Next
    
            'Check ... If You Need, Add Here
            'If Then
            '
            'End If
            Return value
        End Function
    
    End Class

    画面イメージです。


    尚、少し、気になった事がありますので、以下の投稿もご覧下さい。

    https://shiroyuki-mot-says.blogspot.com/2018/01/vb-code-extention-notice.html

    • 編集済み ShiroYuki_Mot 2018年1月20日 15:10 最後に、尚、以下を追記
    • 回答としてマーク C29W Renewed 2018年1月21日 2:14
    2018年1月20日 14:14

すべての返信

  • ざっくりとした説明は Verbs and File Associations にて行われていますので、まずはこちらを確認されることをお勧めします。
    2018年1月19日 13:19
  • C29W Renewed さま よろしく。

    少し方向が違うかも知れませんが。
    手前みそ で恐縮ですが、昨年、同様な発想で、自 Blog に投稿が纏めてあります。
    但し、後半のコードは WPF なので、 Form の場合は前半(緑背景)しか流用出来ないと思います。
    手打ちのファイルパスにも対応すべく余計なコードが入っていて見難いとは思いますが、
    参考になりますでしょうか?。
    https://shiroyuki-mot-says.blogspot.com/2017/06/vb-file-open-with-my-program.html

    投稿内ではボタンのイベントで引数処理していますが、実際には、いきなり、引数で与えられたファイルフルパスを所定の変数に格納する様にすれば OK かと。


    • 編集済み ShiroYuki_Mot 2018年1月19日 14:24 最後の一文を校正
    2018年1月19日 14:16
  • 回答ありがとうございます。
    英文ですが技術文書ですので、お勧めのとおり、リンクを読んでみます。
    2018年1月20日 11:09
  • 回答ありがとうございます。思いの他複雑なようで敷居が高いですが、勉強しつつ読んでみます。
    2018年1月20日 11:14
  • C29W Renewed さま 拝見しました。

    元の投稿では分かり難いと思いましたので。 参考コードを。

    以前のご質問で返信したコードに追加する形で書いて見ました。
    https://social.msdn.microsoft.com/Forums/ja-JP/8e669e37-9bf6-4cc5-9f07-f5eaa32f0b5e#2d2f9e0e-87f4-4623-add5-7079ad2f4cb6

    Public Class Form1
        Dim listPics As New List(Of String)
        Dim currentPicIndex As Integer
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Form デザイン追加指定
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            Me.PictureBox1.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right
            Me.upButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
    
            'コマンドライン引数処理
            Dim args() As String = GetCmdArgs()
            If args.Count > 0 Then
                listPics.Clear()
                listPics.AddRange(args)
                currentPicIndex = 0
                PictureBox1.Load(listPics(0))
                Dim t = ""      'for Debug Point
            End If
        End Sub
    
        Private Sub showButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles showButton.Click
            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                PictureBox1.Load(OpenFileDialog1.FileName)
    
                '変数にファイル群取得
                Dim path As String = IO.Path.GetDirectoryName(OpenFileDialog1.FileName)
                Dim files As String() = IO.Directory.GetFiles(path, "*.jpg")
                listPics.Clear()
                listPics.AddRange(files)
                currentPicIndex = listPics.IndexOf(OpenFileDialog1.FileName())
                Dim t = ""      'for Debug Point
            End If
    
        End Sub
    
        Private Sub upButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles upButton.Click
            '画像ナシなら何もしない
            If Me.PictureBox1.Image Is Nothing Then
                Exit Sub
            End If
            Dim t = ""      'for Debug Point
    
            '画像切り替え 戻る
            currentPicIndex = currentPicIndex - 1
            If currentPicIndex < 0 Then
                currentPicIndex = listPics.Count - 1
            End If
    
            PictureBox1.Load(listPics(currentPicIndex))
    
        End Sub
    
        Private Function GetCmdArgs() As String()
            Dim value() As String = Nothing
            Dim valueList As New List(Of String)
            Dim cmdArgs() As String = Environment.GetCommandLineArgs
            Dim cmdArgTxt As New System.Text.StringBuilder
            If cmdArgs.Count > 1 Then
                For i As Integer = 1 To cmdArgs.Count - 1   'First Is AppFile
                    If IsMatchTarget(cmdArgs(i)) Then
                        valueList.Add(cmdArgs(i))
                    End If
                Next
            End If
            value = valueList.ToArray
            Return value
        End Function
    
        Private Function IsMatchTarget(ByVal fileName As String) As Boolean
            Dim fileExt() As String = {".jpg", ".jpeg"}   'Set Lower Char.
            Dim value As Boolean = False
    
            'Check File Exists (For Mistyping)
            If Not IO.File.Exists(fileName) Then
                Return value
                Exit Function
            End If
    
            'Check File's Extension
            For i As Integer = 0 To fileExt.Count - 1
                If IO.Path.GetExtension(fileName).ToLower = fileExt(i) Then
                    value = True
                    Exit For
                End If
            Next
    
            'Check ... If You Need, Add Here
            'If Then
            '
            'End If
            Return value
        End Function
    
    End Class

    画面イメージです。


    尚、少し、気になった事がありますので、以下の投稿もご覧下さい。

    https://shiroyuki-mot-says.blogspot.com/2018/01/vb-code-extention-notice.html

    • 編集済み ShiroYuki_Mot 2018年1月20日 15:10 最後に、尚、以下を追記
    • 回答としてマーク C29W Renewed 2018年1月21日 2:14
    2018年1月20日 14:14
  • 全コードを書いていただいて恐縮しております。
    時間はかかると思いますが、じっくり読ませて頂いて勉強させて頂きます。(なにせ分からないことだらけですので理解に時間がかかかります。)
    感謝の極みです。有難うございました。

    2018年1月21日 2:14