MFC中资源ID和具体控件之间的关系问题【学习笔记】

MFC中资源ID和具体控件之间的关系问题
在此之前,题主比较笨,一直没有发现这样一个简单的问题,就是资源和ID号和我们具体的控件ID是不一样的。
是什么意思呢(你知道你理解了-。-,不许笑)
就是资源ID就是一个模子ID,它标识着这个控件资源的ID而已,而我的具体控件,比如
CToolBar bar在Create() 的时候是另外定义一个bar的ID的。比如123什么鬼的。
所以资源ID是老妈,bar的ID是孩子,各有身份证嘛。
我遇到的问题是这样的。
在CMainFrame的OnCreate()函数中,成员变量m_wndToolBar和成员变量m_wndStatusBar初始之后。想要通过CMainFrame的成员函数GetControlBar(nID)来获取框架默认的工具栏控件的CControlBar指针。
结果我很笨的调用了如下代码:
CControlBar* pBar=this->GetControlBar(IDR_MAINFRAME);
IDR_MAINFRAME是程序默认的工具栏的资源ID,结果程序调试的时候老是说
pBar的值是NULL;

题主表示很无奈,那就去看它到底哪里出问题了吧;
我直接进到了VC6.0的根目录下
D:\VC++6.0\IN\Microsoft Visual Studio\VC98\MFC\SRC
中检索到了,CControlBar的函数原型,如下;
CControlBar* CFrameWnd::GetControlBar(UINT nID)
{
if (nID == 0) //判断参数ID是否是NULL,
return NULL; //是NULL,直接给你返回空指针-。-

// m_listControlBars是一个控件数组,一个个控件都排队存在这里,我们要获得队列里的第一个控件POSITION结构体。
POSITION pos = m_listControlBars.GetHeadPosition();
while (pos != NULL) //循环,判断结构是否被填充
{
//获取当前POSITION所代表的控件指针
CControlBar* pBar = (CControlBar*)m_listControlBars.GetNext(pos);
ASSERT(pBar != NULL); //判断指针是否为空
if (_AfxGetDlgCtrlID(pBar->m_hWnd) == nID) //判断该控件的ID号和参数的ID号是否一致。
{
ASSERT_KINDOF(CControlBar, pBar); //用ASSERT_KINDOF宏判断Pbar是否是CControlBar类型的指针。
return pBar; //经过层层筛选,返回正确的指针。
}
}
return NULL; //如果都没有nID所说的这货,那就是返回个控制针了。
}
这就是GetControl的运行原理了吧(有错的,请留言来打脸
然后我的问题差不多就解决了吧,因为我传递的是资源的ID号(IDR_MAINFRAME)结果这货不是m_wndToolBar的元素之一,结果检索不到他的指针,那是只能返回NULL
所以我老是看见我家的pBar指是???了。
为了验证我的猜想是正确,我又做了下面的事

CControlBar* pBar=this->GetControlBar(IDR_MAINFRAME);

上面添加了两行的代码
int id; //定义一个变量用于保存MainFrame的工具栏Create()的id
id=m_wndToolBar.GetDlgCtrlID();
然后调用
CControlBar* pBar=this->GetControlBar(IDR_MAINFRAME);
坑爹啊。我家pBar终于正常的回来了T_T;
一番折腾后我把我的心里路程写了下来,
作为我的个人学习笔记放我的博客上。
特别声明:
这篇文章纯属个人学习,有没有帮到你关我什么事啊,哈哈,表要打我。有兴趣就一起交流啊。
好了睡了。
晚安,大神们。

你可能感兴趣的:(Notes)