Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用变量(c+;+;)的动态MessageBox_C++_Messagebox - Fatal编程技术网

C++ 使用变量(c+;+;)的动态MessageBox

C++ 使用变量(c+;+;)的动态MessageBox,c++,messagebox,C++,Messagebox,我想使用字符数组创建一个动态MessageBox,但我对uType(UINT)有一些问题 如果你看我的代码,我首先有一个带有|分隔符的字符字符串,它被解析成数组“a”。然后我将我的字符转换成UINT,但我无法让它工作,它只是不显示任何messagebox。 谢谢你的帮助:-) 这些是“枚举”,而不是实际的字符串。 在程序中(字符串之外),它们将被数字替换。 您正在做的是尝试将普通字符串转换为数字,这显然不会产生预期的结果,因为系统不再识别枚举 我建议使用某种掩码,或者在字符串中输入“plain”

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

如果你看我的代码,我首先有一个带有|分隔符的字符字符串,它被解析成数组“a”。然后我将我的字符转换成UINT,但我无法让它工作,它只是不显示任何messagebox。 谢谢你的帮助:-)

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

我建议使用某种掩码,或者在字符串中输入“plain”值。 例如,可以看到,这是0x40

因此,请尝试使用如下字符串:

char str[] ="Testing message|Title Message|0x40";
UINT x;
if(!strcmp(a[3],"MB_ICONERROR")){
    x = MB_ICONERROR;
} else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){
    x = MB_ICONEXCLAMATION;
...
并确保最后一个元素被视为整数,而不是“字符串”。

根据MB_OK和MB_ICONINFORMATION是#定义的,因此如果要执行以下操作:

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常量,这些可能不会经常更改,但这样做更好。)

这看起来像这样:

char str[] ="Testing message|Title Message|0x40";
UINT x;
if(!strcmp(a[3],"MB_ICONERROR")){
    x = MB_ICONERROR;
} else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){
    x = MB_ICONEXCLAMATION;
...

不是没有办法,只是没有简单的办法。我更新了我的答案,以反映编译器在I/E-Fielt中为你做转换的方法,这样至少你在代码中没有裸数字。这是可怕的C++代码,抱歉。使用适当的C++功能,而不是遗留C函数。我很想看看你是怎么做到的?我是c++新手,主要是使用
std::string
而不是
char const*
(尤其是没有固定的缓冲区!),这样就不需要使用
strcmp
(相反,可以使用
=
)或
strcat
(容易溢出;使用
+
+=/code>)使用
std::find
和类似的算法,而不是
strtok
。很高兴知道,我能够帮助您:)
UINT x;
if(!strcmp(a[3],"MB_ICONERROR")){
    x = MB_ICONERROR;
} else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){
    x = MB_ICONEXCLAMATION;
...