トップ回答者
マウスで指定した画像をピクチャビューアで表示したいのですが。

質問
-
下記サイトを見ながらピクチャビューアを作成して、昨年12月20日以来色々質問させて頂いている者です。
https://msdn.microsoft.com/ja-jp/library/dd492135.aspx
エクスプローラーでピクチャーフォルダーを開いて、開きたいファイルを右クリックしてビューアを選択したら、そのビューアの起動と共に画像が表示されますが、これはビューアがマウスで指定した画像ファイルを起動パラメーター(言葉が相違しているかもしれません)にして立ち上がったからだ、と言う解釈でよろしいのでしょうか?
そうだとしたら、先日来ヤッサモッサしている画像ビューアにもそのような機能を持たせることは可能でしょうか?
可能だけれどかなり高度な知識が必要なので高齢者の素人には無理だ、と言うことならあっさり諦めますので、ご教示よろしくお願いします。
回答
-
C29W Renewed さま 拝見しました。
元の投稿では分かり難いと思いましたので。 参考コードを。
以前のご質問で返信したコードに追加する形で書いて見ました。
https://social.msdn.microsoft.com/Forums/ja-JP/8e669e37-9bf6-4cc5-9f07-f5eaa32f0b5e#2d2f9e0e-87f4-4623-add5-7079ad2f4cb6Public 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
すべての返信
-
ざっくりとした説明は Verbs and File Associations にて行われていますので、まずはこちらを確認されることをお勧めします。
-
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 最後の一文を校正
-
C29W Renewed さま 拝見しました。
元の投稿では分かり難いと思いましたので。 参考コードを。
以前のご質問で返信したコードに追加する形で書いて見ました。
https://social.msdn.microsoft.com/Forums/ja-JP/8e669e37-9bf6-4cc5-9f07-f5eaa32f0b5e#2d2f9e0e-87f4-4623-add5-7079ad2f4cb6Public 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