0

char 配列を使用して動的な MessageBox を作成したいのですが、uType (UINT) に問題があります。

私のコードを見ると、最初に | を含む char 文字列があります。区切り記号であり、配列 "a" に解析されます。次に、charをUINTに変換しますが、機能しません。メッセージボックスが表示されません。助けてくれてありがとう:-)

char str[] ="Testing message|Title Message|MB_OK|MB_ICONINFORMATION";
char * pch;
char * a[4];
int i = 0;
pch = strtok (str,"|");
while (pch != NULL)
{
    a[i] = pch;
    pch = strtok (NULL, "|");
    //cout << a[i];
    i++;
}
char test[1000] = "";
strcat_s (test,a[2]);
strcat_s (test,"|");
strcat_s (test,a[3]);

UINT y;
stringstream s;
s << test;
s >> y;


MessageBox(0,a[0],a[1],y);
Sleep(10000);

解決 :

                        UINT x;
                            if(!strcmp(a[3],"MB_ICONERROR")){
                                x = 0x10;
                            }else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){
                                x = 0x30;
                            }else if(!strcmp(a[3],"MB_ICONINFORMATION")){
                                x = 0x40;
                            }else if(!strcmp(a[3],"MB_ICONQUESTION")){
                                x = 0x20;
                            }
                            if(!strcmp(a[2],"MB_OK")){
                                x = x + 0;
                            }else if(!strcmp(a[2],"MB_OKCANCEL")){
                                x = x + 1;
                            }else if(!strcmp(a[2],"MB_YESNO")){
                                x = x + 4;
                            }else if(!strcmp(a[2],"MB_YESNOCANCEL")){
                                x = x + 3;
                            }else if(!strcmp(a[2],"MB_RETRYCANCEL")){
                                x = x + 5;
                            }else if(!strcmp(a[2],"MB_ABORTRETRYIGNORE")){
                                x = x + 2;
                            }
                            MessageBox(0, a[0], a[1], x);
4

2 に答える 2

0
MB_OK|MB_ICONINFORMATION

これらは「列挙」であり、実際の文字列ではありません。あなたのプログラム(文字列の外)では、それらは数字に置き換えられます。あなたがしていることは、単純な文字列を数値に変換しようとしていますが、システムはそれ以上列挙を認識しないため、明らかに期待される結果は得られません。

ある種のマスクを使用するか、文字列に「plain」値を入力することをお勧めします。あなたの例では、ここで見ることができるように、それは0x40です。

したがって、次のような文字列を使用してみてください。

char str[] ="Testing message|Title Message|0x40";

また、最後の要素が「文字列」ではなく整数として扱われることを確認してください。

于 2012-08-05T16:54:12.347 に答える
0

このページによると、 MB_OK と MB_ICONINFORMATION は #defines であるため、次のようなことを行う場合:

y = MB_OK | MB_ICONINFORMATION;

必要な値を y 変数に取得します。

ただし、#definesの名前を含む文字列があります。stringstream も、私が考えることができる他の単純なものも、それらを必要な数値に変換しません。

アップデート:

解決策として、次の if/else はしごを質問に追加しました。

UINT x;
if(!strcmp(a[3],"MB_ICONERROR")){
    x = 0x10;
} else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){
    x = 0x30;
...

それを行う場合は、リテラル定数を #defines に置き換えます。これにより、よりクリーンになり、時代遅れになったりエラーが発生したりする可能性がなくなります。(Windows の定数として、これらはおそらく頻繁には変更されないことを認識していますが、この方法を実践することをお勧めします。)

これは次のようになります。

UINT x;
if(!strcmp(a[3],"MB_ICONERROR")){
    x = MB_ICONERROR;
} else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){
    x = MB_ICONEXCLAMATION;
...
于 2012-08-05T16:57:39.570 に答える