「ファイルを保存するコモンダイアログ」と「クラス」
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);
}
お礼
ご回答ありがとうございます。 上記のやり方を試したところ、上手く1つのスレッドで処理中の中断が実現できました。ありがとうございました。 ところで、1つのスレッドでキャンセルボタン付ダイアログの表示と処理を並行すると、PCのスペックにも依存すると思いますが、ダイアログのレスポンスがマルチスレッドに比べて遅い気がします。(処理中にダイアログボックスをドラッグ移動しようとすると、多少カクカクします)。もし、呼出し元で画面表示をするスレッドと処理をするスレッド間で、キャンセルボタンの押下判定をするには、スレッド間通信を行うしかないんですかねぇ。