怎么改变 CPropertySheet 中 Tabmenu 选项 卡 的颜色??给 200 分了。

时间:2021-09-29 15:30:07
我很菜,刚入门的,各位高手帮帮小弟。
我用 AddPage()加了几个页面上去,页面的颜色或者背静色怎么改变??

还有这个 tabcontrol 上面的 选项卡 的颜色怎么改变??或者怎么加个 背景图片??
能给我个源代码吗??
我刚学VC ,希望各位高手帮帮我啊。。。。。
先谢谢了。。。。

15 个解决方案

#1


在创建sheet之前修改CPropertyPage::m_psp和CPropertySheet::m_psh

PSP_USEHICON 
Uses hIcon as the small icon on the tab for the page. 
PSP_USEICONID 
Uses pszIcon as the name of the icon resource to load and use as the small icon on the tab for the page. 

只有向导风格的Sheet可以添加背景图片

PSH_HEADER 
Version 5.80. Indicates that a header bitmap will be used with a Wizard97 wizard. You must also set the PSH_WIZARD97 flag. The header bitmap is obtained from the pszbmHeader member, unless the PSH_USEHBMHEADER flag is also set. In that case, the header bitmap is obtained from the hbmHeader member. 

PSH_USEHBMHEADER 
Version 5.80. Obtains the header bitmap from the hbmHeader member instead of the pszbmHeader member. You must also set PSH_WIZARD97 and PSH_HEADER. 
PSH_USEHBMWATERMARK 
Version 5.80. Obtains the watermark bitmap from the hbmWatermark member instead of the pszbmWatermark member. You must also set PSH_WIZARD97 and PSH_WATERMARK. PSH_USEHPLWATERMARK 
Version 5.80. Uses the HPALETTE structure pointed to by the hplWatermark member instead of the default palette to draw the watermark bitmap and/or header bitmap for a Wizard97 wizard. You must also set PSH_WIZARD97, and PSH_WATERMARK or PSH_HEADER. 
PSH_WATERMARK 
Version 5.80. Specifies that a watermark bitmap will be used with a Wizard97 wizard. You must also set the PSH_WIZARD97 flag. The watermark bitmap is obtained from the pszbmWatermark member, unless PSH_USEHBMWATERMARK is set. In that case, the header bitmap is obtained from the hbmWatermark member

#2


不知道能不能用 刷子!!

#3


看来是不好实现这个东西了。
那么,怎么改变 tabcontrol 上面的选项卡的颜色呢。
比如我现在窗体的 主体颜色 都是 RGB(233,233,233),但是,就上面几个选项卡和 选项卡 空白处的 rgb(192.192.192),这个值是系统 default 的,我更改了 默认的 192,但是也不起作用。
各位大虾,帮帮小弟吧。这个问题特别急啊。。。。。。。。
要不我单独给那个大虾分数,只要能解决这个问题,我在 给 300 分了。。

#4


子类化可以的

#5


麻烦大虾说具体点点嘛。
我是才搞VC 的。

#6


自己画吧
CTabCtrl::DrawItem
void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

Parameters

lpDrawItemStruct

A pointer to aDRAWITEMSTRUCT structure describing the item to be painted.

Remarks

Called by the framework when a visual aspect of an owner-draw tab control changes. The itemAction member of the DRAWITEMSTRUCT structure defines the drawing action that is to be performed. 

By default, this member function does nothing. Override this member function to implement drawing for an owner-draw CTabCtrl object.

The application should restore all graphics device interface (GDI) objects selected for the display context supplied in lpDrawItemStruct before this member function terminates.

#7


各位大虾帮帮忙啊。。。。。。。
给点思路也好。。。要不我再加分数。

#8


救救我吧。。。。。。。。。。
我一直在这里等着啊。。。。。。。。。。。。。。。。。。。

#9


不知SetTextColor()和SetBkColor行不行,我现在没时间试

#10


********以下代码摘自VC编程高手,,,应该有用的*********


本程序根据collect创建了一个CTabCtrlView类,用于实现标签视的功能。关于该类的源码,列在本章的最后,下面介绍如何使用该程序。首先,从CTabCtrlView派生一个类CMyTabView,并重载其InitTabs函数:

#11


咋搞得,代码贴不上,留个mail把,发给你看看

#12


TC_ITEM tc_item;
CTabCtrl* tab = GetTabControl();
CBitmap bmp;
CImageList*pilTab=new CImageList();
VERIFY(pilTab->Create(16, 15, ILC_COLOR, 3, 0));
bmp.LoadBitmap(IDB_BITMAP1);
pilTab->Add(&bmp, RGB(127, 127, 127));
bmp.DeleteObject();
bmp.LoadBitmap(IDB_BITMAP2);
pilTab->Add(&bmp, RGB(127, 127, 127));
bmp.DeleteObject();
bmp.LoadBitmap(IDB_BITMAP3);
pilTab->Add(&bmp, RGB(127, 127, 127));
bmp.DeleteObject();
tab->SetCurSel(2);
tab->SetImageList(pilTab);
tc_item.mask=TCIF_TEXT | TCIF_IMAGE;
tc_item.pszText="Icon";
tc_item.iImage=0;
tab->InsertItem(0, &tc_item);
tc_item.pszText="Small Icon";
tc_item.iImage=1;
tab->InsertItem(1, &tc_item);
tc_item.pszText="List";
tc_item.iImage=2;
tab->InsertItem(2, &tc_item);
上述代码能实现插入背景图片,但还需处理TabSelChange.其实比较简单的方法是将属性页改为标签控件。我有较完整的例子,留下你的邮箱

#13


void CMyTabView::InitTabs(CTabCtrlView* pView)
{
        TC_ITEM TabCtrlItem;

        TabCtrlItem.mask = TCIF_TEXT | TCIF_IMAGE;
        TabCtrlItem.pszText = "CStringList";
        TabCtrlItem.iImage = 1;
        m_TabCtl.InsertItem( 0, &TabCtrlItem );
        TabCtrlItem.pszText = "CTypedPtrList";
        m_TabCtl.InsertItem( 1, &TabCtrlItem );
        TabCtrlItem.pszText = "CList";
        m_TabCtl.InsertItem( 2, &TabCtrlItem );
        TabCtrlItem.pszText = "CDWordArray";
        m_TabCtl.InsertItem( 3, &TabCtrlItem );
        TabCtrlItem.pszText = "CTypedPtrArray";
        m_TabCtl.InsertItem( 4, &TabCtrlItem );
        TabCtrlItem.pszText = "CArray";
        m_TabCtl.InsertItem( 5, &TabCtrlItem );
        TabCtrlItem.pszText = "CMapStringToString";
        m_TabCtl.InsertItem( 6, &TabCtrlItem );
        TabCtrlItem.pszText = "CTypedPtrMap";
        m_TabCtl.InsertItem( 7, &TabCtrlItem );
        TabCtrlItem.pszText = "CMap";
        m_TabCtl.InsertItem( 8, &TabCtrlItem );
        //Important You must always call the base class        
        CTabCtrlView::InitTabs(pView);
        return;
}
下一步是重载其函数:

BOOL CMyTabView::HandleTabs(int sel)
{
        //The MFC doc/view model expects the
        //mainFrame to handle changing view
        //so we let the mainframe do it.

        CWnd* Wnd = AfxGetMainWnd();

        switch(sel)
        {
        case 0:
                Wnd->SendMessage(WM_COMMAND, ID_STRINGLIST, 0);
                break;
        case 1:
                Wnd->SendMessage(WM_COMMAND, ID_TYPEDLIST, 0);
                break;
        case 2:
                Wnd->SendMessage(WM_COMMAND, ID_INTLIST, 0);
                break;
        case 3:
                Wnd->SendMessage(WM_COMMAND, ID_DWORDARRAY, 0);
                break;
        case 4:
                Wnd->SendMessage(WM_COMMAND, ID_TYPEDPTRARRAY, 0);
                break;
        case 5:
                Wnd->SendMessage(WM_COMMAND, ID_POINTARRAY, 0);
                break;
        case 6:
                Wnd->SendMessage(WM_COMMAND, ID_MAPSTRINGTOSTRING, 0);
                break;
        case 7:
                Wnd->SendMessage(WM_COMMAND, ID_TYPEDPTRMAP, 0);
                break;
        case 8:
                Wnd->SendMessage(WM_COMMAND, ID_MAPDWORDTOMYSTRUCT, 0);
                break;
        default:
                ASSERT(0);
                return FALSE;
        }
        return TRUE;
}
同时,需要对主框架类进行修改。首先,声明一个protected的派生类CMyTabView对象m_tabView,并重载OnCreateClient函数: 

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
        if(!m_tabView.CreateStatic(this))
        {
                TRACE0("Failed to CreatePropertySheet\n");
                return FALSE;
        }       
        CRuntimeClass* pNewViewClass = RUNTIME_CLASS(CStringListView);
        m_tabView.SetTab(0);

        CSize size(160, 180);

        if (!m_tabView.CreateView(pNewViewClass, size, pContext))
        {
                TRACE0("Failed to create first pane\n");
                return FALSE;
        }
        
        SetActiveView(m_tabView.GetActiveView());
        return TRUE;
}
最后一步就是修改OnExample函数:

void CMainFrame::OnExample(UINT nCmdID)
{
        if (nCmdID == m_nCurrentExample)
                return;  // already selected

        // Set the child window ID of the active view to AFX_IDW_PANE_FIRST.
        // This is necessary so that CFrameWnd::RecalcLayout will allocate
        // this "first pane" to that portion of the frame window's client
        // area not allocated to control bars.  Set the child ID of
        // the previously active view to some other ID; we will use the
        // command ID as the child ID.
        CView* pOldActiveView = GetActiveView();
                ::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);

        CRuntimeClass* pNewViewClass;
        switch (nCmdID)
        {
                case ID_STRINGLIST:
                        pNewViewClass = RUNTIME_CLASS(CStringListView);
                        break;
                case ID_TYPEDLIST:
                        pNewViewClass = RUNTIME_CLASS(CTypedPtrListView);
                        break;
                case ID_INTLIST:
                        pNewViewClass = RUNTIME_CLASS(CIntListView);
                        break;
                case ID_DWORDARRAY:
                        pNewViewClass = RUNTIME_CLASS(CDWordArrayView);
                        break;
                case ID_TYPEDPTRARRAY:
                        pNewViewClass = RUNTIME_CLASS(CTypedPtrArrayView);
                        break;
                case ID_POINTARRAY:
                        pNewViewClass = RUNTIME_CLASS(CPointArrayView);
                        break;
                case ID_MAPSTRINGTOSTRING:
                        pNewViewClass = RUNTIME_CLASS(CMapStringToStringView);
                        break;
                case ID_TYPEDPTRMAP:
                        pNewViewClass = RUNTIME_CLASS(CTypedPtrMapView);
                        break;
                case ID_MAPDWORDTOMYSTRUCT:
                        pNewViewClass = RUNTIME_CLASS(CMapDWordToMyStructView);
                        break;
                default:
                        ASSERT(0);
                        return;
        }

        // create the new view
        CCreateContext context;
        context.m_pNewViewClass = pNewViewClass;
        context.m_pCurrentDoc = GetActiveDocument();

        // New Code below
        CView* pNewView = m_tabView.CreateView(pNewViewClass, CSize(100,100), &context);

        if (pNewView != NULL)
        {
                // the new view is there, but invisible and not active...
                pNewView->ShowWindow(SW_SHOW);
                pNewView->OnInitialUpdate();
                SetActiveView(pNewView);
                m_tabView.RecalcLayout();       //<-- New Code
                RecalcLayout();
                m_nCurrentExample = nCmdID;

                // finally destroy the old view...
                pOldActiveView->DestroyWindow();
        }
}
下面是CTabCtrlView的源代码:
  


#if !defined(AFX_CTabCtrlView_H__8E652EC1_5159_11D1_96A0_0E6B8A000000__INCLUDED_)
#define AFX_CTabCtrlView_H__8E652EC1_5159_11D1_96A0_0E6B8A000000__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// CTabCtrlView.h : header file
//

#include "afxcmn.h"

class CTabCtrlView;

class CViewTabCtl : public CTabCtrl
{
// Construction
public:
        CViewTabCtl();

// Attributes
public:

// Operations
public:
        
// Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CViewTabCtl)
        //}}AFX_VIRTUAL

// Implementation
public:
        void SetView(CTabCtrlView* pView);
        virtual void RecalcLayout(CRect& rect, CWnd* wnd);
        virtual ~CViewTabCtl();
        virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

        // Generated message map functions
protected:
        CTabCtrlView* m_pView;
        CString m_sGrayFont;
        CString m_sSelFont;
        CDC m_dc;
        CFont m_selFont;
        virtual BOOL HandleTabs(int sel);
        //{{AFX_MSG(CViewTabCtl)
        afx_msg void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult);
        //}}AFX_MSG

        DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CCTabCtrlView window

// The actual tab control
// Wrapper Window Handles Interfacing to MFC doc View Model
// and resizing of the Tab Ctrl
class CTabCtrlView : public CWnd
{
// Construction
public:
        CTabCtrlView();

// Attributes
public:

// Operations
public:

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

// Implementation
public:
        virtual BOOL HandleTabs(int sel);
        void SetTab(int Tab);
        virtual void SetView();
        void RecalcLayout();
        CView* GetActiveView();
        BOOL CreateStatic(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST);
        virtual CView* CreateView(CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
        virtual ~CTabCtrlView();

        // Generated message map functions
protected:
        virtual void InitTabs(CTabCtrlView* pView);
        CViewTabCtl m_TabCtl;
        CView* m_ActiveView;
        
        BOOL CreateCommon(CWnd* pParentWnd, SIZE si*, DWORD dwStyle, UINT nID);
        //{{AFX_MSG(CCTabCtrlView)
        afx_msg void OnSize(UINT nType, int cx, int cy);
        afx_msg BOOL OnEraseBkgnd(CDC* pDC);
        afx_msg void OnPaint();
        //}}AFX_MSG

        DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// CViewTabCtl window


//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CTabCtrlView_H__8E652EC1_5159_11D1_96A0_0E6B8A000000__INCLUDED_)


/////////////////////////////////////////////////////////////////////////////
C++ Code file
/////////////////////////////////////////////////////////////////////////////

// CTabCtrlView.cpp : implementation file
//

// core headers
#include "afx.h"
#include "afxplex_.h"
#include "afxcoll.h"
#include "afxcmn.h"

#include "stdafx.h"

#include "TabCtrlView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define CX_BORDER 1
#define CY_BORDER 1

#define MAX_COLORS 10

// The following colors give a Tab Ctrl an OS/2 look
COLORREF colorRef[MAX_COLORS] =
{
        RGB(0,225,255),
        RGB(0,240,190),
        RGB(128,128,255),
        RGB(240,200,175),
        RGB(240,240,150),
        RGB(175,130,175),
        RGB(240,140,0),
        RGB(255,200,0),
        RGB(255,160,120),
        RGB(255,200, 175)
};


/////////////////////////////////////////////////////////////////////////////
// CTabCtrlView

CTabCtrlView::CTabCtrlView()
{
}

CTabCtrlView::~CTabCtrlView()
{
}


BEGIN_MESSAGE_MAP(CTabCtrlView, CWnd)
        //{{AFX_MSG_MAP(CTabCtrlView)
        ON_WM_SIZE()
        ON_WM_ERASEBKGND()
        ON_WM_PAINT()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTabCtrlView message handlers

BOOL CTabCtrlView::CreateStatic(CWnd * pParentWnd, DWORD dwStyle, UINT nID)
{
        ASSERT(pParentWnd != NULL);
        ASSERT(dwStyle & WS_CHILD);
        ASSERT(!(dwStyle & SPLS_DYNAMIC_SPLIT));

        // create with zero minimum pane size
        if (!CreateCommon(pParentWnd, CSize(0, 0), dwStyle, nID))
                return FALSE;

        // all panes must be created with explicit calls to CreateView
        return TRUE;
}





BOOL CTabCtrlView::CreateCommon(CWnd * pParentWnd, SIZE si*, DWORD dwStyle, UINT nID)
{
        ASSERT(pParentWnd != NULL);
        ASSERT(si*.cx >= 0 && si*.cy >= 0);
        ASSERT(dwStyle & WS_CHILD);
        ASSERT(nID != 0);

        // create with the same wnd-class as MDI-Frame (no erase bkgnd)
        if (!CreateEx(0, NULL, NULL, dwStyle, 0, 0, 0, 0,
          pParentWnd->m_hWnd, (HMENU)nID, NULL))
                return FALSE;       // create invisible

        //Create the Tab Control
        CRect rect;
        GetClientRect(rect);
        CImageList pImageList;


        m_TabCtl.Create(WS_VISIBLE | WS_CHILD | TCS_OWNERDRAWFIXED, rect, this, nID);

        //Overide this function to provide your Tabs
        InitTabs(this);
        return TRUE;
}

CView* CTabCtrlView::CreateView(CRuntimeClass * pViewClass, SIZE sizeInit, CCreateContext * pContext)
{
#ifdef _DEBUG
        ASSERT_VALID(this);
        ASSERT(pViewClass != NULL);
        ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
        ASSERT(AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), FALSE));
#endif

        BOOL bSendInitialUpdate = FALSE;

        CCreateContext contextT;
        if (pContext == NULL)
        {
                // if no context specified, generate one from the currently selected
                //  client if possible
                CView* pOldView = NULL;
                if (pOldView != NULL && pOldView->IsKindOf(RUNTIME_CLASS(CView)))
                {
                        // set info about last pane
                        ASSERT(contextT.m_pCurrentFrame == NULL);
                        contextT.m_pLastView = pOldView;
                        contextT.m_pCurrentDoc = pOldView->GetDocument();
                        if (contextT.m_pCurrentDoc != NULL)
                                contextT.m_pNewDocTemplate =
                                  contextT.m_pCurrentDoc->GetDocTemplate();
                }
                pContext = &contextT;
                bSendInitialUpdate = TRUE;
        }

        CWnd* pWnd;
        TRY
        {
                pWnd = (CWnd*)pViewClass->CreateObject();
                if (pWnd == NULL)
                        AfxThrowMemoryException();
        }
        CATCH_ALL(e)
        {
                TRACE0("Out of memory creating a splitter pane.\n");
                // Note: DELETE_EXCEPTION(e) not required
                return (CView*) NULL;
        }
        END_CATCH_ALL

        ASSERT_KINDOF(CWnd, pWnd);
        ASSERT(pWnd->m_hWnd == NULL);       // not yet created

        DWORD dwStyle = AFX_WS_DEFAULT_VIEW;

        // Create with the right size (wrong position)
        CRect rect(CPoint(0,0), sizeInit);
        if (!pWnd->Create(NULL, NULL, dwStyle,
                rect, this, 0, pContext))
        {
                TRACE0("Warning: couldn't create client pane for splitter.\n");
                        // pWnd will be cleaned up by PostNcDestroy
                return (CView*) NULL;
        }

        // send initial notification message
        if (bSendInitialUpdate);
//              pWnd->SendMessage(WM_INITIALUPDATE);
        m_ActiveView = (CView*) pWnd;
        return m_ActiveView;
}

void CTabCtrlView::OnSize(UINT nType, int cx, int cy) 
{
        if (nType != SIZE_MINIMIZED && cx > 0 && cy > 0)
                RecalcLayout();

        CWnd::OnSize(nType, cx, cy);
        return;
}

void CTabCtrlView::RecalcLayout()
{
        CWnd* pWnd = (CWnd*) GetActiveView();
        CRect rect;
        GetClientRect(&rect);
        m_TabCtl.RecalcLayout(rect, pWnd);
}

CView* CTabCtrlView::GetActiveView()
{
        return m_ActiveView;
}

BOOL CTabCtrlView::OnEraseBkgnd(CDC* pDC) 
{
        return FALSE;
}

void CTabCtrlView::OnPaint() 
{
        CPaintDC dc(this); // device context for painting
}

void CTabCtrlView::SetView()
{
        //In most cases your main app window
        //should handle this. This is becuase
        //the doc view model expects the view
        //to be attached to your main frame
}

void CTabCtrlView::SetTab(int Tab)
{
        m_TabCtl.SetCurSel(Tab);
}

void CTabCtrlView::InitTabs(CTabCtrlView* pView)
{
        m_TabCtl.SetView(pView);
        return;
}

BOOL CTabCtrlView::HandleTabs(int sel)
{
        ASSERT(FALSE);
        return FALSE;
}






/////////////////////////////////////////////////////////////////////////////
// CViewTabCtl

CViewTabCtl::CViewTabCtl()
{
        m_sSelFont = _T("Helv");
        m_sGrayFont= _T("Helv");
}

CViewTabCtl::~CViewTabCtl()
{
}


BEGIN_MESSAGE_MAP(CViewTabCtl, CTabCtrl)
        //{{AFX_MSG_MAP(CViewTabCtl)
        ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CViewTabCtl message handlers

void CViewTabCtl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
{
        // TODO: Add your control notification handler code here
        int nSel = GetCurSel();
        
        HandleTabs(nSel);
        
        *pResult = 0;
}

BOOL CViewTabCtl::HandleTabs(int sel)
{
        return m_pView->HandleTabs(sel);
}

void CViewTabCtl::RecalcLayout(CRect & rect, CWnd * wnd)
{
        SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);

        int ind = GetCurSel();
        AdjustRect(FALSE, &rect);
        wnd->SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
}

void CViewTabCtl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
        int nSel = lpDrawItemStruct->itemID;
        ASSERT(nSel > -1);
        ASSERT(nSel <  GetItemCount()); 

        TC_ITEM item;
        char text[255];

        item.pszText = text;
        item.mask = TCIF_TEXT;
        GetItem(nSel, &item);

        if(!m_dc.Attach(lpDrawItemStruct->hDC))
                return;

        CRect rect = CRect(&(lpDrawItemStruct->rcItem));

        rect.NormalizeRect();
        rect.DeflateRect(CX_BORDER, CY_BORDER);

        CBrush brush(colorRef[nSel - (nSel / MAX_COLORS) * MAX_COLORS]);
        
        m_dc.FillRect(rect, &brush);

        
        COLORREF tcolor;
        if (nSel == GetCurSel())
        {
                m_selFont.DeleteObject();
                m_selFont.CreatePointFont(100, LPCTSTR(m_sGrayFont), &m_dc);
                m_dc.SelectObject(m_selFont);
                tcolor = RGB(0,0,0);
                
        }
        else
        {
                m_selFont.DeleteObject();
                m_selFont.CreatePointFont(80, LPCTSTR(m_sSelFont), &m_dc);
                m_dc.SelectObject(m_selFont);
                tcolor = GetSysColor(COLOR_3DSHADOW);
        }
        m_dc.SetBkMode(TRANSPARENT);
        m_dc.SetTextColor(tcolor);
        m_dc.DrawText(text, rect, DT_VCENTER|DT_CENTER);
        m_dc.Detach();
        return;
}

void CViewTabCtl::SetView(CTabCtrlView * pView)
{
        m_pView = pView;
        return;
}

#14


hehe
这回贴上了

#15


谢谢各位哥们了。
我的 Email: hzchan@263.net

#1


在创建sheet之前修改CPropertyPage::m_psp和CPropertySheet::m_psh

PSP_USEHICON 
Uses hIcon as the small icon on the tab for the page. 
PSP_USEICONID 
Uses pszIcon as the name of the icon resource to load and use as the small icon on the tab for the page. 

只有向导风格的Sheet可以添加背景图片

PSH_HEADER 
Version 5.80. Indicates that a header bitmap will be used with a Wizard97 wizard. You must also set the PSH_WIZARD97 flag. The header bitmap is obtained from the pszbmHeader member, unless the PSH_USEHBMHEADER flag is also set. In that case, the header bitmap is obtained from the hbmHeader member. 

PSH_USEHBMHEADER 
Version 5.80. Obtains the header bitmap from the hbmHeader member instead of the pszbmHeader member. You must also set PSH_WIZARD97 and PSH_HEADER. 
PSH_USEHBMWATERMARK 
Version 5.80. Obtains the watermark bitmap from the hbmWatermark member instead of the pszbmWatermark member. You must also set PSH_WIZARD97 and PSH_WATERMARK. PSH_USEHPLWATERMARK 
Version 5.80. Uses the HPALETTE structure pointed to by the hplWatermark member instead of the default palette to draw the watermark bitmap and/or header bitmap for a Wizard97 wizard. You must also set PSH_WIZARD97, and PSH_WATERMARK or PSH_HEADER. 
PSH_WATERMARK 
Version 5.80. Specifies that a watermark bitmap will be used with a Wizard97 wizard. You must also set the PSH_WIZARD97 flag. The watermark bitmap is obtained from the pszbmWatermark member, unless PSH_USEHBMWATERMARK is set. In that case, the header bitmap is obtained from the hbmWatermark member

#2


不知道能不能用 刷子!!

#3


看来是不好实现这个东西了。
那么,怎么改变 tabcontrol 上面的选项卡的颜色呢。
比如我现在窗体的 主体颜色 都是 RGB(233,233,233),但是,就上面几个选项卡和 选项卡 空白处的 rgb(192.192.192),这个值是系统 default 的,我更改了 默认的 192,但是也不起作用。
各位大虾,帮帮小弟吧。这个问题特别急啊。。。。。。。。
要不我单独给那个大虾分数,只要能解决这个问题,我在 给 300 分了。。

#4


子类化可以的

#5


麻烦大虾说具体点点嘛。
我是才搞VC 的。

#6


自己画吧
CTabCtrl::DrawItem
void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

Parameters

lpDrawItemStruct

A pointer to aDRAWITEMSTRUCT structure describing the item to be painted.

Remarks

Called by the framework when a visual aspect of an owner-draw tab control changes. The itemAction member of the DRAWITEMSTRUCT structure defines the drawing action that is to be performed. 

By default, this member function does nothing. Override this member function to implement drawing for an owner-draw CTabCtrl object.

The application should restore all graphics device interface (GDI) objects selected for the display context supplied in lpDrawItemStruct before this member function terminates.

#7


各位大虾帮帮忙啊。。。。。。。
给点思路也好。。。要不我再加分数。

#8


救救我吧。。。。。。。。。。
我一直在这里等着啊。。。。。。。。。。。。。。。。。。。

#9


不知SetTextColor()和SetBkColor行不行,我现在没时间试

#10


********以下代码摘自VC编程高手,,,应该有用的*********


本程序根据collect创建了一个CTabCtrlView类,用于实现标签视的功能。关于该类的源码,列在本章的最后,下面介绍如何使用该程序。首先,从CTabCtrlView派生一个类CMyTabView,并重载其InitTabs函数:

#11


咋搞得,代码贴不上,留个mail把,发给你看看

#12


TC_ITEM tc_item;
CTabCtrl* tab = GetTabControl();
CBitmap bmp;
CImageList*pilTab=new CImageList();
VERIFY(pilTab->Create(16, 15, ILC_COLOR, 3, 0));
bmp.LoadBitmap(IDB_BITMAP1);
pilTab->Add(&bmp, RGB(127, 127, 127));
bmp.DeleteObject();
bmp.LoadBitmap(IDB_BITMAP2);
pilTab->Add(&bmp, RGB(127, 127, 127));
bmp.DeleteObject();
bmp.LoadBitmap(IDB_BITMAP3);
pilTab->Add(&bmp, RGB(127, 127, 127));
bmp.DeleteObject();
tab->SetCurSel(2);
tab->SetImageList(pilTab);
tc_item.mask=TCIF_TEXT | TCIF_IMAGE;
tc_item.pszText="Icon";
tc_item.iImage=0;
tab->InsertItem(0, &tc_item);
tc_item.pszText="Small Icon";
tc_item.iImage=1;
tab->InsertItem(1, &tc_item);
tc_item.pszText="List";
tc_item.iImage=2;
tab->InsertItem(2, &tc_item);
上述代码能实现插入背景图片,但还需处理TabSelChange.其实比较简单的方法是将属性页改为标签控件。我有较完整的例子,留下你的邮箱

#13


void CMyTabView::InitTabs(CTabCtrlView* pView)
{
        TC_ITEM TabCtrlItem;

        TabCtrlItem.mask = TCIF_TEXT | TCIF_IMAGE;
        TabCtrlItem.pszText = "CStringList";
        TabCtrlItem.iImage = 1;
        m_TabCtl.InsertItem( 0, &TabCtrlItem );
        TabCtrlItem.pszText = "CTypedPtrList";
        m_TabCtl.InsertItem( 1, &TabCtrlItem );
        TabCtrlItem.pszText = "CList";
        m_TabCtl.InsertItem( 2, &TabCtrlItem );
        TabCtrlItem.pszText = "CDWordArray";
        m_TabCtl.InsertItem( 3, &TabCtrlItem );
        TabCtrlItem.pszText = "CTypedPtrArray";
        m_TabCtl.InsertItem( 4, &TabCtrlItem );
        TabCtrlItem.pszText = "CArray";
        m_TabCtl.InsertItem( 5, &TabCtrlItem );
        TabCtrlItem.pszText = "CMapStringToString";
        m_TabCtl.InsertItem( 6, &TabCtrlItem );
        TabCtrlItem.pszText = "CTypedPtrMap";
        m_TabCtl.InsertItem( 7, &TabCtrlItem );
        TabCtrlItem.pszText = "CMap";
        m_TabCtl.InsertItem( 8, &TabCtrlItem );
        //Important You must always call the base class        
        CTabCtrlView::InitTabs(pView);
        return;
}
下一步是重载其函数:

BOOL CMyTabView::HandleTabs(int sel)
{
        //The MFC doc/view model expects the
        //mainFrame to handle changing view
        //so we let the mainframe do it.

        CWnd* Wnd = AfxGetMainWnd();

        switch(sel)
        {
        case 0:
                Wnd->SendMessage(WM_COMMAND, ID_STRINGLIST, 0);
                break;
        case 1:
                Wnd->SendMessage(WM_COMMAND, ID_TYPEDLIST, 0);
                break;
        case 2:
                Wnd->SendMessage(WM_COMMAND, ID_INTLIST, 0);
                break;
        case 3:
                Wnd->SendMessage(WM_COMMAND, ID_DWORDARRAY, 0);
                break;
        case 4:
                Wnd->SendMessage(WM_COMMAND, ID_TYPEDPTRARRAY, 0);
                break;
        case 5:
                Wnd->SendMessage(WM_COMMAND, ID_POINTARRAY, 0);
                break;
        case 6:
                Wnd->SendMessage(WM_COMMAND, ID_MAPSTRINGTOSTRING, 0);
                break;
        case 7:
                Wnd->SendMessage(WM_COMMAND, ID_TYPEDPTRMAP, 0);
                break;
        case 8:
                Wnd->SendMessage(WM_COMMAND, ID_MAPDWORDTOMYSTRUCT, 0);
                break;
        default:
                ASSERT(0);
                return FALSE;
        }
        return TRUE;
}
同时,需要对主框架类进行修改。首先,声明一个protected的派生类CMyTabView对象m_tabView,并重载OnCreateClient函数: 

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
        if(!m_tabView.CreateStatic(this))
        {
                TRACE0("Failed to CreatePropertySheet\n");
                return FALSE;
        }       
        CRuntimeClass* pNewViewClass = RUNTIME_CLASS(CStringListView);
        m_tabView.SetTab(0);

        CSize size(160, 180);

        if (!m_tabView.CreateView(pNewViewClass, size, pContext))
        {
                TRACE0("Failed to create first pane\n");
                return FALSE;
        }
        
        SetActiveView(m_tabView.GetActiveView());
        return TRUE;
}
最后一步就是修改OnExample函数:

void CMainFrame::OnExample(UINT nCmdID)
{
        if (nCmdID == m_nCurrentExample)
                return;  // already selected

        // Set the child window ID of the active view to AFX_IDW_PANE_FIRST.
        // This is necessary so that CFrameWnd::RecalcLayout will allocate
        // this "first pane" to that portion of the frame window's client
        // area not allocated to control bars.  Set the child ID of
        // the previously active view to some other ID; we will use the
        // command ID as the child ID.
        CView* pOldActiveView = GetActiveView();
                ::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);

        CRuntimeClass* pNewViewClass;
        switch (nCmdID)
        {
                case ID_STRINGLIST:
                        pNewViewClass = RUNTIME_CLASS(CStringListView);
                        break;
                case ID_TYPEDLIST:
                        pNewViewClass = RUNTIME_CLASS(CTypedPtrListView);
                        break;
                case ID_INTLIST:
                        pNewViewClass = RUNTIME_CLASS(CIntListView);
                        break;
                case ID_DWORDARRAY:
                        pNewViewClass = RUNTIME_CLASS(CDWordArrayView);
                        break;
                case ID_TYPEDPTRARRAY:
                        pNewViewClass = RUNTIME_CLASS(CTypedPtrArrayView);
                        break;
                case ID_POINTARRAY:
                        pNewViewClass = RUNTIME_CLASS(CPointArrayView);
                        break;
                case ID_MAPSTRINGTOSTRING:
                        pNewViewClass = RUNTIME_CLASS(CMapStringToStringView);
                        break;
                case ID_TYPEDPTRMAP:
                        pNewViewClass = RUNTIME_CLASS(CTypedPtrMapView);
                        break;
                case ID_MAPDWORDTOMYSTRUCT:
                        pNewViewClass = RUNTIME_CLASS(CMapDWordToMyStructView);
                        break;
                default:
                        ASSERT(0);
                        return;
        }

        // create the new view
        CCreateContext context;
        context.m_pNewViewClass = pNewViewClass;
        context.m_pCurrentDoc = GetActiveDocument();

        // New Code below
        CView* pNewView = m_tabView.CreateView(pNewViewClass, CSize(100,100), &context);

        if (pNewView != NULL)
        {
                // the new view is there, but invisible and not active...
                pNewView->ShowWindow(SW_SHOW);
                pNewView->OnInitialUpdate();
                SetActiveView(pNewView);
                m_tabView.RecalcLayout();       //<-- New Code
                RecalcLayout();
                m_nCurrentExample = nCmdID;

                // finally destroy the old view...
                pOldActiveView->DestroyWindow();
        }
}
下面是CTabCtrlView的源代码:
  


#if !defined(AFX_CTabCtrlView_H__8E652EC1_5159_11D1_96A0_0E6B8A000000__INCLUDED_)
#define AFX_CTabCtrlView_H__8E652EC1_5159_11D1_96A0_0E6B8A000000__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// CTabCtrlView.h : header file
//

#include "afxcmn.h"

class CTabCtrlView;

class CViewTabCtl : public CTabCtrl
{
// Construction
public:
        CViewTabCtl();

// Attributes
public:

// Operations
public:
        
// Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CViewTabCtl)
        //}}AFX_VIRTUAL

// Implementation
public:
        void SetView(CTabCtrlView* pView);
        virtual void RecalcLayout(CRect& rect, CWnd* wnd);
        virtual ~CViewTabCtl();
        virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

        // Generated message map functions
protected:
        CTabCtrlView* m_pView;
        CString m_sGrayFont;
        CString m_sSelFont;
        CDC m_dc;
        CFont m_selFont;
        virtual BOOL HandleTabs(int sel);
        //{{AFX_MSG(CViewTabCtl)
        afx_msg void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult);
        //}}AFX_MSG

        DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CCTabCtrlView window

// The actual tab control
// Wrapper Window Handles Interfacing to MFC doc View Model
// and resizing of the Tab Ctrl
class CTabCtrlView : public CWnd
{
// Construction
public:
        CTabCtrlView();

// Attributes
public:

// Operations
public:

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

// Implementation
public:
        virtual BOOL HandleTabs(int sel);
        void SetTab(int Tab);
        virtual void SetView();
        void RecalcLayout();
        CView* GetActiveView();
        BOOL CreateStatic(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST);
        virtual CView* CreateView(CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
        virtual ~CTabCtrlView();

        // Generated message map functions
protected:
        virtual void InitTabs(CTabCtrlView* pView);
        CViewTabCtl m_TabCtl;
        CView* m_ActiveView;
        
        BOOL CreateCommon(CWnd* pParentWnd, SIZE si*, DWORD dwStyle, UINT nID);
        //{{AFX_MSG(CCTabCtrlView)
        afx_msg void OnSize(UINT nType, int cx, int cy);
        afx_msg BOOL OnEraseBkgnd(CDC* pDC);
        afx_msg void OnPaint();
        //}}AFX_MSG

        DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// CViewTabCtl window


//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CTabCtrlView_H__8E652EC1_5159_11D1_96A0_0E6B8A000000__INCLUDED_)


/////////////////////////////////////////////////////////////////////////////
C++ Code file
/////////////////////////////////////////////////////////////////////////////

// CTabCtrlView.cpp : implementation file
//

// core headers
#include "afx.h"
#include "afxplex_.h"
#include "afxcoll.h"
#include "afxcmn.h"

#include "stdafx.h"

#include "TabCtrlView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define CX_BORDER 1
#define CY_BORDER 1

#define MAX_COLORS 10

// The following colors give a Tab Ctrl an OS/2 look
COLORREF colorRef[MAX_COLORS] =
{
        RGB(0,225,255),
        RGB(0,240,190),
        RGB(128,128,255),
        RGB(240,200,175),
        RGB(240,240,150),
        RGB(175,130,175),
        RGB(240,140,0),
        RGB(255,200,0),
        RGB(255,160,120),
        RGB(255,200, 175)
};


/////////////////////////////////////////////////////////////////////////////
// CTabCtrlView

CTabCtrlView::CTabCtrlView()
{
}

CTabCtrlView::~CTabCtrlView()
{
}


BEGIN_MESSAGE_MAP(CTabCtrlView, CWnd)
        //{{AFX_MSG_MAP(CTabCtrlView)
        ON_WM_SIZE()
        ON_WM_ERASEBKGND()
        ON_WM_PAINT()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTabCtrlView message handlers

BOOL CTabCtrlView::CreateStatic(CWnd * pParentWnd, DWORD dwStyle, UINT nID)
{
        ASSERT(pParentWnd != NULL);
        ASSERT(dwStyle & WS_CHILD);
        ASSERT(!(dwStyle & SPLS_DYNAMIC_SPLIT));

        // create with zero minimum pane size
        if (!CreateCommon(pParentWnd, CSize(0, 0), dwStyle, nID))
                return FALSE;

        // all panes must be created with explicit calls to CreateView
        return TRUE;
}





BOOL CTabCtrlView::CreateCommon(CWnd * pParentWnd, SIZE si*, DWORD dwStyle, UINT nID)
{
        ASSERT(pParentWnd != NULL);
        ASSERT(si*.cx >= 0 && si*.cy >= 0);
        ASSERT(dwStyle & WS_CHILD);
        ASSERT(nID != 0);

        // create with the same wnd-class as MDI-Frame (no erase bkgnd)
        if (!CreateEx(0, NULL, NULL, dwStyle, 0, 0, 0, 0,
          pParentWnd->m_hWnd, (HMENU)nID, NULL))
                return FALSE;       // create invisible

        //Create the Tab Control
        CRect rect;
        GetClientRect(rect);
        CImageList pImageList;


        m_TabCtl.Create(WS_VISIBLE | WS_CHILD | TCS_OWNERDRAWFIXED, rect, this, nID);

        //Overide this function to provide your Tabs
        InitTabs(this);
        return TRUE;
}

CView* CTabCtrlView::CreateView(CRuntimeClass * pViewClass, SIZE sizeInit, CCreateContext * pContext)
{
#ifdef _DEBUG
        ASSERT_VALID(this);
        ASSERT(pViewClass != NULL);
        ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
        ASSERT(AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), FALSE));
#endif

        BOOL bSendInitialUpdate = FALSE;

        CCreateContext contextT;
        if (pContext == NULL)
        {
                // if no context specified, generate one from the currently selected
                //  client if possible
                CView* pOldView = NULL;
                if (pOldView != NULL && pOldView->IsKindOf(RUNTIME_CLASS(CView)))
                {
                        // set info about last pane
                        ASSERT(contextT.m_pCurrentFrame == NULL);
                        contextT.m_pLastView = pOldView;
                        contextT.m_pCurrentDoc = pOldView->GetDocument();
                        if (contextT.m_pCurrentDoc != NULL)
                                contextT.m_pNewDocTemplate =
                                  contextT.m_pCurrentDoc->GetDocTemplate();
                }
                pContext = &contextT;
                bSendInitialUpdate = TRUE;
        }

        CWnd* pWnd;
        TRY
        {
                pWnd = (CWnd*)pViewClass->CreateObject();
                if (pWnd == NULL)
                        AfxThrowMemoryException();
        }
        CATCH_ALL(e)
        {
                TRACE0("Out of memory creating a splitter pane.\n");
                // Note: DELETE_EXCEPTION(e) not required
                return (CView*) NULL;
        }
        END_CATCH_ALL

        ASSERT_KINDOF(CWnd, pWnd);
        ASSERT(pWnd->m_hWnd == NULL);       // not yet created

        DWORD dwStyle = AFX_WS_DEFAULT_VIEW;

        // Create with the right size (wrong position)
        CRect rect(CPoint(0,0), sizeInit);
        if (!pWnd->Create(NULL, NULL, dwStyle,
                rect, this, 0, pContext))
        {
                TRACE0("Warning: couldn't create client pane for splitter.\n");
                        // pWnd will be cleaned up by PostNcDestroy
                return (CView*) NULL;
        }

        // send initial notification message
        if (bSendInitialUpdate);
//              pWnd->SendMessage(WM_INITIALUPDATE);
        m_ActiveView = (CView*) pWnd;
        return m_ActiveView;
}

void CTabCtrlView::OnSize(UINT nType, int cx, int cy) 
{
        if (nType != SIZE_MINIMIZED && cx > 0 && cy > 0)
                RecalcLayout();

        CWnd::OnSize(nType, cx, cy);
        return;
}

void CTabCtrlView::RecalcLayout()
{
        CWnd* pWnd = (CWnd*) GetActiveView();
        CRect rect;
        GetClientRect(&rect);
        m_TabCtl.RecalcLayout(rect, pWnd);
}

CView* CTabCtrlView::GetActiveView()
{
        return m_ActiveView;
}

BOOL CTabCtrlView::OnEraseBkgnd(CDC* pDC) 
{
        return FALSE;
}

void CTabCtrlView::OnPaint() 
{
        CPaintDC dc(this); // device context for painting
}

void CTabCtrlView::SetView()
{
        //In most cases your main app window
        //should handle this. This is becuase
        //the doc view model expects the view
        //to be attached to your main frame
}

void CTabCtrlView::SetTab(int Tab)
{
        m_TabCtl.SetCurSel(Tab);
}

void CTabCtrlView::InitTabs(CTabCtrlView* pView)
{
        m_TabCtl.SetView(pView);
        return;
}

BOOL CTabCtrlView::HandleTabs(int sel)
{
        ASSERT(FALSE);
        return FALSE;
}






/////////////////////////////////////////////////////////////////////////////
// CViewTabCtl

CViewTabCtl::CViewTabCtl()
{
        m_sSelFont = _T("Helv");
        m_sGrayFont= _T("Helv");
}

CViewTabCtl::~CViewTabCtl()
{
}


BEGIN_MESSAGE_MAP(CViewTabCtl, CTabCtrl)
        //{{AFX_MSG_MAP(CViewTabCtl)
        ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CViewTabCtl message handlers

void CViewTabCtl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
{
        // TODO: Add your control notification handler code here
        int nSel = GetCurSel();
        
        HandleTabs(nSel);
        
        *pResult = 0;
}

BOOL CViewTabCtl::HandleTabs(int sel)
{
        return m_pView->HandleTabs(sel);
}

void CViewTabCtl::RecalcLayout(CRect & rect, CWnd * wnd)
{
        SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);

        int ind = GetCurSel();
        AdjustRect(FALSE, &rect);
        wnd->SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
}

void CViewTabCtl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
        int nSel = lpDrawItemStruct->itemID;
        ASSERT(nSel > -1);
        ASSERT(nSel <  GetItemCount()); 

        TC_ITEM item;
        char text[255];

        item.pszText = text;
        item.mask = TCIF_TEXT;
        GetItem(nSel, &item);

        if(!m_dc.Attach(lpDrawItemStruct->hDC))
                return;

        CRect rect = CRect(&(lpDrawItemStruct->rcItem));

        rect.NormalizeRect();
        rect.DeflateRect(CX_BORDER, CY_BORDER);

        CBrush brush(colorRef[nSel - (nSel / MAX_COLORS) * MAX_COLORS]);
        
        m_dc.FillRect(rect, &brush);

        
        COLORREF tcolor;
        if (nSel == GetCurSel())
        {
                m_selFont.DeleteObject();
                m_selFont.CreatePointFont(100, LPCTSTR(m_sGrayFont), &m_dc);
                m_dc.SelectObject(m_selFont);
                tcolor = RGB(0,0,0);
                
        }
        else
        {
                m_selFont.DeleteObject();
                m_selFont.CreatePointFont(80, LPCTSTR(m_sSelFont), &m_dc);
                m_dc.SelectObject(m_selFont);
                tcolor = GetSysColor(COLOR_3DSHADOW);
        }
        m_dc.SetBkMode(TRANSPARENT);
        m_dc.SetTextColor(tcolor);
        m_dc.DrawText(text, rect, DT_VCENTER|DT_CENTER);
        m_dc.Detach();
        return;
}

void CViewTabCtl::SetView(CTabCtrlView * pView)
{
        m_pView = pView;
        return;
}

#14


hehe
这回贴上了

#15


谢谢各位哥们了。
我的 Email: hzchan@263.net