CTabCtrl中禁用某个标签

illocal 2004-09-17 01:28:08

用CTabCtrl怎么样将其中的某个标签禁用掉(Disable)


...全文
494 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
flashboy 2005-05-17
  • 打赏
  • 举报
回复
就是把TAB搞成自画,很麻烦啊
billy145533 2005-03-15
  • 打赏
  • 举报
回复
添加数组bool IsLockedArray[];
IsLockedArray[i]表示第i页是否被屏蔽了,在
OnSelchangedTree1
OnSelchangingTree1
加以判断是否要进行页面切换
九重霄 2005-03-15
  • 打赏
  • 举报
回复
帮顶
smallcrocodile 2005-03-15
  • 打赏
  • 举报
回复
虽然我没有看明白,但是象个高手
蒋晟 2004-09-18
  • 打赏
  • 举报
回复
Q151662 HOWTO: How To Disable Tabs in CPropertySheet
support.microsoft.com?kbid=151662
kexuejia 2004-09-17
  • 打赏
  • 举报
回复
class CMyTab : public CTabCtrl
{
// Construction
public:
CMyTab();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyTab)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CMyTab();

BOOL SubClassDlgItem(UINT nID,CWnd* pParent);
// Generated message map functions
protected:
//{{AFX_MSG(CMyTab)
afx_msg void OnSelChanging(NMHDR* pNmh,LRESULT* pRes);
afx_msg void OnPaint();
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
protected:
virtual BOOL IsEnableTab(int nTab); //用来设置要变灰的Tab
virtual void PreSubclassWindow(); //用来设置m_hMenuFont,m_hPenLight,m_hPenShadow,m_hPenItemShadow属性

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); //用来画Tab上的字体
virtual void DrawItemRect(CDC& dc,CRect& rcItem,int nHint=0); //用来画Tab的边框
protected:
HPEN m_hPenLight; //用来设置画TabCtrl的边框颜色
HPEN m_hPenShadow; //用来设置画TabCtrl的边框颜色
HPEN m_hPenItemShadow; //用来设置画TabCtrl的边框颜色
HFONT m_hMenuFont; //用来设置Tab上Item的字体大小
int m_nActiveItem; //要激活的Tab的索引号
CRect m_rctPage; //得到TabCtrl的矩形区域,不包括Item区域
};

CMyTab::CMyTab():m_nActiveItem(-1),m_rctPage(0,0,0,0)
{
m_hPenLight = NULL;
m_hPenShadow = NULL;
m_hPenItemShadow = NULL;
m_hMenuFont = NULL;
}

CMyTab::~CMyTab()
{
}


BEGIN_MESSAGE_MAP(CMyTab, CTabCtrl)
//{{AFX_MSG_MAP(CMyTab)
ON_NOTIFY_REFLECT(TCN_SELCHANGING,OnSelChanging)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyTab message handlers
BOOL CMyTab::SubClassDlgItem(UINT nID,CWnd* pParent)
{
if(!CTabCtrl::SubclassDlgItem(nID,pParent))
return FALSE;

ModifyStyle(0,TCS_OWNERDRAWFIXED);//改变风格为自画

return TRUE;
}

BOOL CMyTab::IsEnableTab(int nTab)
{
switch(nTab)
{
case 0:
return false;
case 1:
return false;
case 2:
return false;
case 3:
return false;
case 4:
return false;
case 5:
return true;
case 6:
return false;
default:
return true;
}

return true;
}

void CMyTab::OnSelChanging(NMHDR* pNmh,LRESULT* pRes)
{
TC_HITTESTINFO htinfo;
GetCursorPos(&htinfo.pt);
ScreenToClient(&htinfo.pt);
int nNewTab = HitTest(&htinfo);

if(nNewTab>=0 && !IsEnableTab(nNewTab))
*pRes = TRUE;

if(nNewTab>=0 && IsEnableTab(nNewTab))
m_nActiveItem = nNewTab;
}

void CMyTab::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
DRAWITEMSTRUCT &ds = *lpDrawItemStruct;

// use draw item DC
CDC dc;
dc.Attach(ds.hDC);
dc.SelectObject(m_hMenuFont);
int nItem = ds.itemID;

// Get tab item info
char text[128];
TCITEM tci;
tci.mask = TCIF_TEXT;
tci.pszText = text;
tci.cchTextMax = sizeof(text);
GetItem(nItem, &tci);

// calculate text rectangle and color
CRect rc = ds.rcItem;
rc += CPoint(1,4);

// draw the text
if(IsEnableTab(nItem))
{
dc.SetTextColor(GetSysColor(COLOR_BTNTEXT));
dc.DrawText(text,&rc,DT_CENTER|DT_VCENTER);
}
else
{
rc += CPoint(-1,1);
dc.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
dc.DrawText(text,&rc,DT_CENTER|DT_VCENTER);
}

dc.Detach();
}

void CMyTab::DrawItemRect(CDC& dc,CRect& rcItem,int nHint)
{
//Let's draw items rect.
if(rcItem.left>0)
{
::SelectObject(dc.m_hDC,m_hPenLight);

if(nHint)
dc.MoveTo(rcItem.left,rcItem.bottom+2);
else
dc.MoveTo(rcItem.left,rcItem.bottom);

dc.LineTo(rcItem.left,rcItem.top+2); //画Item左边的竖线
dc.LineTo(rcItem.left+2,rcItem.top); //画Item左上角的弧线
dc.LineTo(rcItem.right-2,rcItem.top); //画Item顶部的横线

if(!nHint)
::SelectObject(dc.m_hDC,m_hPenItemShadow);
else
::SelectObject(dc.m_hDC,m_hPenShadow);

if(nHint) //画Active的Tab的右边
{
dc.LineTo(rcItem.right,rcItem.top+2);
dc.LineTo(rcItem.right,rcItem.bottom+2);
}
else //画UnActive的Tab的右边
{
dc.LineTo(rcItem.right,rcItem.top+2);
dc.LineTo(rcItem.right,rcItem.bottom+1);
}
}
}

void CMyTab::OnPaint()
{
CPaintDC dcPaint(this); // device context for painting

// TODO: Add your message handler code here
CRect rcPnt,rcItem,rcActive,rectCli;

//Copy update rect to rcPnt
rcPnt = dcPaint.m_ps.rcPaint;
dcPaint.FillSolidRect(&rcPnt,RGB(224,227,234));//画Item的背景

//Active item should be wider then other items.
//So here we calculate and apply the width difference.
GetItemRect(m_nActiveItem,&rcActive);
rcActive.top -= 2;

//开始画Tab的边,不包括Item区域
CRect rectTemp;
rectTemp = m_rctPage;
::SelectObject(dcPaint.m_hDC,m_hPenLight);
dcPaint.MoveTo(rectTemp.left,rectTemp.bottom+1);
dcPaint.LineTo(rectTemp.left,rectTemp.top+1);
dcPaint.LineTo(rcActive.left,rcActive.bottom+1);

dcPaint.MoveTo(rcActive.right,rcActive.bottom+1);
dcPaint.LineTo(rectTemp.right-2,rcActive.bottom+1);

::SelectObject(dcPaint.m_hDC,m_hPenShadow);
dcPaint.LineTo(rectTemp.right-2,rectTemp.bottom-1);
dcPaint.LineTo(rectTemp.left-1,rectTemp.bottom-1);

//开始画Item
DRAWITEMSTRUCT drawItemStruct;
for(int i=0;i<GetItemCount();i++)
{
if(i!=m_nActiveItem)//画非激活Item
{
GetItemRect(i,&rcItem);
rcItem.DeflateRect(1,0);

drawItemStruct.rcItem = rcItem;
drawItemStruct.hDC = dcPaint.GetSafeHdc();
drawItemStruct.itemID = i;
DrawItem(&drawItemStruct);
DrawItemRect(dcPaint,rcItem);
}
else//画激活Item
{
rcItem = rcActive;
dcPaint.FillSolidRect(&rcItem,RGB(224,227,234));

drawItemStruct.rcItem = rcItem;
drawItemStruct.hDC = dcPaint.GetSafeHdc();
drawItemStruct.itemID = m_nActiveItem;
DrawItem(&drawItemStruct);
DrawItemRect(dcPaint,rcItem,1);
}
}
}

void CMyTab::PreSubclassWindow()
{
CTabCtrl::PreSubclassWindow();

NONCLIENTMETRICS nclim;
nclim.cbSize=sizeof(NONCLIENTMETRICS);
::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICS),
&nclim,0);
m_hMenuFont= ::CreateFontIndirect(&nclim.lfMenuFont);//取得非客户区的系统字体

COLORREF clr = ::GetSysColor(COLOR_3DHILIGHT);
m_hPenLight = ::CreatePen(PS_SOLID,1,clr);//创建一个画笔画Item和Tab的左边和上边
clr=::GetSysColor(COLOR_3DDKSHADOW);
m_hPenShadow = ::CreatePen(PS_SOLID,1,clr);//创建一个阴影画笔画Tab的右边和下边
clr=::GetSysColor(COLOR_3DSHADOW);
m_hPenItemShadow = ::CreatePen(PS_SOLID,1,clr);//创建一个阴影画笔画Item的右边

m_nActiveItem=GetCurSel();
CRect rctItem;
GetItemRect(0,&rctItem);
GetClientRect(&m_rctPage);
m_rctPage.top=rctItem.bottom;//m_rctPage为TabCtrl的矩形区域,不包括Item区域
}

在CPropertySheet中的OnInitDialog中添加下面代码:
HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL);
m_MyTab.SubclassDlgItem(::GetDlgCtrlID(hWndTab),this);
就可以了。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧