0

我想使用 char 数组创建一个动态 MessageBox,但我对 uType (UINT) 有一些问题。

如果你看我的代码,我首先有一个带有 | 的字符字符串 分隔符并将其解析为数组“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

这些是“枚举”,而不是实际的字符串。在您的程序中(在字符串之外),它们将被数字替换。您正在做的是尝试将纯字符串转换为数字,这显然不会产生预期的结果,因为那时系统不再识别枚举。

我建议使用某种掩码,或者将“普通”值输入到字符串中。对于您的示例,这是 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 回答