CString 与宏定义操作

myiszjf 2013-09-17 09:56:07
本人遇到一个这样的问题:
#define IDD_DIALOG1 1028
CString m_strId = _T("IDD_DIALOG1");
我想要得到1028这值,该如何操作呢?
就是说如何将strId还原成IDD_DIALOG1呢?
...全文
366 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人乙2019 2013-09-18
  • 打赏
  • 举报
回复
何必要转进这样的死胡同,保存的时候保存一个一个的结构,包含id 值和子符串。再说cmap不就是这样的吗,子符串做key,id值做值。
myiszjf 2013-09-18
  • 打赏
  • 举报
回复
结贴咯!祝福程序猿度过愉快的中秋,非常感谢各位的帮忙!
myiszjf 2013-09-18
  • 打赏
  • 举报
回复
引用 31 楼 schlafenhamster 的回复:
边试 边想。
非常感谢!中秋就要来临了。就结贴吧!让你们度过愉快的中秋!此外,我能留下你qq么!qq2420421093 这是我的,希望多指点,谢谢!
myiszjf 2013-09-18
  • 打赏
  • 举报
回复
引用 33 楼 zhuben775 的回复:
[quote=引用 30 楼 myiszjf 的回复:] [quote=引用 29 楼 zhuben775 的回复:] [quote=引用 27 楼 myiszjf 的回复:] [quote=引用 26 楼 zhuben775 的回复:] [quote=引用 24 楼 schlafenhamster 的回复:] 思路: 1.打开 resource.h 2.搜索 #define 3.得到 IDD_DIALOG1 1028 4.在Macro.cpp (自定义的文件) 中写入 这对 数 IDD_DIALOG1 1028 5.直到 resource.h 读完,关闭。 Macro.h typedef struct _tagMacro { char IdName[20]; int IdNumber; } Macro; Macro.cpp 大概 是: Macro【255】={ {"IDD_DIALOG1",1028}, 。。。。。。 } 注意 macro.cpp 这个文件 一定 要 在 编译 前 产生。 或者 单另 做个 简单程序。在 prebuild 中 运行 该 程序 你试试。
那他程序运行的时候岂不是要添加一个resource.h文件?[/quote]各位,我的背景是这样的,程序中很多控件,把控件保存到INI文件中,这样如果想更改控件的名字,直接更改ini文件就行了,而不用去改代码,现在,有没有好的思路给我呢!发现schlafenhamster 的思路虽然好,但还是太过麻烦了,其实也是自己的知识面欠缺吧![/quote] 我总觉的你在设计上就有问题,宏这个东西只有在编译前存在,编程成EXE后就不存在了,你现在要程序在运行时去识别程序里没有的东西,你觉的可能吗[/quote]是的!我的设计本意是想得到每个控件的ID,所以手工添加了一个ini文件,保存某个控件的宏和对应的内容,发现宏是Cstring内型并不是Int,而编译器无法识别。现在我想以读文件的方式读取resource.h,这个文件是存在的,保存宏跟ID到CMap中,或者直接手工添加,虽然手工添加很麻烦,然后跟Ini文件中的key比较,若是相同,则SetDlgItemText(ID,Value); 基本上就实现了![/quote] 读resource.h方法不可取,难道你的程序最后生成EXE后还要在同目录内放个resource.h文件?重新设计吧[/quote]呵呵,都弄到这份上了,节后就要交了,先把功能实现了以后再改进吧!!我留下你的qq么!这是我的qq2420421093
zhuben775 2013-09-18
  • 打赏
  • 举报
回复
引用 30 楼 myiszjf 的回复:
[quote=引用 29 楼 zhuben775 的回复:] [quote=引用 27 楼 myiszjf 的回复:] [quote=引用 26 楼 zhuben775 的回复:] [quote=引用 24 楼 schlafenhamster 的回复:] 思路: 1.打开 resource.h 2.搜索 #define 3.得到 IDD_DIALOG1 1028 4.在Macro.cpp (自定义的文件) 中写入 这对 数 IDD_DIALOG1 1028 5.直到 resource.h 读完,关闭。 Macro.h typedef struct _tagMacro { char IdName[20]; int IdNumber; } Macro; Macro.cpp 大概 是: Macro【255】={ {"IDD_DIALOG1",1028}, 。。。。。。 } 注意 macro.cpp 这个文件 一定 要 在 编译 前 产生。 或者 单另 做个 简单程序。在 prebuild 中 运行 该 程序 你试试。
那他程序运行的时候岂不是要添加一个resource.h文件?[/quote]各位,我的背景是这样的,程序中很多控件,把控件保存到INI文件中,这样如果想更改控件的名字,直接更改ini文件就行了,而不用去改代码,现在,有没有好的思路给我呢!发现schlafenhamster 的思路虽然好,但还是太过麻烦了,其实也是自己的知识面欠缺吧![/quote] 我总觉的你在设计上就有问题,宏这个东西只有在编译前存在,编程成EXE后就不存在了,你现在要程序在运行时去识别程序里没有的东西,你觉的可能吗[/quote]是的!我的设计本意是想得到每个控件的ID,所以手工添加了一个ini文件,保存某个控件的宏和对应的内容,发现宏是Cstring内型并不是Int,而编译器无法识别。现在我想以读文件的方式读取resource.h,这个文件是存在的,保存宏跟ID到CMap中,或者直接手工添加,虽然手工添加很麻烦,然后跟Ini文件中的key比较,若是相同,则SetDlgItemText(ID,Value); 基本上就实现了![/quote] 读resource.h方法不可取,难道你的程序最后生成EXE后还要在同目录内放个resource.h文件?重新设计吧
myiszjf 2013-09-18
  • 打赏
  • 举报
回复
引用 31 楼 schlafenhamster 的回复:
边试 边想。
恩恩,是的!!
schlafenhamster 2013-09-18
  • 打赏
  • 举报
回复
边试 边想。
myiszjf 2013-09-18
  • 打赏
  • 举报
回复
引用 29 楼 zhuben775 的回复:
[quote=引用 27 楼 myiszjf 的回复:] [quote=引用 26 楼 zhuben775 的回复:] [quote=引用 24 楼 schlafenhamster 的回复:] 思路: 1.打开 resource.h 2.搜索 #define 3.得到 IDD_DIALOG1 1028 4.在Macro.cpp (自定义的文件) 中写入 这对 数 IDD_DIALOG1 1028 5.直到 resource.h 读完,关闭。 Macro.h typedef struct _tagMacro { char IdName[20]; int IdNumber; } Macro; Macro.cpp 大概 是: Macro【255】={ {"IDD_DIALOG1",1028}, 。。。。。。 } 注意 macro.cpp 这个文件 一定 要 在 编译 前 产生。 或者 单另 做个 简单程序。在 prebuild 中 运行 该 程序 你试试。
那他程序运行的时候岂不是要添加一个resource.h文件?[/quote]各位,我的背景是这样的,程序中很多控件,把控件保存到INI文件中,这样如果想更改控件的名字,直接更改ini文件就行了,而不用去改代码,现在,有没有好的思路给我呢!发现schlafenhamster 的思路虽然好,但还是太过麻烦了,其实也是自己的知识面欠缺吧![/quote] 我总觉的你在设计上就有问题,宏这个东西只有在编译前存在,编程成EXE后就不存在了,你现在要程序在运行时去识别程序里没有的东西,你觉的可能吗[/quote]是的!我的设计本意是想得到每个控件的ID,所以手工添加了一个ini文件,保存某个控件的宏和对应的内容,发现宏是Cstring内型并不是Int,而编译器无法识别。现在我想以读文件的方式读取resource.h,这个文件是存在的,保存宏跟ID到CMap中,或者直接手工添加,虽然手工添加很麻烦,然后跟Ini文件中的key比较,若是相同,则SetDlgItemText(ID,Value); 基本上就实现了!
zhuben775 2013-09-18
  • 打赏
  • 举报
回复
引用 27 楼 myiszjf 的回复:
[quote=引用 26 楼 zhuben775 的回复:] [quote=引用 24 楼 schlafenhamster 的回复:] 思路: 1.打开 resource.h 2.搜索 #define 3.得到 IDD_DIALOG1 1028 4.在Macro.cpp (自定义的文件) 中写入 这对 数 IDD_DIALOG1 1028 5.直到 resource.h 读完,关闭。 Macro.h typedef struct _tagMacro { char IdName[20]; int IdNumber; } Macro; Macro.cpp 大概 是: Macro【255】={ {"IDD_DIALOG1",1028}, 。。。。。。 } 注意 macro.cpp 这个文件 一定 要 在 编译 前 产生。 或者 单另 做个 简单程序。在 prebuild 中 运行 该 程序 你试试。
那他程序运行的时候岂不是要添加一个resource.h文件?[/quote]各位,我的背景是这样的,程序中很多控件,把控件保存到INI文件中,这样如果想更改控件的名字,直接更改ini文件就行了,而不用去改代码,现在,有没有好的思路给我呢!发现schlafenhamster 的思路虽然好,但还是太过麻烦了,其实也是自己的知识面欠缺吧![/quote] 我总觉的你在设计上就有问题,宏这个东西只有在编译前存在,编程成EXE后就不存在了,你现在要程序在运行时去识别程序里没有的东西,你觉的可能吗
schlafenhamster 2013-09-17
  • 打赏
  • 举报
回复
定义控件 ID 时 ,直接 输入 “字符串”
myiszjf 2013-09-17
  • 打赏
  • 举报
回复
引用 11 楼 zhuben775 的回复:
[quote=引用 10 楼 myiszjf 的回复:] [quote=引用 9 楼 zhuben775 的回复:]

if(m_strId == _T("IDD_DIALOG1"))
{
   SetDlgItemText( IDD_DIALOG1, _T("你好"));
}
else if(...)
{
}
如果单独是一个就这样子还行,但我是以读文件的方式读取的,也就是说很多的ID,所以这方法还不行,不过给了点思路,谢谢啊![/quote] 那可以用数组保存对应的字符串和ID,然后通过一个函数把字符串转换成相应的ID就可以了[/quote]恩,是的,我已经保存到Cmap中了,就是转换的时候,出了些问题
myiszjf 2013-09-17
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
SetDlgItemText( m_strId , _T("你好")); SetDlgItemText("IDD_DIALOG1 , _T("你好"));
感谢,请问我可不可将m_strID转换成string类型,直接用SetDlgItemText( m_strId , _T("你好"));呢
zhuben775 2013-09-17
  • 打赏
  • 举报
回复
引用 10 楼 myiszjf 的回复:
[quote=引用 9 楼 zhuben775 的回复:]

if(m_strId == _T("IDD_DIALOG1"))
{
   SetDlgItemText( IDD_DIALOG1, _T("你好"));
}
else if(...)
{
}
如果单独是一个就这样子还行,但我是以读文件的方式读取的,也就是说很多的ID,所以这方法还不行,不过给了点思路,谢谢啊![/quote] 那可以用数组保存对应的字符串和ID,然后通过一个函数把字符串转换成相应的ID就可以了
myiszjf 2013-09-17
  • 打赏
  • 举报
回复
引用 9 楼 zhuben775 的回复:

if(m_strId == _T("IDD_DIALOG1"))
{
   SetDlgItemText( IDD_DIALOG1, _T("你好"));
}
else if(...)
{
}
如果单独是一个就这样子还行,但我是以读文件的方式读取的,也就是说很多的ID,所以这方法还不行,不过给了点思路,谢谢啊!
zhuben775 2013-09-17
  • 打赏
  • 举报
回复

if(m_strId == _T("IDD_DIALOG1"))
{
   SetDlgItemText( IDD_DIALOG1, _T("你好"));
}
else if(...)
{
}
schlafenhamster 2013-09-17
  • 打赏
  • 举报
回复
SetDlgItemText( m_strId , _T("你好")); SetDlgItemText("IDD_DIALOG1 , _T("你好"));
myiszjf 2013-09-17
  • 打赏
  • 举报
回复
引用 6 楼 zhuben775 的回复:
我觉得是你的思路有问题,所有的宏定义在编译后就不存在了,会全部替换,所以程序在执行后是没有那个宏的,当然也无法转换成1028
我其实就想通过m_strId 换成 IDD_DIALOG1,然后是用SetDlgItemText( m_strId , _T("你好"));现在 m_strId 是CSting类型,改函数就无法使用了!所以想着转换成IDD_DIALOG1或者找到1028.
zhuben775 2013-09-17
  • 打赏
  • 举报
回复
我觉得是你的思路有问题,所有的宏定义在编译后就不存在了,会全部替换,所以程序在执行后是没有那个宏的,当然也无法转换成1028
myiszjf 2013-09-17
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
"IDD_DIALOG1"
是不是FindResource(NULL, m_strId , );但第三个参数不知道写什么,他说是资源类型名称,不知道指的是什么!
zgl7903 2013-09-17
  • 打赏
  • 举报
回复
"IDD_DIALOG1"
加载更多回复(16)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧