VC6.0中基于对话框的MFC EXE中的Tab Control控件如何使用???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC6.0中基于对话框的MFC EXE中的Tab Control控件如何使用???相关的知识,希望对你有一定的参考价值。

VC6.0中基于对话框的MFC EXE中的Tab Control控件如何使用???
请各位大侠讲的详细一点
或者详谈343679663

Tab Control是一个标签控件,只有标签,标签下面的窗体要你自己创建的子窗体、并通过回调、或者消息的方式来实现隐藏、显示,从而实现标签+显示选中的子窗体的效果。

MFC使用CTabCtrl进行封装,大致的流程是
1.创建TabCtrl
2.通过InsertItem方法添加页签
3.创建子窗体,指定这些窗体的父窗体为 上面创建的TabCtrl
4.在TabCtrl的父窗体类 或者 TabCtrl的继承类中 添加ON_NOTIFY响应消息, OnSize消息
5.实现消息响应函数

参考代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

... ...

int nCtrlID = 1, nTabIndex = 0;

if ( !m_wndTab.Create( TCS_FOCUSNEVER|WS_VISIBLE|TCS_RIGHTJUSTIFY, CRect( 0, 0, 0, 0 ), &m_wndView, nCtrlID++ ) )

TRACE0("Failed to create m_wndTab \n");
return -1;


CFont tabFont;
tabFont.CreateFont(12,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,
"宋体");
m_wndTab.SetFont(&tabFont,true);
tabFont.Detach();

m_wndTab.InsertItem( nTabIndex++, "错误" );
if ( !m_wndErrEvent.Create( WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER, CRect( 0, 0, 0, 0 ), &m_wndTab, nCtrlID++ ) )

TRACE0("Failed to create m_wndErrEvent \n");
return -1;

m_wndErrEvent.SetExtendedStyle( LVS_EX_FULLROWSELECT );
m_wndErrEvent.InsertColumn( 0, "时间" );
m_wndErrEvent.InsertColumn( 1, "错误事件" );
m_wndErrEvent.ShowWindow( SW_SHOW );

m_wndTab.InsertItem( nTabIndex++, "调试" );
if ( !m_wndDebugEvent.Create( WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER, CRect( 0, 0, 0, 0 ), &m_wndTab, nCtrlID++ ) )

TRACE0("Failed to create m_wndDebugEvent \n");
return -1;

m_wndDebugEvent.SetExtendedStyle( LVS_EX_FULLROWSELECT );
m_wndDebugEvent.InsertColumn( 0, "时间" );
m_wndDebugEvent.InsertColumn( 1, "调试事件" );
m_wndErrEvent.ShowWindow( SW_HIDE );
m_wndDebugEvent.ShowWindow( SW_SHOW );
m_wndTab.SetCurSel( m_wndTab.GetItemCount() - 1 );


ChildView.h:
//AFX_MSG(CChildView)
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
//AFX_MSG
afx_msg void OnSelChangeTab(NMHDR *pNotify,LRESULT *pResult);
DECLARE_MESSAGE_MAP()

ChildView.cpp:
BEGIN_MESSAGE_MAP(CChildView,CWnd )
//AFX_MSG_MAP(CChildView)
ON_WM_PAINT()
ON_WM_SIZE()
//AFX_MSG_MAP
ON_NOTIFY(TCN_SELCHANGE,1,OnSelChangeTab)
END_MESSAGE_MAP()

void CChildView::OnSize(UINT nType, int cx, int cy)

CWnd ::OnSize(nType, cx, cy);
if (IsWindow(((CMainFrame*)theApp.m_pMainWnd)->m_wndTab.m_hWnd))

CRect viewRect;
this->GetClientRect(viewRect);
((CMainFrame*)theApp.m_pMainWnd)->m_wndTab.MoveWindow(viewRect);
CRect tabRect;
((CMainFrame*)theApp.m_pMainWnd)->m_wndTab.GetClientRect(tabRect);
((CMainFrame*)theApp.m_pMainWnd)->m_wndTab.AdjustRect(FALSE,tabRect);

if (IsWindow(((CMainFrame*)theApp.m_pMainWnd)->m_wndDebugEvent.m_hWnd))

((CMainFrame*)theApp.m_pMainWnd)->m_wndDebugEvent.MoveWindow(tabRect);


if (IsWindow(((CMainFrame*)theApp.m_pMainWnd)->m_wndErrEvent.m_hWnd))

((CMainFrame*)theApp.m_pMainWnd)->m_wndErrEvent.MoveWindow(tabRect);

for ( int i = 0; i < 2; i++ )

((CMainFrame*)theApp.m_pMainWnd)->m_wndDebugEvent.SetColumnWidth( i, LVSCW_AUTOSIZE_USEHEADER );
((CMainFrame*)theApp.m_pMainWnd)->m_wndErrEvent.SetColumnWidth( i, LVSCW_AUTOSIZE_USEHEADER );




void CChildView::OnSelChangeTab(NMHDR *pNotify,LRESULT *pResult)

int cursel=((CMainFrame*)theApp.m_pMainWnd)->m_wndTab.GetCurSel();
if ( cursel == ((CMainFrame*)theApp.m_pMainWnd)->m_wndTab.GetItemCount() - 1 )

((CMainFrame*)theApp.m_pMainWnd)->m_wndDebugEvent.ShowWindow(SW_SHOW);
((CMainFrame*)theApp.m_pMainWnd)->m_wndErrEvent.ShowWindow(SW_HIDE);

else if ( cursel == 0 )

((CMainFrame*)theApp.m_pMainWnd)->m_wndDebugEvent.ShowWindow(SW_HIDE);
((CMainFrame*)theApp.m_pMainWnd)->m_wndErrEvent.ShowWindow(SW_SHOW);

参考技术A 这是标签控件:控件添加标签

为标签控件添加标签需要使用InsertItem方法,该方法用于向标签控件中添加标签。语法如下:

BOOL InsertItem( int nItem, TCITEM* pTabCtrlItem );

BOOL InsertItem( int nItem, LPCTSTR lpszItem );

BOOL InsertItem( int nItem, LPCTSTR lpszItem, int nImage );

BOOL InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, int nImage, LPARAM lParam );

参数说明如下。

l nMask:确定哪一项标签信息可用。

l nItem:标识新的标签索引。

l pTabCtrlItem:是TCITEM结构指针,TCITEM结构中包含了标签的详细信息。

l lpszItem:标识被插入项的指针。

l nImage:标识图像索引。

l lParam:用于设置关联标签的附加信息。
我这可能讲得不够详细,你可以到百度里搜索一下标签控件,会得到很多资料
参考技术B 装个MSDN就好,上面有的,或者搜索这个“MFC类库详解.chm”,讲的很清楚

VC++:如何在 MFC 对话框的 propertySheet 顶部显示控件

【中文标题】VC++:如何在 MFC 对话框的 propertySheet 顶部显示控件【英文标题】:VC++: How to display a control on the top of the propertySheet in MFC diaolg 【发布时间】:2015-12-28 06:41:59 【问题描述】:

全部

我对 VC++ 中的属性表有疑问。我有 2 个或更多 mfc 对话框,我通过属性表将这些对话框合并为一个对话框作为选项卡控件。我可以在属性表的顶部放置一个控件吗?有可能吗?

提前致谢。

【问题讨论】:

【参考方案1】:

如果您使用CPropertySheet,您可以在OnCreate 处理程序中添加您的控件(如MSDN 所述):

int CMyPropertySheet::OnCreate(LPCREATESTRUCT lpCreateStruct)

    int ret = CPropertySheet::OnCreate(lpCreateStruct);
    if(ret != 0)
        return ret;
    CRect rect;
    GetWindowRect(rect);
    // ... adjust rect here...
    MoveWindow(rect);
    // ... move tab control down here ...
    // ... add your controls above the tabctrl here ...

【讨论】:

以上是关于VC6.0中基于对话框的MFC EXE中的Tab Control控件如何使用???的主要内容,如果未能解决你的问题,请参考以下文章

vc6.0 mfc窗口问题

vc6.0中的mfc程序,判断当前exe程序所在的文件夹内,是不是有data这个文件夹

MFC CListCtrl 将一个列表的选中项添加到另一个列表

使用MFC操作EXCEL文件

openCV在VC6.0中的配置问题

求助,求向access2003版本数据库中加入新纪录的程序代码(VC6.0,MFC,ADO)