在MFC里动态建控件,怎样保证所分配的ID是唯一的系统没用到的?

pizicai105 2006-04-05 02:54:04
在MFC里动态建控件,怎样保证所分配的ID是唯一的系统没用到的?
CArrowCtrl *ArrowCtrl = new CArrowCtrl(this->GetSafeHwnd());
ArrowCtrl->Create("",
WS_CHILD | WS_VISIBLE | SS_NOTIFY,
CRect(50,200,10,10), this, 1025);
这里所创建的1025就是我分配给该控件的ID,但是我怎么知道1025是不是程序中已经有控件在用这个ID了?


请高手指点

急~~~~~~~~~
...全文
474 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlwlxj 2006-04-05
  • 打赏
  • 举报
回复
在资源里面定义一个字符创,用它就保证唯一
lily_123567 2006-04-05
  • 打赏
  • 举报
回复
看了一下这几个宏的定义:
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE
#define _APS_NEXT_COMMAND_VALUE
#define _APS_NEXT_CONTROL_VALUE
#define _APS_NEXT_SYMED_VALUE
#endif
#endif
看来没法直接用,可以按照YufengShi(浪子)的方法定义一个宏,数值可以参考这几个宏
lily_123567 2006-04-05
  • 打赏
  • 举报
回复
这些宏的值每个工程中是不一样的,还需要工程中有"Resource.h"才能用。
lily_123567 2006-04-05
  • 打赏
  • 举报
回复
那几个宏是在"Resource.h"中定义的,需要包含头文件,另外你可以观察一下这几个宏的值:
#define _APS_NEXT_RESOURCE_VALUE 173
#define _APS_NEXT_COMMAND_VALUE 32778
#define _APS_NEXT_CONTROL_VALUE 1040
#define _APS_NEXT_SYMED_VALUE 101
这是随便一个工程中的定义,取值的时候还是要小心一点。
我说的便利是便利自己生成的控件的ID,把自己生成的ID的值都记录下来,新建控件的时候检查一下。
YufengShi 2006-04-05
  • 打赏
  • 举报
回复
修改resource.h,自定义一个ID,比如IDC_MYBTN 1111
数值可以参照其他ID,不重复就可以了
pizicai105 2006-04-05
  • 打赏
  • 举报
回复
我怎么取不到_APS_NEXT_CONTROL_VALUE啊

它总说_APS_NEXT_CONTROL_VALUE没有定义

fzfzfz 2006-04-05
  • 打赏
  • 举报
回复
Klabc应该是正确的。
klabc 2006-04-05
  • 打赏
  • 举报
回复
上面的方法可以得到本窗口的所有直接子窗口的ID,所以从那个最大的开始使用就可以了
pizicai105 2006-04-05
  • 打赏
  • 举报
回复
我怎么取不到_APS_NEXT_CONTROL_VALUE啊

它总说_APS_NEXT_CONTROL_VALUE没有定义
pizicai105 2006-04-05
  • 打赏
  • 举报
回复
MFC程序建控件时,会自动按顺序一个数字接一个数字记录控件ID的吗
记录完会改写_APS_NEXT_CONTROL_VALUE该宏的最后值是吧

那我只要动态建控件时,获取_APS_NEXT_CONTROL_VALUE该值,
UINT iBegin = _APS_NEXT_CONTROL_VALUE

后面建的控件ID就用 iBegin ++就可以了是吧
pizicai105 2006-04-05
  • 打赏
  • 举报
回复
TO lily_123567(lili)
怎么遍历?
我看了一下,这里的值好像只是标识最后一个可用ID
还不能确定,这里几个宏有什么规律吗?

TO klabc(沉静生活)
你那个函数是得到this窗口里所有ID是吗?
我试了一下,不行啊,有很多ID都没得到
请详细说明一下谢谢,不太懂那个是什么意思
lily_123567 2006-04-05
  • 打赏
  • 举报
回复
可以利用工程中系统定义的下面几个宏
_APS_NEXT_RESOURCE_VALUE
_APS_NEXT_COMMAND_VALUE
_APS_NEXT_CONTROL_VALUE
_APS_NEXT_SYMED_VALUE
然后,自己分配的ID放在一个数组里,分配的时候便利一下看看有没有重复的。
klabc 2006-04-05
  • 打赏
  • 举报
回复
没必要保证是系统唯一的,保证是父窗口内唯一的就可以了。

void CParentWnd::DoSth()
{
CWnd* pChild = GetWindow(GW_CHILD);
int nMaxID = 0;
int nID;
while(pChild)
{
nID = pChild->GetDlgCtrlID();
nMaxID = nID > nMaxID ? nID : nMaxID;
pChild = pChild->GetNextWindow(GW_HWNDNEXT);
}

nMaxID++;//从这个ID开始使用就可以了
}
lixiaosan 2006-04-05
  • 打赏
  • 举报
回复
resource.h

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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