c++を勉強しています。APIを使っているのですが、ファイル保存コモンダイアログの表示は出来ているのですが、ちょっと疑問点があります。どなたかご教授ください。よろしくお願いいたします。 分かりにくかったらごめんなさい。 とりあえず必要かなと思うところだけ編集して、ソースを張っています。 Save関数の中で static で宣言するとよいのですが、static無ではダイアログが動きません。 なぜstaticが必要なのですか? Save関数の中に入ると、クラスを作り、抜けると破棄するというようにと思っていたのですが static を付けてしまうと、ずっと保持されてしまいますよね? どうすれば、よいのでしょうか? 開発環境 vista visual studio 2010 c++ /********************/ class FNameDlg //コモンダイアログのためのもの { public: int SaveFile( winproc proc ); //ダイアログを開く void ofnSet( winproc proc, wchar_t *Filter, wchar_t *Title, wchar_t *Ext ); private: TCHAR m_strName_full[MAX_PATH]; TCHAR m_strName[MAX_PATH]; OPENFILENAME m_ofn; }; /************/ class WaveSave : public FNameDlg //wavファイルを保存するため { public: void SaveMain( winproc proc, Audio_Format hWave, Save cSave ); private: void WriteFile(LPTSTR lpszFileName, LPWAVEFORMATEX lpwf, LPBYTE lpWaveData, DWORD dwDataSize); }; /*********/ void WaveSave::SaveMain( winproc proc, Audio_Format hWave, Save cSave ) { wchar_t *FilterW = _T("wav files( *.wav )\0*.wav\0All files(*.*)\0.*.*\0\0"); wchar_t *TitleW = _T("名前を付けて保存"); wchar_t *ExtW = _T("wav"); ofnSet( proc, FilterW, TitleW, ExtW ); //OPENFILENAMEに値を入れます if( SaveFile( proc ) == -1 ) //ここでGetSaveFileName( &m_ofn )を実行しています。 return ; //staticを付けてないと返されてしまいます。 WriteFile( GetFull(), &hWave.m_Wf, cSave.m_pbSave, cSave.m_iDataSize ); } /*************/ void Save( // 省略します // ) { static WaveSave cWSave; //staticを付けるとよい ないとだめ cWSave.SaveMain( proc, hWave, cSave ); } /*************/ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // 省略します // Save( // 省略します // ); return DefWindowProc(hwnd, uMsg, wParam, lParam); }
↧