none
mfc tabcontrol上的按钮怎么点不了 RRS feed

  • 问题

  • 主窗体上放了个tabcontrol,弄了三个页,生成三个类
    在第二个页上放了一个 文本框 和一个 按钮。
    点按钮文件框里显示文字。

    可是程序没问题,运行后,按钮点不了。点文本框也没有光标。
    怎么回事?
    2013年2月5日 11:27

全部回复

  • CTabCtrl控件设置WS_EX_CONTROLPARENT属性

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年2月6日 1:26
    版主
  • 不明白,能详细点吗?
    2013年2月6日 5:06
  • 您Tab页上的子对话框是不是设置了Control(DS_CONTROL)属性了WS_EX_CONTROLPARENT属性。例如: m_tab.ModifyStyleEx(0, WS_EX_CONTROLPARENT);

    如果您的子对话框没有设置Control属性的话,那么CTabCtrl控件就没有必要设置WS_EX_CONTROLPARENT风格了。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年2月6日 7:50
    版主
  • 只在属性面板里设置了;style为child    和border为none

    别没的了。

    然后就初使化里,create,movewindow,然后就显示了。。

    可不能用上面的控件

    2013年2月6日 8:58
  • 如果子对话框没有设置Control属性的话,应该是没有问题的。
    CRect rect;
    	m_tab.GetClientRect(&rect);
    	m_tab.InsertItem(0, _T("Tab 1"));
    	m_tab.InsertItem(1, _T("Tab 2"));
    	m_tab.ModifyStyle(DS_CONTROL, 0);
    	rect.DeflateRect(30, 30);
    	CDialog* pDlg = new CNewDlg1;
    	pDlg->Create(CNewDlg1::IDD, &m_tab);
    	pDlg->MoveWindow(rect);
    	pDlg->ShowWindow(SW_SHOW);
    	pDlg = new CNewDlg2;
    	pDlg->Create(CNewDlg2::IDD, &m_tab);
    	pDlg->MoveWindow(rect);
    	pDlg->ShowWindow(SW_HIDE);


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.


    2013年2月6日 9:21
    版主
  • 谢谢,还是不行,跟我自己写的一样效果。。

    这是代码,不知道哪错了。

    这是在最前面的

    #include "Page1.h"
    #include "Page2.h"
    #include "Page3.h"
    
    //CPage1 p1;
    //CPage2 p2;
    //CPage3 p3;
    
    CDialog* pDlg = new CPage1;
    CDialog* pDlg2 = new CPage2;

    这是OnInitDialog()里自己写的部分

    	CRect rs;
    	m_Tab.GetClientRect(rs);
    	rs.top+=20;
    	//rs.bottom-=20;
    	//rs.left+=1;
    	//rs.right-=2;
    
    	m_Tab.InsertItem(0,_T("abcde"));
    	m_Tab.InsertItem(1,_T("12345"));
    	m_Tab.InsertItem(2,_T("00000"));
    
    	m_Tab.ModifyStyle(DS_CONTROL, 0);
    
    //按你写的方法开始
    	pDlg->Create(CPage1::IDD, &m_Tab);
    	pDlg->MoveWindow(rs);
    	pDlg->ShowWindow(SW_SHOW);
    
    	pDlg2->Create(CPage2::IDD, &m_Tab);
    	pDlg2->MoveWindow(rs);
    	pDlg2->ShowWindow(SW_HIDE);
    //结束
    
    	//p1.Create(IDD_L1,GetDlgItem(IDC_TAB1));
    	//p2.Create(IDD_L2,GetDlgItem(IDC_TAB1));
    	//p3.Create(IDD_L3,GetDlgItem(IDC_TAB1));
    	
    	//p1.MoveWindow(&rs);
    	//p2.MoveWindow(&rs);
    	//p3.MoveWindow(&rs);
    
    	m_Tab.SetCurSel(0);
    	//p1.ShowWindow(1);
    	//p2.ShowWindow(0);
    	//p3.ShowWindow(0);


    这是OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult),切换标签的

    void ChexasciiDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	 //TODO: 在此添加控件通知处理程序代码
    	int cursel=m_Tab.GetCurSel();
    
    	switch (cursel)
    	{
    	case 0:
    		pDlg->ShowWindow(SW_SHOW);
    		pDlg2->ShowWindow(SW_HIDE);
    		/*p1.ShowWindow(1);
    		p2.ShowWindow(0);
    		p3.ShowWindow(0);*/
    		break;
    	case 1:
    		pDlg->ShowWindow(SW_HIDE);
    		pDlg2->ShowWindow(SW_SHOW);
    		/*p1.ShowWindow(0);
    		p2.ShowWindow(1);
    		p3.ShowWindow(0);*/
    		break;
    	case 2:
    		/*p1.ShowWindow(0);
    		p2.ShowWindow(0);
    		p3.ShowWindow(1);*/
    		break;
    	default:
    		
    		break;
    	}
    	*pResult = 0;
    }


    (注释掉的是我自己写的)

    还是不能点按钮。


    pDlg2->Create(CPage2::IDD, &m_Tab);

    这里的两上参数是什么意思,跟我写的不一样。

    另外我想在msdn里查pDlg2->Create函数要怎么查

    • 已编辑 angel725 2013年2月6日 15:12
    2013年2月6日 11:08
  • pDlg2->Create(...);像您那样写也是可以的。您上面的代码应该没有问题。您需要检查一下您的对话框资源属性(是否是Child风格??)是否设置了Control属性值为TRUE了。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年2月7日 3:19
    版主
  • 谢谢,还是不行,跟我自己写的一样效果。。

    这是代码,不知道哪错了。

    这是在最前面的

    #include "Page1.h"
    #include "Page2.h"
    #include "Page3.h"
    
    //CPage1 p1;
    //CPage2 p2;
    //CPage3 p3;
    
    CDialog* pDlg = new CPage1;
    CDialog* pDlg2 = new CPage2;

    这是OnInitDialog()里自己写的部分

    	CRect rs;
    	m_Tab.GetClientRect(rs);
    	rs.top+=20;
    	//rs.bottom-=20;
    	//rs.left+=1;
    	//rs.right-=2;
    
    	m_Tab.InsertItem(0,_T("abcde"));
    	m_Tab.InsertItem(1,_T("12345"));
    	m_Tab.InsertItem(2,_T("00000"));
    
    	m_Tab.ModifyStyle(DS_CONTROL, 0);
    
    //按你写的方法开始
    	pDlg->Create(CPage1::IDD, &m_Tab);
    	pDlg->MoveWindow(rs);
    	pDlg->ShowWindow(SW_SHOW);
    
    	pDlg2->Create(CPage2::IDD, &m_Tab);
    	pDlg2->MoveWindow(rs);
    	pDlg2->ShowWindow(SW_HIDE);
    //结束
    
    	//p1.Create(IDD_L1,GetDlgItem(IDC_TAB1));
    	//p2.Create(IDD_L2,GetDlgItem(IDC_TAB1));
    	//p3.Create(IDD_L3,GetDlgItem(IDC_TAB1));
    	
    	//p1.MoveWindow(&rs);
    	//p2.MoveWindow(&rs);
    	//p3.MoveWindow(&rs);
    
    	m_Tab.SetCurSel(0);
    	//p1.ShowWindow(1);
    	//p2.ShowWindow(0);
    	//p3.ShowWindow(0);


    这是OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult),切换标签的

    void ChexasciiDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	 //TODO: 在此添加控件通知处理程序代码
    	int cursel=m_Tab.GetCurSel();
    
    	switch (cursel)
    	{
    	case 0:
    		pDlg->ShowWindow(SW_SHOW);
    		pDlg2->ShowWindow(SW_HIDE);
    		/*p1.ShowWindow(1);
    		p2.ShowWindow(0);
    		p3.ShowWindow(0);*/
    		break;
    	case 1:
    		pDlg->ShowWindow(SW_HIDE);
    		pDlg2->ShowWindow(SW_SHOW);
    		/*p1.ShowWindow(0);
    		p2.ShowWindow(1);
    		p3.ShowWindow(0);*/
    		break;
    	case 2:
    		/*p1.ShowWindow(0);
    		p2.ShowWindow(0);
    		p3.ShowWindow(1);*/
    		break;
    	default:
    		
    		break;
    	}
    	*pResult = 0;
    }


    (注释掉的是我自己写的)

    还是不能点按钮。


    pDlg2->Create(CPage2::IDD, &m_Tab);

    这里的两上参数是什么意思,跟我写的不一样。

    另外我想在msdn里查pDlg2->Create函数要怎么查


    另外我想在msdn里查pDlg2->Create函数要怎么查
    ----------------------------------------------------------
    查看CDialog::Create 即可。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年2月7日 3:20
    版主
  • (是否是Child风格??)是否设置了Control属性值为TRUE了。

    都设置了。也不行。

    我重做了一个,

    https://skydrive.live.com/redir?resid=4B47795D7265162A!282&authkey=!AHKB_hsqmHcdbqA

    是哪里的问题啊

    谢谢

    2013年2月7日 5:29
  • 您的工程版本太高,我这边打不开,不过我看了下您的rc文件,子对话框都设置了DS_CONTROL属性了。之前已经说过了,如果您设置了您的对话框具有DS_CONTROL风格的话,那么您需要修改CTabCtrl控件的属性,加上WS_EX_CONTROLPARENT风格即可。
    所以您上面的代码中需要将这句修改成这个样子的:
    m_Tab.ModifyStyle(DS_CONTROL, 0);
    ---->
    m_Tab.ModifyStyleEx(0, WS_EX_CONTROLPARENT);


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年2月7日 5:49
    版主
  • 加了这句m_Tab.ModifyStyleEx(0, WS_EX_CONTROLPARENT);

    也不行的。。。。

    2013年3月1日 15:41
  • 没人知道怎么回事吗??
    2013年3月11日 15:48