亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? splittertabwnd.cpp

?? VC++中Tab View的多種實(shí)現(xiàn)方法
?? CPP
字號(hào):
#include "stdafx.h"
#include "tab.h"

#include "TabView.h"

#include "splitterTabWnd.h"

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


IMPLEMENT_DYNCREATE(CSplitterTabWnd, CSplitterWnd)


CSplitterTabWnd::CSplitterTabWnd() :
   m_pwndTab(NULL), m_uSelectedViewIndex(0)
{
   m_cxSplitter    = m_cySplitter    = 0;   // size of splitter bar
   m_cxSplitterGap = m_cySplitterGap = 0;   // amount of space between panes
   m_cxBorder      = m_cyBorder      = 0;   // borders in client area
}

CSplitterTabWnd::~CSplitterTabWnd()
{
   if( m_pwndTab ) delete m_pwndTab;
}

void CSplitterTabWnd::RecalcLayout()
{
   CWnd* pWnd;
   CRect rectClient;

   HDWP hdwp;

   GetClientRect( rectClient );

   // Set position for the tab window
   pWnd = GetPane( 1, 0 );

   hdwp = ::BeginDeferWindowPos( 2 );

   DeferWindowPos( hdwp,
                   pWnd->m_hWnd,
                   NULL,
                   rectClient.left,
                   rectClient.bottom - m_pwndTab->GetHeight(),
                   rectClient.right,
                   m_pwndTab->GetHeight(),
                   SWP_NOACTIVATE|SWP_NOZORDER );

   // Set position for the working-window
   pWnd = GetPane( 0, 0 );
   DeferWindowPos( hdwp,
                   pWnd->m_hWnd,
                   NULL,
                   rectClient.left,
                   rectClient.top,
                   rectClient.right,
                   rectClient.bottom - m_pwndTab->GetHeight(), 
                   SWP_NOACTIVATE|SWP_NOZORDER );

   EndDeferWindowPos( hdwp );

}


BOOL CSplitterTabWnd::Create( CWnd* pwndParent, CCreateContext* pContext )
{
   ASSERT( m_ptrarrayRCView.GetSize() );         // must be one or more
   ASSERT( pwndParent->IsKindOf( RUNTIME_CLASS( CFrameWnd ) ) );

   CRuntimeClass* pRCView;                       // runtime class for first working view

   CSize  size(0,0);                                   // 
   CRect rect;                                   //

   pRCView = (CRuntimeClass*)m_ptrarrayRCView[0];
   ASSERT( pRCView->IsDerivedFrom( RUNTIME_CLASS( CWnd ) ) );

   CreateStatic( pwndParent, 2, 1 );   // create two panes
   
   VERIFY( CreateView( 0, 0, pRCView, size, pContext ) );

   VERIFY( CreateView( 1, 0, RUNTIME_CLASS(CWndTab), size, pContext ) );

   m_pwndTab = (CWndTab*)GetPane( 1, 0 );
   m_pwndTab->SetSplitterTabWnd( this );
   
   ShowWindow( SW_SHOWNORMAL );
   UpdateWindow();

   return TRUE;

}


UINT CSplitterTabWnd::AddView( CRuntimeClass* pRCView, LPCTSTR pszViewName )
{
   ASSERT( pRCView->IsDerivedFrom( RUNTIME_CLASS( CWnd ) ) );
   m_ptrarrayRCView.Add( pRCView );
   m_sarrayViewName.Add( pszViewName );

   if( m_pwndTab ) m_pwndTab->SetModified();

   return m_ptrarrayRCView.GetSize();
}


void CSplitterTabWnd::SelectView( UINT uIndex )
{
   ASSERT( uIndex < (UINT)m_ptrarrayRCView.GetSize() );

   ReplaceView( (CRuntimeClass*)m_ptrarrayRCView[uIndex] );
   m_uSelectedViewIndex = uIndex;

   if( m_pwndTab ) m_pwndTab->Invalidate();
}


BOOL CSplitterTabWnd::ReplaceView(CRuntimeClass* pRCView)
{
   CCreateContext context; // For connecting to document and creating view
   CView* pviewCurrent;    // Current active view
   CView* pviewNew;        // View that are going to be created

   BOOL  bSaveAutoDelete;  // For storing auto delete flag
   SIZE  size;             // Size for new view
   CRect rect;             // Client rect
                                                                        
   VERIFY( pviewCurrent = (CView*)GetPane( 0, 0 ) );       // Get Window
   
   if( pviewCurrent->IsKindOf( pRCView ) ) 
	   return TRUE;    // same as before

   pviewCurrent->GetClientRect( &rect );                   // get rect
   size.cx = rect.right;                                   // width
   size.cy = rect.bottom;                                  // height

   CDocument* pDoc = pviewCurrent->GetDocument();          // get document

   if( pDoc )                                              // if document
   {
      bSaveAutoDelete = pDoc->m_bAutoDelete;               // save auto delete flag
      pDoc->m_bAutoDelete = FALSE;                         // don't delete document
   }

   pviewCurrent->DestroyWindow();                          // destroy view

   // ***
   // Set connections for the new view
   // ***
   context.m_pNewViewClass   = pRCView;                                  
   context.m_pCurrentDoc     = pDoc;
   context.m_pNewDocTemplate = pDoc->GetDocTemplate();
   context.m_pLastView       = NULL;
   context.m_pCurrentFrame   = GetParentFrame();

   if( ! CreateView( 0, 0, pRCView, size, &context) )      // create view in working pane
   {
       TRACE0("Warning: View was not created !!!\n");
       return FALSE;
   }
   
   pviewNew = (CView*)GetPane( 0, 0 );      // get view in working pane

   //--------------------------------------------------------------
   pviewNew->OnInitialUpdate();

   if( pDoc )
   {
       pDoc->m_bAutoDelete = bSaveAutoDelete;               // restore auto delete flag
   }
   //--------------------------------------------------------------

   RecalcLayout();                                         // reposition
   pviewNew->UpdateWindow();                               // update
   GetParentFrame()->SetActiveView(pviewNew);              // activate

   return TRUE;
}

BEGIN_MESSAGE_MAP(CSplitterTabWnd, CSplitterWnd)
	//{{AFX_MSG_MAP(CSplitterTabWnd)
	ON_WM_LBUTTONDOWN()
	ON_WM_SETCURSOR()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CSplitterTabWnd::OnLButtonDown(UINT nFlags, CPoint point)
{     
    // prevent the user from dragging the splitter bar
	return;
}

BOOL CSplitterTabWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{   
    // Don't allow the cursor to change over splitbar
	return FALSE;
	
}

void CSplitterTabWnd::OnMouseMove(UINT nFlags, CPoint point)
{       
    // Don't allow the cursor to change over splitbar
    CWnd::OnMouseMove(nFlags, point);
}

//**************** Class CWndTab ********************** 

IMPLEMENT_DYNCREATE( CWndTab, CWnd );

CString CWndTab::m_stringWindowClass;


CWndTab::CWndTab() :
   m_dwFlag(0), m_uHeight(15), m_bTabModified(TRUE), m_pFont(NULL), m_iOffsetToLeft(20),
   m_uOffsetFontGap(3)
{
}

CWndTab::~CWndTab()
{
   if( m_dwFlag & PG_WNDTAB_FONT ) delete m_pFont;
}

/*-------------------------------------------------------------------------------------------------
Name:	   SetHeight()
Type:    Function
Purpose: Set height for tabs

Param:   uHeight = tab height
*/
void CWndTab::SetHeight( UINT uHeight )
{ 
   m_uHeight      = uHeight;
   Invalidate();
}


/************************************************
Name:	   PreCreateWindow()
Type:    Virtual function
Purpose: Register a new window class
*/
BOOL CWndTab::PreCreateWindow(CREATESTRUCT& cs) 
{
   if( CWndTab::m_stringWindowClass.IsEmpty() )
   {
      CWndTab::m_stringWindowClass =
         ::AfxRegisterWndClass( CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW,
                                AfxGetApp()->LoadStandardCursor(IDC_ARROW),
                                (HBRUSH)(COLOR_BTNFACE+1),
                                NULL );
   }

   cs.lpszClass = CWndTab::m_stringWindowClass;
	
	return CWnd::PreCreateWindow(cs);
}

/************************************************
Name:	   CreateFont()
Type:    Function
Purpose: Create font for text on tabs
*/
void CWndTab::CreateFont()
{
   LOGFONT logfont;

   memset( &logfont, 0, sizeof( LOGFONT ) );
   
   logfont.lfHeight = m_uHeight - 2;
   strcpy(logfont.lfFaceName,"MS Sans Serif"); 
	m_pFont = new CFont();
	m_pFont->CreateFontIndirect(&logfont); 

   m_dwFlag |= PG_WNDTAB_FONT;
}

/*-------------------------------------------------------------------------------------------------
Name:	   DrawTab()
Type:    Function
Purpose: Draw all the tabs

Param:   pDC  = DC that the tabs should be drawn on.
*/
void CWndTab::DrawTab( CDC* pDC )
{
   UINT  uTabIndex;          // tab that are drawn
   POINT ppoint[4];          // points that will be used to draw tab                                                                   
                             
   UINT  uTabHeight;         // the tab height 
   UINT  uDistanceToNextTab; // distance between tabs
   int   iOffsetToLeft;      // distance from left side of client edge                                                                 
                             
   CRect    rect;
   CPen     penBlack( PS_SOLID, 1, RGB(0,0,0) );
   CPen*    ppenOld;

   if( m_bTabModified ) UpdateTabWidth( pDC );             // update tab ?

   ppenOld = pDC->SelectObject( &penBlack );               // select a black pen

   pDC->SetBkMode( TRANSPARENT );                          // just text

   GetClientRect( &rect );                                 // get client rect
   pDC->MoveTo( rect.left, rect.top );                     // move to upper left
   pDC->LineTo( rect.right, rect.left );                   // draw a line from left to right

   uTabHeight         = m_uHeight - 1;
   uDistanceToNextTab = uTabHeight / 2;
   iOffsetToLeft      = m_iOffsetToLeft;

   for( uTabIndex = 0; uTabIndex < (UINT)m_dwarrayTabWidth.GetSize(); uTabIndex++ )
   {
      // ***
      // set all points for tab, then we will be able to draw it
      // ***
      ppoint[0].x = iOffsetToLeft;                         // ""
      ppoint[0].y = 0;

      iOffsetToLeft += uDistanceToNextTab;                 // "\" 
      ppoint[1].x   =  iOffsetToLeft;
      ppoint[1].y   =  uTabHeight;

      //draw tab-text 
      pDC->TextOut( ppoint[1].x + m_uOffsetFontGap,         
                    1,
                    m_psplitterTabWnd->m_sarrayViewName[uTabIndex] );

      iOffsetToLeft += m_dwarrayTabWidth[uTabIndex];       // "\____"
      ppoint[2].x   =  iOffsetToLeft;
      ppoint[2].y   =  uTabHeight;

      if( uTabIndex == (UINT)(m_dwarrayTabWidth.GetSize() - 1) ) // "\____/"
      {
         iOffsetToLeft += uDistanceToNextTab;
         ppoint[3].x   =  iOffsetToLeft;
         ppoint[3].y   =  0;
      }
      else
      {
         iOffsetToLeft += (uDistanceToNextTab / 2);
         ppoint[3].x   =  iOffsetToLeft;
         ppoint[3].y   =  (uTabHeight / 2);

         iOffsetToLeft -= (uDistanceToNextTab / 2);
      }

      pDC->Polyline( ppoint, 4 );
   }

   pDC->SelectObject( ppenOld );
}

/*-------------------------------------------------------------------------------------------------
Name:	   DrawSelectedTab
Type:    Function
Purpose: Draw the tab for selected view

Param:   pDC           = DC that the tabs should be drawn on.
*/
void CWndTab::DrawSelectedTab( CDC* pDC )
{
   CRgn   rgn;               // filling region
   CBrush brush;             // brush that the selected tab will be filled with

   UINT  uTabHeight;         // the tab height
   UINT  uDistanceToNextTab; // distance between tabs
   int   iOffsetToLeft;      // distance from left side of client edge

   POINT  ppoint[4];         // points that will be used to draw tab

   uTabHeight         = m_uHeight - 1;                     // set tab height
   uDistanceToNextTab = uTabHeight / 2;                    // distance to next tab
   iOffsetToLeft      = m_iOffsetToLeft;                   // distance to left side

   // *** loop to selected tab ***
   for( UINT uCounter = 0; uCounter < m_psplitterTabWnd->m_uSelectedViewIndex; uCounter++ )
   {
      iOffsetToLeft += m_dwarrayTabWidth[uCounter];
      iOffsetToLeft += uDistanceToNextTab;
   }

   // ***
   // set all points for selected tab, then we will be able to draw it
   // ***
   ppoint[0].x = iOffsetToLeft;                            // ""
   ppoint[0].y = 0;

   iOffsetToLeft += uDistanceToNextTab;                    // "\"
   ppoint[1].x   =  iOffsetToLeft;
   ppoint[1].y   =  uTabHeight;

   iOffsetToLeft += m_dwarrayTabWidth[uCounter];           // "\____"
   ppoint[2].x   =  iOffsetToLeft;
   ppoint[2].y   =  uTabHeight;

   iOffsetToLeft += uDistanceToNextTab;                    // "\____/"
   ppoint[3].x   =  iOffsetToLeft;
   ppoint[3].y   =  0;

   brush.CreateSolidBrush( ::GetSysColor( COLOR_WINDOW ) );
   rgn.CreatePolygonRgn( ppoint, 4, ALTERNATE );

   pDC->FillRgn( &rgn, &brush );
   pDC->Polyline( ppoint, 4 );
   pDC->TextOut( ppoint[1].x + m_uOffsetFontGap, 1, m_psplitterTabWnd->m_sarrayViewName[uCounter] );
}

/*-------------------------------------------------------------------------------------------------
Name:	   UpdateTabWidth()
Type:    Function
Purpose: Update widenes for all tabs

Param:   pDC = DC that the tabs should be drawn on.
*/
void CWndTab::UpdateTabWidth( CDC* pDC )
{
   CSize size;

   m_dwarrayTabWidth.RemoveAll();

   for( int iCounter = 0; iCounter < m_psplitterTabWnd->m_sarrayViewName.GetSize(); iCounter++ )
   {
      // get text size
      size = pDC->GetTextExtent( m_psplitterTabWnd->m_sarrayViewName[iCounter] );
      // add the width for text plus gap to array
      m_dwarrayTabWidth.Add( size.cx + (m_uOffsetFontGap << 1) );
   }

   m_bTabModified = FALSE;                                 // tabs updated
}


BEGIN_MESSAGE_MAP(CWndTab, CWnd)
	//{{AFX_MSG_MAP(CWndTab)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/************************************************
Name:	   OnPaint()
Type:    Message
Purpose: Draw all the information in the tab window
*/
void CWndTab::OnPaint() 
{
   CFont*   pfontOld;   // pointer to old font

   CPaintDC dc(this);                                      // device context for painting

   if( m_pFont == NULL ) CreateFont();                     // if no tab font, create one

   pfontOld = dc.SelectObject( m_pFont );                  // select tab font

   DrawTab( &dc );                                         // draw the tabs
   DrawSelectedTab( &dc );                                 // draw th selected tab

   dc.SelectObject( pfontOld );                            // select old font
}



/*-------------------------------------------------------------------------------------------------
Name:	 OnLButtonDown()
Type:    Message
Purpose: Check if klicked on a tab, and if so switch view
*/
void CWndTab::OnLButtonDown(UINT nFlags, CPoint point) 
{
   int  iOffsetToLeft;
   UINT uDistanceToNextTab;

   uDistanceToNextTab = (m_uHeight - 1) / 2;
   
   iOffsetToLeft = m_iOffsetToLeft;

   // *** check if clicked on a tab ***
   for( UINT uCounter = 0; uCounter < (UINT)m_dwarrayTabWidth.GetSize(); uCounter++ )
   {
      iOffsetToLeft += uDistanceToNextTab;

      if( ( point.x >= (iOffsetToLeft - 1) ) && 
          ( point.x <= (int)(iOffsetToLeft + m_dwarrayTabWidth[uCounter] + 1) ) )
      {
          //選擇View窗口
          m_psplitterTabWnd->SelectView( uCounter );
          break;
      }

      iOffsetToLeft += m_dwarrayTabWidth[uCounter];
   }

	CWnd::OnLButtonDown(nFlags, point);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品99久久久久久久久 | 国产精品久久久一区麻豆最新章节| 欧美日韩精品综合在线| 日本精品免费观看高清观看| 91农村精品一区二区在线| 91色porny| 在线观看日韩高清av| 色哟哟一区二区| 在线欧美一区二区| 欧美日韩在线观看一区二区 | 亚洲日本va午夜在线影院| 亚洲欧洲日韩一区二区三区| 亚洲欧美一区二区久久| 一区二区三区影院| 午夜精品在线视频一区| 久久精品国产亚洲aⅴ | 精品美女在线播放| 国产亚洲一区二区三区| 国产精品三级在线观看| 亚洲日本va在线观看| 亚洲第一福利一区| 精品亚洲aⅴ乱码一区二区三区| 美女网站在线免费欧美精品| 激情综合色综合久久综合| 国产成人免费视| 91黄色小视频| 日韩一区二区三区高清免费看看| 精品国产免费视频| 国产精品大尺度| 亚洲mv在线观看| 精品一区二区三区免费| 9i看片成人免费高清| 欧美在线观看禁18| 26uuu另类欧美| 亚洲视频精选在线| 青青草国产成人av片免费| 国产成人精品三级| 欧美主播一区二区三区美女| 欧美一级视频精品观看| 日本一区二区动态图| 亚洲一区在线电影| 国产精品综合视频| 色婷婷综合激情| 欧美r级在线观看| 亚洲欧美日韩系列| 麻豆精品精品国产自在97香蕉 | 欧美mv日韩mv国产网站app| 国产视频一区二区三区在线观看| 亚洲精品国产a| 国产在线日韩欧美| 在线一区二区三区| 久久看人人爽人人| 午夜久久久久久久久| 高清不卡在线观看av| 欧美精品三级在线观看| 欧美国产综合色视频| 天天综合日日夜夜精品| 成人爽a毛片一区二区免费| 欧美高清一级片在线| 国产精品久久久久永久免费观看| 日韩av一区二区三区四区| www.久久精品| 久久午夜免费电影| 肉色丝袜一区二区| 97se亚洲国产综合自在线不卡| 日韩三级在线免费观看| 樱花草国产18久久久久| 国产盗摄精品一区二区三区在线 | 中文字幕亚洲在| 激情综合色综合久久综合| 欧美日韩精品久久久| 国产精品第13页| 国产精品12区| 日韩欧美在线影院| 婷婷综合另类小说色区| 91在线porny国产在线看| 欧美激情资源网| 精品一区二区三区在线观看国产 | 日本一二三四高清不卡| 蜜桃久久精品一区二区| 欧美日韩精品欧美日韩精品一综合| ●精品国产综合乱码久久久久| 国产激情一区二区三区| 精品国产一区二区精华| 男女男精品网站| 欧美一区中文字幕| 亚洲1区2区3区视频| 欧美在线看片a免费观看| 亚洲美腿欧美偷拍| 99久久精品免费观看| 中文字幕不卡在线| 国产91在线看| 国产日韩欧美制服另类| 韩国欧美国产一区| 欧美大片顶级少妇| 精品制服美女丁香| 精品少妇一区二区三区 | 91丨porny丨蝌蚪视频| 国产精品免费久久久久| 成人97人人超碰人人99| 国产三级精品视频| 国产福利一区在线| 国产精品天美传媒| 99这里都是精品| 中文字幕一区二区在线播放| 成人黄色小视频| 成人欧美一区二区三区1314| a级精品国产片在线观看| 中文av一区二区| 成人国产精品免费观看| 国产精品成人一区二区三区夜夜夜| 成人免费黄色大片| 亚洲天堂久久久久久久| 91浏览器在线视频| 亚洲va韩国va欧美va| 欧美一区三区四区| 精品一区二区三区在线观看国产 | 九九视频精品免费| 久久人人97超碰com| 福利一区二区在线| 一区二区三区在线看| 欧美日韩黄色一区二区| 免费观看在线综合色| 2020国产精品| av一区二区久久| 午夜av一区二区| 欧美一区二区精品| 国产高清精品网站| 亚洲欧美日韩在线播放| 欧美日韩中字一区| 久久爱另类一区二区小说| 国产日产欧美精品一区二区三区| aaa欧美大片| 日产精品久久久久久久性色| 久久亚洲综合色一区二区三区| 成人精品视频一区二区三区尤物| 一区二区高清免费观看影视大全 | 精品成人免费观看| 97精品国产露脸对白| 日韩av一区二区在线影视| 国产视频一区二区在线| 在线观看日韩国产| 国产一区二区h| 亚洲精品伦理在线| 欧美刺激午夜性久久久久久久| 成人免费毛片app| 天堂影院一区二区| 久久精品视频在线看| 欧洲精品在线观看| 国产美女视频91| 午夜伦欧美伦电影理论片| 欧美激情一区二区三区四区 | 亚洲综合丝袜美腿| 国产日韩视频一区二区三区| 欧美少妇xxx| 大胆欧美人体老妇| 日本人妖一区二区| 伊人一区二区三区| 久久久亚洲国产美女国产盗摄| 91成人看片片| 成人美女视频在线看| 奇米一区二区三区| 亚洲情趣在线观看| 久久只精品国产| 欧美色区777第一页| 成人一区二区三区在线观看 | 欧美日韩卡一卡二| 波多野结衣视频一区| 奇米亚洲午夜久久精品| 亚洲乱码精品一二三四区日韩在线| 精品免费日韩av| 69堂亚洲精品首页| 色婷婷亚洲精品| 成人动漫在线一区| 国产一区视频在线看| 午夜精品久久久久久不卡8050| 国产精品家庭影院| 久久久精品国产免大香伊| 制服丝袜中文字幕一区| 欧美艳星brazzers| 色综合一个色综合| 成人视屏免费看| 国产黄色91视频| 韩国在线一区二区| 免费视频一区二区| 午夜成人免费视频| 亚洲妇女屁股眼交7| 18欧美亚洲精品| 一区二区中文视频| 中文字幕乱码一区二区免费| xfplay精品久久| 精品1区2区在线观看| 日韩免费看的电影| 91精品国产手机| 欧美丰满一区二区免费视频| 欧美色图在线观看| 欧美日韩中文字幕一区| 中文字幕一区二区三区在线播放 | 日韩欧美色综合| 欧美乱熟臀69xxxxxx|