MFC中关于tab控件使用的一点心得

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcxingjun/article/details/48252191

最近在使用MFC开发程序,由于菜鸟一个,很多控件都不知道如何使用,最近看到mfc中tab控件的使用,本菜鸟也是看到如下使用方法,才有一点感想:

http://blog.csdn.net/tlovet1314/article/details/5595563

相信这个方法大家都已经知道,在OnInitDialog() 函数中添加有关tab代码即可,但一开始,我并不知道,把如下代码:

CRect rs;
m_tabCtrl.GetClientRect(&rs);
rs.top+=25;
rs.bottom-=1;
rs.left+=5;
rs.right-=2;

m_tabCtrl.InsertItem(0,_T("第一页"));
m_tabCtrl.InsertItem(1,_T("第二页"));  
 
dilog1.Create (IDD_DIALOG1,&m_tabCtrl);//或者Create(IDD_DIALOG1,GetDlgItem(IDC_TAB1));
dilog2.Create (IDD_DIALOG2,&m_tabCtrl);
 
dilog1.MoveWindow(&rs);
dilog2.MoveWindow(&rs);
 
dilog1.ShowWindow(true);
dilog2.ShowWindow(false);



放在了OnCreate函数中,变异没有错误,运行时就挂掉,很是纳闷,跟进InsertItem函数才知道到:

_AFXCMN_INLINE LONG CTabCtrl::InsertItem(int nItem, TCITEM* pTabCtrlItem)

ASSERT(::IsWindow(m_hWnd)); 

return (LONG)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)pTabCtrlItem);

 }


m_hwnd为空。。。



进过上网查询下面这句话让我茅塞顿开:

WM_INITDIALOG与WM_CREATE的区别: WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说只是通知系统说要开始创建窗口了,这个消息响应完之后,对话框和子控件才开始创建。因此在此消息响应函数中无法对控件进行修改和初始化。 而WM_INITDIALOG消息响应函数是在程序运行时,当其对话框和子控件全部创建完毕,将要显示内容的时候发送的消息。因此可以在WM_INITDIALOG消息响应函数中添加对编辑框控件的初始化和修改。

原来WM_CREATE消息响应函数处理完之前窗口是还没有被创建,所以m_hwnd是空的,所以上面的代码会报错,而WM_INITDIALOG消息函数中,所有的对话框都以创建完毕,所以不会报错。

所以只要在OnCreate函数调用之后的任何函数中添加创建tab控件的代码都不会报错大笑


本菜鸟初学小白,如有不对,还请大神赐教!!!!!


猜你喜欢

转载自blog.csdn.net/abcxingjun/article/details/48252191