電子書籍の厳選無料作品が豊富!

Visual C++でカレンダーを作っています
前後矢印のボタンを押せば、カレンダーがそれぞれ前後の月に移動し
それに伴いカレンダー脇に表示される画像も変更される、
というプログラムなのですが、デバッグではキチンと動くのに
いざアプリケーション単体では動作しません。

素人ながら思うには、プログラム中では

private: void Hyouji(System::Object^ sender, System::EventArgs^ e) {
DateTime tm=DateTime(myYear,myMonth,1);
String^ FileName="Gazou/"+filename[myMonth-1]+".jpg";
monthCalendar1->SelectionStart=tm;
monthCalendar1->SelectionEnd=tm;
pictureBox1->Image=gcnew Bitmap(FileName);
this->Invalidate();
}

として、Gazouフォルダ内の画像を参照しているから起動しているのであって
アプリケーション単体ではそれができていないのだと思うのですが、
はたしてそれで合っていますでしょうか。

もしそうならば
プログラム中に画像ファイルを埋め込むことができれば解決すると思うのですが、
それにはどうすれば良いか、ご教授願えますでしょうか

よろしくお願いします

A 回答 (3件)

"Gazou/"+filename[myMonth-1]+".jpg";


は「相対パス」ですよ。

「どこからの相対パス」なのかと言うと「現在の作業フォルダ」からの相対パスです。

で、デバッグ時は「デバッガが、実行ファイル(自分自身)のパスを、現在の作業フォルダに設定してくれる」ので
"Gazou/"+filename[myMonth-1]+".jpg";

実行ファイル(自分自身)のパス+"Gazou/"+filename[myMonth-1]+".jpg"
になる為、デバッグ時には正しく動作します。

しかし「エクスプローラでプログラムをダブルクリックした時」には「現在の作業フォルダ」は「エクスプローラーが勝手に設定したどこかの場所」になってしまいます。

なので
"Gazou/"+filename[myMonth-1]+".jpg";

エクスプローラーが勝手に設定したどこかの場所+"Gazou/"+filename[myMonth-1]+".jpg"
になってしまい、そこには「Gazouと言うフォルダは存在しない」のです。

やるなら
String^ FileName="Gazou/"+filename[myMonth-1]+".jpg";

String^ FileName=実行ファイル(自分自身)のパスを取得した文字列変数+"/Gazou/"+filename[myMonth-1]+".jpg";
と書くべきでしょう。

実行ファイル(自分自身)のパスは
http://www.ujasiri.com/prglib/vc/filectrl/vc_Get …
のサンプルを使えば獲得できます。

あとは「exeと同じフォルダにGazouフォルダがあればOK」です。

この回答への補足

"Gazou/"+filename[myMonth-1]+".jpg"; が相対パスというのも理解できました。
しかし現在私が知りたいのは実行ファイル単独で実行できないか、ということでして…

補足日時:2009/12/17 09:45
    • good
    • 0

追記。



http://www.ujasiri.com/prglib/vc/filectrl/vc_Get …
の方法は「同じモジュール名のプログラムが複数動いていた時」に、嘘を返す可能性があります。

例えば
C:\MYTOOL\PROGRAM1\TEST.EXE

C:\Program Files\Test\TEST.EXE
の両方が同時に実行されている場合、どちらも「アプリケーション名はTEST」です。

ここで「TEST.exeのモジュール・ハンドルを取得する」と
C:\MYTOOL\PROGRAM1\TEST.EXE

C:\Program Files\Test\TEST.EXE
か、どちらか片方のハンドルしか返って来ません。

つまり
C:\Program Files\Test\TEST.EXE
で実行したのに
C:\MYTOOL\PROGRAM1\TEST.EXE
のハンドルが返って来たり、その逆が起こったりして、自分自身のパス位置を間違えます。

可能ならば「もっと確実な方法」を使って下さい(「実行時コマンドラインの取得」などでネットで探せば見付かります)
    • good
    • 0

Bitmapコンストラクタでファイル名を渡す方法だと、実行時にそのファイルパスが有効でないとエラーになります。



フォームアプリケーションならばマネージリソースに画像を埋め込んで利用することができます。
フォームにresxファイルがありませんか?そこにイメージを追加し、メッセージハンドラに以下のようなコードで動的にリソースを読み込みます。

System::ComponentModel::ComponentResourceManager^ resources = gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid);
this->pictureBox1->Image = safe_cast<System::Drawing::Image^>(resources->GetObject("nazo"));
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!