プログラム初心者です。
質問させてください!
リソース機能を用いて、親ウインドウのメニューバーから子ウインドウのダイアログを作成するプログラムを作りました。
さらにその子ウインドウ上に、エディットボックスのコントロールを作り、それに入力した数値をこの子ウインドウ上に新に設けたボタン(IDC_BUTTON1)が押された時に、この数値をテキストファイルに上書きして名前をつけて保存という形で保存させたいと思っております。
MFCの機能は使っておりません。
このような機能を実現させるためには、
どのような関数を使えばいいのでしょうか。
コモンダイアログボックスを使ってうまくプログラムを書ければと思うのですが・・・
どなたかご教授よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
ファイル操作についての知識が不足していると受け取って宜しいのでしょうか?
それともGetOpenFileName、GetSaveFileNameの使い方がわかっていないのでしょうか?
前者であれば、
fopen()かCreateFile()を調べてみてください。
後者であれば、今回の場合は strFile にパスが格納される"だけ"ですので、
GetOpenFileName、GetSaveFileNameの後にfopen()またはCreateFile()を実行する必要があります。
あと、APIや標準ライブラリを使用する際は戻り値でエラーチェックした方がいいですよ。
if( !GetOpenFileName(&ofn) ) {
// エラー発生
}
見たいな感じで。
この回答への補足
迅速なお返事ありがとうございます。
おそらくファイル操作、また、GetOpenFileName,GetSaveFileNameの使い方共に理解不十分であるのだと思います。申し訳ございません。
fopenでファイルを開くよう↓のようプログラムを書いてみたのですが、データを読み込んでくれませんでした。
fopen(" ","r+")の" "の中に指定している変数が間違っているのでしょうか??
何度も申し訳ないです。
case IDC_BUTTON2: //開くボタンが押された時の処理。
GetOpenFileName(&ofn);
wsprintf(strMsg, "ファイルが選択されました。\nファイル名は\n%s\nです。",
strFile);
MessageBox(NULL, strMsg, "", MB_OK | MB_ICONINFORMATION);
newfile = fopen("strFile","r+"); //←ここです。
if(newfile == NULL){
MessageBox(hWnd1,"データを読み込めませんでした","",MB_OK);
}
else{
fscanf(newfile,"%d%d",&a1,&b1);
}
fclose(newfile);
}
return TRUE;
newfile = fopen("strFile","r+");
何度も申し訳ございませんでした。
たった今、
"strFile"の""をなくしたことで、
問題が解決いたしました。
keibou21さまがご丁寧に教えてくださり、本当に感謝しております。ありがとうございました!!
No.1
- 回答日時:
エディットボックスは数値で入っているのではなく、文字列で入っています。
ですから、数値->文字列 変換は必要ありません。
プログラムの流れは次のようになります。
1.IDC_BUTTON1が押されたときにエディットボックスの文字列を取得する
2.指定したパス?のファイルを上書きモードで開く
3.1で取得した文字列をファイルの最後尾に書き込む
4.ファイルを閉じる
まずは1から順番にやっていって見てください。
1のヒントはGetWindowTextとGetDlgItemです。
この回答への補足
迅速なお返事と的確なアドバイスありがとうございます!
TCHAR sBuff[5];
GetWindowText(GetDlgIte(hWnd,IDC_EDIT1),sBuff,5);
と宣言して、
sbuffにエディットボックスの文字列を格納したところまではうまくいっていたのですが・・・、
ここからがよくわかりません。
構想としては、このsBuffに格納された文字列を別に作ったコントロールであるボタン(IDC_BUTTON1)を押した時に、別のテキストファイルとして名前をつけて保存し(例えばここでaaa.txtとして保存したとします。)、
さらに別に作ったコントロールであるボタン(IDC_BUTTON2)を押した時に、先ほどのaaa.textのファイルを開き、
最初のエディットボックスに上書きという形にしたいのです。
この場合、参考書を読んだ結果、GetSaveFileNameとGetOpenFileName関数を使ってコモンダイアログを使うと便利なのかなと思ったのですが、この関数の使い方がよくわからなくて。
もう少し調べて頑張ってみます。恐れ入りますがまた質問させていただくと思います。
その時はご教授よろしくお願い致します。
お世話になります。
質問させていただいてからあれこれやってみたのですが、コモンダイアログを開くことができました。
↓は作成した子ウインドウのソースの一部なのですが、
このダイアログ上に私が作成した名前をつけて保存ボタンを押した時(IDC_BUTTON3)に、ご教授いただいたGetWindowText、GetDlgItem関数を用いてエディットボックスの値をBuff1,Buff2にそれぞれ格納しました。
しかし、この値を新にテキストとして保存したり、その保存したテキストから値を読み込んで、それぞれのエディットボックスに上書きするようにしたいのですが、どうしてもうまくいきません。
恐れ入りますがアドバイスをいただけると助かります。お忙しい時間を私に割いてくださり申し訳ございません。
BOOL CALLBACK DlgWndProc(HWND hWnd1,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
TCHAR Buff1[5],Buff2[5];
static OPENFILENAME ofn;
static TCHAR strFile[MAX_PATH];
switch(message)
{
case WM_INITDIALOG:
SetDlgItemInt(hWnd1,IDC_EDIT1,100,FALSE);
SetDlgItemInt(hWnd1,IDC_EDIT2,100,FALSE);
//コモンダイアログの設定
ofn.lStructSize = sizeof (ofn);
ofn.hwndOwner = hWnd1;
ofn.lpstrFile = strFile; //選択されたファイル名を代入するためのバッファ
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = "データ\0*.txt\0";
ofn.nFilterIndex = 0;
ofn.Flags = OFN_FILEMUSTEXIST;
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BUTTON2: //開くボタンが押された時の処理。
//ここの処理がわかりません。
GetOpenFileName(&ofn);
SetWindowText(hWnd1 , strFile);
return TRUE;
case IDC_BUTTON3: //名前をつけて保存ボタンが押された時の処理。
GetWindowText(GetDlgItem(hWnd1,IDC_EDIT1),Buff1,5);
GetWindowText(GetDlgItem(hWnd1,IDC_EDIT2),Buff2,5);
//ここの処理がわかりません。
GetSaveFileName(&ofn);
SetWindowText(hWnd1 , strFile);
return TRUE;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
Excel 相対パス
-
xcopyコマンドの進行状況を表示...
-
VBAで、VBのapp.pathと同じ機能...
-
【VB.NET】App.configにファイ...
-
【VBA】ExcelマクロでCSVファイ...
-
Eclipse
-
A列に記載されているフォルダ...
-
コマンドプロンプトのコピー関...
-
開いているファイルを削除し、...
-
【VBA】複数のtxtファイルから...
-
エクセルVBAで一つ上の階層...
-
エクセルのファイルオープン時...
-
ShellExecuteでエクセルファイ...
-
Accessで「ファイルを開く」ダ...
-
VB2005 でパス名が誤っていない...
-
パスワード保護されたExcelファ...
-
ファイル名の半角スペースについて
-
Excel VBAでテキストファイルを...
-
システムの特殊なフォルダのパ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
Excel 相対パス
-
エクセルVBAで一つ上の階層...
-
エクセルのマクロで特定フォル...
-
xcopyコマンドの進行状況を表示...
-
ExcelVBAの使い方 ¥の使い方...
-
EXCEL(VBA)で指定フォルダ内の...
-
【VBA】ExcelマクロでCSVファイ...
-
【VB.NET】App.configにファイ...
-
VBA★PDFをPDFアプリで印刷し...
-
ExcelのVBAで上書き保存を確...
-
VBAでパワーシェルを実行したい...
-
SaveAsの保存先について
-
outlook開けない
-
Eclipse
-
C#でのProcess.Startと変数path
-
開いているファイルを削除し、...
-
A列に記載されているフォルダ...
-
コマンドプロンプトのコピー関...
-
【VBA】複数のtxtファイルから...
おすすめ情報