动态MessageBox使用变量(c ++)

时间:2012-08-05 16:44:40

标签: c++ messagebox

我想使用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);

2 个答案:

答案 0 :(得分:0)

MB_OK|MB_ICONINFORMATION

这些是'枚举'而不是实际的字符串。 在你的程序中(字符串之外),它们将被数字取代。 你正在做的是尝试将普通字符串转换为数字,这显然不会产生预期的结果,因为系统不再识别枚举。

我建议使用某种掩码,或者在字符串中输入'plain'值。 对于你的例子,那是0x40,可以看出here

所以,尝试使用这样的字符串:

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

并确保最后一个元素被视为整数,而不是'字符串'。

答案 1 :(得分:0)

根据this page MB_OK和MB_ICONINFORMATION是#define,所以如果你要这样做:

y = MB_OK | MB_ICONINFORMATION;

你会得到你想要的值到y变量。

但是,您有一个包含#defines的名称的字符串。字符串流和我能想到的任何其他简单的东西都不能将它们转换成你需要的数字。

更新:

您在问题中添加了以下if / else梯形图作为解决方案:

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

如果你要这样做,那么用#defines替换文字常量,它应该更干净,不会有可能过时或有错误。 (我意识到,作为窗口常量,这些可能不会经常改变,但最好以这种方式练习。)

这看起来像这样:

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