我的程序是基于Dialog的,在我主窗体上有一个TabCtrl(m_Tab_Mode)控件,现在我通过点击窗体上一按钮,改变TabCtrl所选择的页面,同时我也想让它执行TCN_SELCHANGE所对应的操作,所以就需要向TabCtrl发送这个消息,我用的:  
NMHDR   nmhdr;   
nmhdr.code=TCN_SELCHANGE;   
nmhdr.hwndFrom=m_Tab_Mode.GetSafeHwnd();   
nmhdr.idFrom=IDC_TAB_MODE;    
::SendMessage(this->GetSafeHwnd(),WM_NOTIFY,MAKELONG(TCN_SELCHANGE,0),(LPARAM)(&nmhdr)); 
  但是却都没有效果,请问为什么,是不是参数有问题,怎样改才能生效呢?请高手指教!

解决方案 »

  1.   

    TCN_SELCHANGE是发送给父窗口的消息,要在父窗口中(这里是对话框)处理这个消息.
      

  2.   

    不知道楼主想做什么``如果是想设置tab页``,可用SetCurSel,如果是想触发OnSelChange,则SendMessage就对了``你的参数是对的``但是tab ctrl的页面不会改变``
      

  3.   

    点击按钮的时候,调用setcursel,那么tab就会给父窗口发送这个消息了
    在父窗口处理一下这个消息就好了
      

  4.   

    楼上的搞错了吧?SetCurSel不会触发OnChange的``
      

  5.   

    映射类CTabCtrl对应你的Tab控件,在主对话框中定义一个CTabCtrl变量m_cTabWnd,
    在CXXXDlg::OnInitDilaog()中加入如下代码,
    m_cTabWnd.Create(WS_CHILD | WS_VISIBLE,CRect(20,56,400,150),this,IDC_TAB);
    IDC_TAB是你的Tab控件对应ID,ON_NOTIFY(TCN_SELCHANGE,IDC_TAB1,OnSelChangeTab)
    映射TCN_SELCHANGE消息
    如下消息处理函数
    void CXXXDlg::OnSelectChangeTab(NMHDR* pNMHDR, LRESULT* pResult)
    {//处理页选择改变后的消息
    int iindex = m_cTabWnd.GetCurSel()          switch(iindex)
                {
                  case 0:
         view1.ShowWindow(SW_SHOW);
         view2.ShowWindow(SW_HIDE);
                  view3.ShowWindow(SW_HIDE);
                  break;
                  case 1:
         view2.ShowWindow(SW_SHOW);
         view1.ShowWindow(SW_HIDE);
                  view3.ShowWindow(SW_HIDE);
                  break;
                  case 3:
                  view3.ShowWindow(SW_SHOW);
                  view1.ShowWindow(SW_HIDE);
                  view2.ShowWindow(SW_HIDE);
                  break;
                }
    }
      

  6.   

    view1,view2,view3对应你的不同的页面
      

  7.   

    可能是我没有说清楚,我用SendMessage的方式是想触发OnTcnSelchangeTabMode事件,执行相应的操作,看我的主窗体消息映射
    ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_MODE, OnTcnSelchangeTabMode);
    用SetCurSel是可以改变当前TAB控件选择的页面,但是不能触发OnTcnSelchangeTabMode事件,我的目的就是这样,为何我的SendMessage不起作用啊,请大家继续支持,谢谢!
      

  8.   

    lz``这是我的代码``测试了是可以触发OnChange的``
    NMHDR nmhdr;
    nmhdr.code = TCN_SELCHANGE;   
    nmhdr.hwndFrom = m_pTab.GetSafeHwnd();   
    nmhdr.idFrom= m_pTab.GetDlgCtrlID();   
    ::SendMessage(m_pTab.GetSafeHwnd(), WM_NOTIFY,MAKELONG(TCN_SELCHANGE,0), (LPARAM)(&kk));
      

  9.   

    CrazyAzreal:感谢回复,你那个参数“(LPARAM)(&kk)”,kk是什么意思,是nmhdr吗?
      

  10.   

    CrazyAzreal:测试成功!谢谢各位的回复!
      

  11.   

    fastyhd  : 我试了一下,还是不行啊,能不能告诉我,是怎么弄的?
      

  12.   

    NMHDR       nmhdr;       
    nmhdr.code=TCN_SELCHANGE;       
    nmhdr.hwndFrom=m_Tab_Mode.GetSafeHwnd();       
    nmhdr.idFrom=IDC_TAB_MODE;         
    ::SendMessage(this-> GetSafeHwnd(),WM_NOTIFY,MAKELONG(TCN_SELCHANGE,0),(LPARAM)(&nmhdr));   nmhdr这是一个局部变量,我不知道SendMessage之后主窗体是否还来的急处理消息,因为此过程马上就要结束了
      

  13.   

    本人测试通过void CTabSetItemTestDlg::OnBnClickedButton1()
    {
    NMHDR   nmhdr; 
    nmhdr.code = TCN_SELCHANGE;       
    nmhdr.hwndFrom =   m_tab.GetSafeHwnd();       
    nmhdr.idFrom= m_tab.GetDlgCtrlID();  ::SendMessage(::GetDlgItem(AfxGetApp()->GetMainWnd()->GetSafeHwnd(), IDC_TAB1),TCM_SETCURSEL,01,NULL);
    ::SendMessage(::GetDlgItem(AfxGetApp()->GetMainWnd()->GetSafeHwnd(), IDC_TAB1),   WM_NOTIFY,MAKELONG(TCN_SELCHANGE,1),   (LPARAM)(&nmhdr));
     
    }