プロが教える店舗&オフィスのセキュリティ対策術

プログラム初心者です。
質問させてください!

リソース機能を用いて、親ウインドウのメニューバーから子ウインドウのダイアログを作成するプログラムを作りました。

さらにその子ウインドウ上に、エディットボックスのコントロールを作り、それに入力した数値をこの子ウインドウ上に新に設けたボタン(IDC_BUTTON1)が押された時に、この数値をテキストファイルに上書きして名前をつけて保存という形で保存させたいと思っております。

MFCの機能は使っておりません。
このような機能を実現させるためには、
どのような関数を使えばいいのでしょうか。

コモンダイアログボックスを使ってうまくプログラムを書ければと思うのですが・・・

どなたかご教授よろしくお願いいたします。

A 回答 (2件)

エディットボックスは数値で入っているのではなく、文字列で入っています。


ですから、数値->文字列 変換は必要ありません。

プログラムの流れは次のようになります。
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関数を使ってコモンダイアログを使うと便利なのかなと思ったのですが、この関数の使い方がよくわからなくて。

 もう少し調べて頑張ってみます。恐れ入りますがまた質問させていただくと思います。
その時はご教授よろしくお願い致します。

補足日時:2006/06/09 17:46
    • good
    • 0
この回答へのお礼

お世話になります。

質問させていただいてからあれこれやってみたのですが、コモンダイアログを開くことができました。

↓は作成した子ウインドウのソースの一部なのですが、
このダイアログ上に私が作成した名前をつけて保存ボタンを押した時(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;

お礼日時:2006/06/12 13:31

ファイル操作についての知識が不足していると受け取って宜しいのでしょうか?


それとも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;

補足日時:2006/06/12 16:03
    • good
    • 0
この回答へのお礼

newfile = fopen("strFile","r+");

何度も申し訳ございませんでした。
たった今、
"strFile"の""をなくしたことで、
問題が解決いたしました。

keibou21さまがご丁寧に教えてくださり、本当に感謝しております。ありがとうございました!!

お礼日時:2006/06/12 16:35

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