リソースをEXEファイルに組み込みたいのですが

タグの編集
投稿者 たかくん  (社会人) 投稿日時 2011/9/20 05:55:24
おはようございます。
まず下記の実験コードを見てほしいです。

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim p As New PictureBox
        p.SizeMode = PictureBoxSizeMode.StretchImage
        p.Image = Image.FromFile("Windows7.jpg")
        Me.Controls.Add(p)
    End Sub
End Class

画像はコントロールを動的に配置する必要があるためこのように書いてます。
画像はBINフォルダに置いてMyProjectのリソースで登録もしています。
なのでこのまま実行すれば動くのですが11exeファイルを違う場所に移すとエラーがでます。
画像がないためですが、exeファイルに画像を組み込んでどこに移動させても実行できるようにしたいのです。
インストーラーでインストールした場合画像がなくエラーがでるからです。
また、画像はプロパティでビルドアクションを変更してResourceを選択してexeファイルに組み込んで
いるのですがexeを移動させると動きません。
どうすればいいのでしょうか、解る方教えて下さい。
投稿者 るきお  (社会人) 投稿日時 2011/9/20 13:16:16
こんにちは。

たかくんさんのプログラムは画像をファイルから読み込むFromFileメソッドを使っているので、このままだとファイルがないとエラーになります。

リソースに登録する方法、リソースからファイルを呼び出す方法はいくつかありますが、手軽なものを1つ紹介します。

・まず、ソリューションエクスプローラーでMy Projectをダブルクリックします。
・次に、リソースページで「リソースの追加」の右の小さな▼をクリックして、「既存のファイルの追加」を選択し、どこでもよいのですがWindows7.jpgを指定します。
・プログラムを次のように書きます。
  
Dim p As New PictureBox
p.SizeMode = PictureBoxSizeMode.StretchImage
p.Image = My.Resources.Windows7
Me.Controls.Add(p)


なお、私の好みのやり方はリソースを使わないやり方で、1つのフォルダー(たとえばMyPG)にexeファイルとImageフォルダーを作り、Imageフォルダー中に画像を入れます。プログラムを移動するときはMyPGフォルダーごと移動するようにして、プログラム内での画像ファイルの指定はApplication.StartupPathを起点に指定します。
こうすると後から画像を差し替えるのが楽だったり、第3者に配布した後はその第3者が自分の好みの画像に置き換えることも簡単にできたりしてより楽しんでもらえる点が好みの理由です。
ファイル数が増えるのがいやだったり、逆に簡単に置き換えてもらいたくない場合などはこの手法は全然ダメで、たかくんさんが目を付けたようにリソースを使う方がベストになります。一般的にもリソースを使っている人の方が多数派のように見えます。
投稿者 たかくん  (社会人) 投稿日時 2011/9/20 14:13:56
るきおさん、ありがとうございます。
るきおさんの方法でも試したのですが「発行」をする時にユーザー側が画像だけ別にexeファイルのフォルダに入れないといけなかったので採用できませんでした。
どうしてもexe単体で動かすのが目標だったのでMy.Resourcesでイメージ配列に読み込んでおいて、
乱数配列をインデックスにして動的配列のPictureBoxに入れるというやり方で無理やり対応させました。(笑)
これでexe単体で動きます。
ありがとうございました。
ではまた...