0

ファイルの拡張子フィルターをファイルの選択ダイアログに適用しようとしています。

この方法は機能します:

ofn.lpstrFilter =   
"(*.exe) Windows Executable\0*.exe\0"
"(*.ini) Windows Initialization file \0*.ini\0"
"(*.dll) Dynamic Link Library \0*.dll\0"
"(*.lib) Windows Library file \0*.lib\0"
"(*.conf) Windows Configuration file \0*.conf\0";

ここに画像の説明を入力

しかし、パラメーターを使用して拡張フィルターを動的に割り当てると、失敗し、フィルターがコンボ ボックスに表示されません。

LPCSTR filter = (LPCSTR)extFilter; //Contains string "bmp"

stringstream s;
s << "(*.exe) Windows Executable\0" << "*." << filter << "\0";
string ffilter = s.str();
ofn.lpstrFilter = ffilter.c_str();

ここに画像の説明を入力

問題は文字列変換にあると思いますが、わかりません。

4

4 に答える 4

1

この行:

s << "(*.exe) Windows Executable\0" << "*." << filter << "\0";

は null で終わるchar*文字列を に渡しoperator<<()ているため、実行時に次のコードと実質的に同じように動作しています。

s << "(*.exe) Windows Executable" << "*." << filter << "";

ヌルは にはなりませんs

stringstreamヌルを正しく挿入するには、値としてではなく、個々のchar値として割り当てる必要がありchar*ます。

s << "(*.exe) Windows Executable" << '\0' << "*." << filter << '\0';

また、あなたがタイプキャストしているという事実extFilterは疑わしいです。コンパイラエラーを取り除くためにそれをしなければならない場合は、extFilterそもそも互換性のあるデータ型ではありません.型キャストはコードにバグを隠しています. 型キャストを取り除きます:

LPCSTR filter = extFilter; //Contains string "bmp"

コードのコンパイルに失敗した場合は、何か間違ったことをしているので、適切に修正する必要があります。

一方、extFilterが null で終わるchar文字列である場合は、 に渡す前に変数に割り当てる必要はありませんoperator<<()

s << "(*.exe) Windows Executable" << '\0' << "*." << extFilter << '\0';
于 2015-12-04T16:56:38.217 に答える
0

最後に答えを見つけました:

const char * extensionFilter = myParamVar; //Contains "JPG" string

string sFilter;
sFilter.append("Format: ");
sFilter.append(extensionFilter);
sFilter.push_back('\0');
sFilter.append("*.");
sFilter.append(extensionFilter);
sFilter.push_back('\0');

//Current filter content --> Format: JPG\0*.JPG\0

const char * filter = sFilter.c_str(); //Char string conversion
ofn.lpstrFilter = filter; //Set the filter to the sctructure's member.

//Opens the dialog and it successfully applies the filter.
if (GetOpenFileName(&ofn)==TRUE){
. . .
于 2015-12-11T14:42:18.320 に答える