583 lines
14 KiB
C++
583 lines
14 KiB
C++
// TabCtrlDlg.cpp : implementation file
|
|
//
|
|
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
|
|
// (c)1998-2008 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "TabCtrl.h"
|
|
#include "TabCtrlDlg.h"
|
|
#include "AboutDlg.h"
|
|
#include "View1.h"
|
|
#include "View2.h"
|
|
#include "View3.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditListBoxEx dialog
|
|
|
|
const int BTN_OFFSET = 22;
|
|
|
|
BEGIN_MESSAGE_MAP(CEditListBoxEx, CXTEditListBox)
|
|
//{{AFX_MSG_MAP(CEditListBoxEx)
|
|
ON_WM_WINDOWPOSCHANGING()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
void CEditListBoxEx::Initialize(bool bAutoFont/*=true*/)
|
|
{
|
|
CXTListBox::Initialize(bAutoFont);
|
|
|
|
// get a pointer to the parent window.
|
|
m_pParentWnd = GetParent();
|
|
ASSERT_VALID(m_pParentWnd); // must be valid.
|
|
|
|
// Create the edit toolbar group.
|
|
if (!HasToolbar())
|
|
return;
|
|
|
|
// Create the toolbar.
|
|
if (!CreateEditGroup(bAutoFont))
|
|
return;
|
|
|
|
// force WM_WINDOWPOSCHANGING to be called to adjust the
|
|
// size of the edit list control, which will also cause
|
|
// WM_WINDOWPOSCHANGED to be called to position the toolbar.
|
|
::SetWindowPos( GetSafeHwnd(), NULL, 0, 0, 0, 0,
|
|
SWP_FRAMECHANGED|SWP_NOSIZE|SWP_NOMOVE);
|
|
}
|
|
|
|
void CEditListBoxEx::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
|
|
{
|
|
if (HasToolbar() && ::IsWindow(m_editGroup.m_hWnd))
|
|
{
|
|
lpwndpos->cy -= BTN_OFFSET;
|
|
lpwndpos->y += BTN_OFFSET;
|
|
}
|
|
|
|
CXTListBox::OnWindowPosChanging(lpwndpos);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTabCtrlDlg dialog
|
|
|
|
CTabCtrlDlg::CTabCtrlDlg(CWnd* pParent /*=NULL*/)
|
|
: CXTResizeDialog(CTabCtrlDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CTabCtrlDlg)
|
|
m_bAutoCondense = TRUE;
|
|
m_bVertical = FALSE;
|
|
m_bMultiLine = FALSE;
|
|
m_bXPMode = FALSE;
|
|
//}}AFX_DATA_INIT
|
|
m_bCloseButton = FALSE;
|
|
m_bArrowButtons = TRUE;
|
|
|
|
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
}
|
|
|
|
void CTabCtrlDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CXTResizeDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CTabCtrlDlg)
|
|
DDX_Control(pDX, IDC_TAB_CTRL, m_tabCtrl);
|
|
DDX_Check(pDX, IDC_AUTOCONDENSE, m_bAutoCondense);
|
|
DDX_Check(pDX, IDC_VERTICAL, m_bVertical);
|
|
DDX_Check(pDX, IDC_MULTILINE, m_bMultiLine);
|
|
DDX_Control(pDX, IDC_VERTICAL, m_chkVertical);
|
|
DDX_Control(pDX, IDC_MULTILINE, m_chkMultiline);
|
|
DDX_Control(pDX, IDC_AUTOCONDENSE, m_chkAutoCondense);
|
|
DDX_Check(pDX, IDC_XPMODE, m_bXPMode);
|
|
|
|
//}}AFX_DATA_MAP
|
|
DDX_Check(pDX, IDC_ARROWS, m_bArrowButtons);
|
|
DDX_Check(pDX, IDC_CLOSE, m_bCloseButton);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CTabCtrlDlg, CXTResizeDialog)
|
|
//{{AFX_MSG_MAP(CTabCtrlDlg)
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_PAINT()
|
|
ON_WM_QUERYDRAGICON()
|
|
ON_WM_DESTROY()
|
|
ON_BN_CLICKED(IDC_AUTOCONDENSE, OnAutocondense)
|
|
ON_BN_CLICKED(IDC_VERTICAL, OnVertical)
|
|
ON_BN_CLICKED(IDC_MULTILINE, OnMultiline)
|
|
ON_WM_WINDOWPOSCHANGED()
|
|
ON_BN_CLICKED(IDC_XPMODE, OnXpmode)
|
|
//}}AFX_MSG_MAP
|
|
|
|
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_CTRL, OnSelChangeTab)
|
|
ON_NOTIFY(TCN_SELCHANGING, IDC_TAB_CTRL, OnSelChangingTab)
|
|
|
|
ON_LBN_XT_LABELEDITEND(IDC_EDIT_LIST, OnLabelEditEnd)
|
|
ON_LBN_XT_LABELEDITCANCEL(IDC_EDIT_LIST, OnLabelEditCancel)
|
|
ON_LBN_XT_NEWITEM(IDC_EDIT_LIST, OnNewItem)
|
|
ON_LBN_XT_DELETEITEM(IDC_EDIT_LIST, OnDeleteItem)
|
|
ON_LBN_XT_MOVEITEMUP(IDC_EDIT_LIST, OnMoveItemUp)
|
|
ON_LBN_XT_MOVEITEMDOWN(IDC_EDIT_LIST, OnMoveItemDown)
|
|
|
|
ON_BN_CLICKED(IDC_ARROWS, OnChkButtons)
|
|
ON_BN_CLICKED(IDC_CLOSE, OnChkButtons)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTabCtrlDlg message handlers
|
|
|
|
BOOL CTabCtrlDlg::OnInitDialog()
|
|
{
|
|
CXTResizeDialog::OnInitDialog();
|
|
|
|
// Add "About..." menu item to system menu.
|
|
|
|
// IDM_ABOUTBOX must be in the system command range.
|
|
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
|
|
ASSERT(IDM_ABOUTBOX < 0xF000);
|
|
|
|
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
|
if (pSysMenu != NULL)
|
|
{
|
|
CString strAboutMenu;
|
|
strAboutMenu.LoadString(IDS_ABOUTBOX);
|
|
if (!strAboutMenu.IsEmpty())
|
|
{
|
|
pSysMenu->AppendMenu(MF_SEPARATOR);
|
|
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
|
|
}
|
|
}
|
|
|
|
// Set the icon for this dialog. The framework does this automatically
|
|
// when the application's main window is not a dialog
|
|
SetIcon(m_hIcon, TRUE); // Set big icon
|
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
|
|
|
VERIFY(InitTabCtrl() != -1);
|
|
VERIFY(InitEditList() != -1);
|
|
VERIFY(AddTabViews() != -1);
|
|
|
|
// Set control resizing.
|
|
SetResize(IDC_TAB_CTRL, SZ_TOP_LEFT, SZ_BOTTOM_RIGHT);
|
|
SetResize(IDOK, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
|
|
SetResize(IDCANCEL, SZ_TOP_RIGHT, SZ_TOP_RIGHT);
|
|
SetResize(IDC_AUTOCONDENSE, SZ_BOTTOM_LEFT, SZ_BOTTOM_LEFT);
|
|
SetResize(IDC_VERTICAL, SZ_BOTTOM_LEFT, SZ_BOTTOM_LEFT);
|
|
SetResize(IDC_MULTILINE, SZ_BOTTOM_LEFT, SZ_BOTTOM_LEFT);
|
|
SetResize(IDC_XPMODE, SZ_BOTTOM_LEFT, SZ_BOTTOM_LEFT);
|
|
SetResize(IDC_ARROWS, SZ_BOTTOM_LEFT, SZ_BOTTOM_LEFT);
|
|
SetResize(IDC_CLOSE, SZ_BOTTOM_LEFT, SZ_BOTTOM_LEFT);
|
|
|
|
// Load window placement
|
|
LoadPlacement(_T("CTabCtrlDlg"));
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
void CTabCtrlDlg::OnDestroy()
|
|
{
|
|
// Save window placement
|
|
SavePlacement(_T("CTabCtrlDlg"));
|
|
|
|
CXTResizeDialog::OnDestroy();
|
|
}
|
|
|
|
void CTabCtrlDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
|
|
{
|
|
CAboutDlg dlgAbout;
|
|
dlgAbout.DoModal();
|
|
}
|
|
else
|
|
{
|
|
CXTResizeDialog::OnSysCommand(nID, lParam);
|
|
}
|
|
}
|
|
|
|
// If you add a minimize button to your dialog, you will need the code below
|
|
// to draw the icon. For MFC applications using the document/view model,
|
|
// this is automatically done for you by the framework.
|
|
|
|
void CTabCtrlDlg::OnPaint()
|
|
{
|
|
if (IsIconic())
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
|
|
|
|
// Center icon in client rectangle
|
|
int cxIcon = GetSystemMetrics(SM_CXICON);
|
|
int cyIcon = GetSystemMetrics(SM_CYICON);
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
int x = (rect.Width() - cxIcon + 1) / 2;
|
|
int y = (rect.Height() - cyIcon + 1) / 2;
|
|
|
|
// Draw the icon
|
|
dc.DrawIcon(x, y, m_hIcon);
|
|
}
|
|
else
|
|
{
|
|
CXTResizeDialog::OnPaint();
|
|
}
|
|
}
|
|
|
|
// The system calls this to obtain the cursor to display while the user drags
|
|
// the minimized window.
|
|
HCURSOR CTabCtrlDlg::OnQueryDragIcon()
|
|
{
|
|
return (HCURSOR) m_hIcon;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Tab control initialization
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
int CTabCtrlDlg::InitTabCtrl()
|
|
{
|
|
// you can use this to change the tab orientation
|
|
|
|
/*
|
|
m_tabCtrl.ModifyTabStyle(NULL, TCS_BOTTOM);
|
|
*/
|
|
|
|
// Have the tab control send WM_INITIALUPDATE to views.
|
|
m_tabCtrl.SendInitialUpdate(TRUE);
|
|
|
|
// you can use something like the following snippet to remove an image
|
|
// from a tab that's already been created...
|
|
|
|
/*
|
|
TCITEM tci;
|
|
tci.mask = TCIF_IMAGE;
|
|
tci.iImage = -1;
|
|
m_tabCtrl.SetItem(1, &tci);
|
|
*/
|
|
|
|
m_tabCtrl.SetPadding(CSize(6, 3));
|
|
|
|
// Create the image list used by the tab control.
|
|
if (!m_imageList.Create( IDB_IMAGELIST, 16, 1, RGB( 0x00,0xFF,0x00 )))
|
|
{
|
|
TRACE0("Failed to create image list.\n");
|
|
return -1;
|
|
}
|
|
|
|
// Set the tab controls image list.
|
|
m_tabCtrl.SetImageList(&m_imageList);
|
|
|
|
// Set the tab to auto condense (shrink) its tabs when sized.
|
|
m_tabCtrl.SetAutoCondense(m_bAutoCondense);
|
|
|
|
// Clip children of the tab control from paint routines to reduce flicker.
|
|
m_tabCtrl.ModifyStyle(0L,
|
|
WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
|
|
|
|
ForceRefreshTabCtrl();
|
|
|
|
return 0;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Edit list box initialization
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
int CTabCtrlDlg::InitEditList()
|
|
{
|
|
if (!m_listBox.CreateEx(WS_EX_CLIENTEDGE, _T("listbox"), NULL,
|
|
WS_CHILD|WS_VISIBLE|LBS_NOINTEGRALHEIGHT|WS_VSCROLL,
|
|
CRect(0,0,0,0), &m_tabCtrl, IDC_EDIT_LIST))
|
|
{
|
|
TRACE0("Failed to create listbox control.\n");
|
|
return -1;
|
|
}
|
|
|
|
m_listBox.SetOwner(this);
|
|
|
|
// Set the font for the listbox control.
|
|
m_listBox.SetFont (&XTAuxData().font);
|
|
|
|
CString strText;
|
|
int iItem;
|
|
for (iItem = 1; iItem < 11; ++iItem)
|
|
{
|
|
strText.Format(_T("ListBox Item %d"), iItem);
|
|
m_listBox.AddString(strText);
|
|
}
|
|
|
|
// initialize list box.
|
|
m_listBox.Initialize();
|
|
|
|
return 0;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Tab view's added to tab control
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
int CTabCtrlDlg::AddTabViews()
|
|
{
|
|
// add views to the tab control.
|
|
if (!m_tabCtrl.AddView(_T("View One - HTML"), RUNTIME_CLASS(CView1), NULL, NULL, 0, 0))
|
|
{
|
|
TRACE0("Failed to create CView1.\n");
|
|
return -1;
|
|
}
|
|
|
|
if (!m_tabCtrl.AddView(_T("View Two"), RUNTIME_CLASS(CView2), NULL, NULL, 1, 1))
|
|
{
|
|
TRACE0("Failed to create CView2.\n");
|
|
return -1;
|
|
}
|
|
|
|
if (!m_tabCtrl.AddView(_T("View Three"), RUNTIME_CLASS(CView3), NULL, NULL, 2, 2))
|
|
{
|
|
TRACE0("Failed to create CView3.\n");
|
|
return -1;
|
|
}
|
|
|
|
if (!m_tabCtrl.AddControl(_T("View Four - Edit List"), &m_listBox, 3, 3))
|
|
{
|
|
TRACE0("Failed to create edit list.\n");
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Edit list box message handling
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void CTabCtrlDlg::OnLabelEditEnd()
|
|
{
|
|
TRACE0("CTabCtrlDlg::OnLabelEditEnd() called.\n");
|
|
}
|
|
|
|
void CTabCtrlDlg::OnLabelEditCancel()
|
|
{
|
|
TRACE0("CTabCtrlDlg::OnLabelEditCancel() called.\n");
|
|
}
|
|
|
|
void CTabCtrlDlg::OnNewItem()
|
|
{
|
|
TRACE0("CTabCtrlDlg::OnNewItem() called.\n");
|
|
}
|
|
|
|
void CTabCtrlDlg::OnDeleteItem()
|
|
{
|
|
TRACE0("CTabCtrlDlg::OnDeleteItem() called.\n");
|
|
}
|
|
|
|
void CTabCtrlDlg::OnMoveItemUp()
|
|
{
|
|
TRACE0("CTabCtrlDlg::OnMoveItemUp() called.\n");
|
|
}
|
|
|
|
void CTabCtrlDlg::OnMoveItemDown()
|
|
{
|
|
TRACE0("CTabCtrlDlg::OnMoveItemDown() called.\n");
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTabCtrlDlg message handlers
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void CTabCtrlDlg::OnAutocondense()
|
|
{
|
|
UpdateData();
|
|
m_tabCtrl.SetAutoCondense(m_bAutoCondense);
|
|
ForceRefreshTabCtrl();
|
|
}
|
|
|
|
void CTabCtrlDlg::OnVertical()
|
|
{
|
|
UpdateData();
|
|
ToggleStyle(TCS_VERTICAL, m_bVertical);
|
|
GetDlgItem(IDC_MULTILINE)->EnableWindow(!m_bVertical);
|
|
OnMultiline();
|
|
}
|
|
|
|
void CTabCtrlDlg::OnMultiline()
|
|
{
|
|
UpdateData();
|
|
ToggleStyle(TCS_MULTILINE, m_bMultiLine | m_bVertical);
|
|
}
|
|
|
|
void CTabCtrlDlg::ToggleStyle(int style, BOOL bEnable)
|
|
{
|
|
if (bEnable)
|
|
{
|
|
m_tabCtrl.ModifyTabStyle(0, style);
|
|
}
|
|
else
|
|
{
|
|
m_tabCtrl.ModifyTabStyle(style, 0);
|
|
}
|
|
ForceRefreshTabCtrl();
|
|
}
|
|
|
|
void CTabCtrlDlg::ForceRefreshTabCtrl()
|
|
{
|
|
::SetWindowPos(m_tabCtrl.m_hWnd, NULL, 0,0,0,0,
|
|
SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
|
|
m_tabCtrl.Invalidate(FALSE);
|
|
|
|
UpdateData();
|
|
BOOL bEnable = !m_bVertical && m_bXPMode && !m_bAutoCondense && !m_bMultiLine;
|
|
|
|
GetDlgItem(IDC_ARROWS)->EnableWindow(bEnable);
|
|
GetDlgItem(IDC_CLOSE)->EnableWindow(bEnable);
|
|
GetDlgItem(IDC_MULTILINE)->EnableWindow(!m_bAutoCondense);
|
|
}
|
|
|
|
void CTabCtrlDlg::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
|
|
{
|
|
CXTResizeDialog::OnWindowPosChanged(lpwndpos);
|
|
|
|
if (::IsWindow(m_chkVertical.m_hWnd))
|
|
{
|
|
m_chkVertical.Invalidate();
|
|
m_chkVertical.UpdateWindow();
|
|
}
|
|
|
|
if (::IsWindow(m_chkMultiline.m_hWnd))
|
|
{
|
|
m_chkMultiline.Invalidate();
|
|
m_chkMultiline.UpdateWindow();
|
|
}
|
|
|
|
if (::IsWindow(m_chkAutoCondense.m_hWnd))
|
|
{
|
|
m_chkAutoCondense.Invalidate();
|
|
m_chkAutoCondense.UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CTabCtrlDlg::OnXpmode()
|
|
{
|
|
UpdateData();
|
|
|
|
XTThemeManager()->SetTheme(m_bXPMode? xtThemeOfficeXP: xtThemeDefault);
|
|
|
|
if ( m_bXPMode )
|
|
{
|
|
m_listBox.GetEditGroup().SetXButtonStyle(BS_XT_XPFLAT);
|
|
m_listBox.GetEditGroup().SetWindowPos(NULL, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
|
|
}
|
|
else
|
|
{
|
|
m_listBox.GetEditGroup().SetXButtonStyle(BS_XT_FLAT|BS_XT_WINXP_COMPAT);
|
|
m_listBox.GetEditGroup().SetWindowPos(NULL, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
|
|
}
|
|
|
|
RedrawWindow( NULL, NULL,
|
|
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN );
|
|
|
|
ForceRefreshTabCtrl();
|
|
}
|
|
|
|
void CTabCtrlDlg::OnChkButtons()
|
|
{
|
|
UpdateData();
|
|
|
|
m_tabCtrl.ShowNavButtons((m_bCloseButton? xtNavBtnClose: 0) |
|
|
(m_bArrowButtons? xtNavBtnArrows: 0));
|
|
|
|
ForceRefreshTabCtrl();
|
|
}
|
|
|
|
void CTabCtrlDlg::OnSelChangeTab(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// This is for demonstration purposes, you could
|
|
// also use the m_tabCtrl member.
|
|
|
|
CXTTabCtrl* pTabCtrl = DYNAMIC_DOWNCAST(CXTTabCtrl, CWnd::FromHandle(pNMHDR->hwndFrom));
|
|
ASSERT_VALID(pTabCtrl);
|
|
|
|
// This is for demonstration purposes, you could
|
|
// also use IDC_TAB_CTRL or m_tabCtrl.GetDlgCtrlID().
|
|
|
|
int nID = (int)pNMHDR->idFrom;
|
|
TRACE1("TCN_SELCHANGE called for ID %d.\n", nID);
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CTabCtrlDlg::OnSelChangingTab(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// This is for demonstration purposes, you could
|
|
// also use the m_tabCtrl member.
|
|
|
|
CXTTabCtrl* pTabCtrl = DYNAMIC_DOWNCAST(CXTTabCtrl, CWnd::FromHandle(pNMHDR->hwndFrom));
|
|
ASSERT_VALID(pTabCtrl);
|
|
|
|
// This is for demonstration purposes, you could
|
|
// also use IDC_TAB_CTRL or m_tabCtrl.GetDlgCtrlID().
|
|
|
|
int nID = (int)pNMHDR->idFrom;
|
|
TRACE1("TCN_SELCHANGING called for ID %d.\n", nID);
|
|
|
|
*pResult = 0;
|
|
|
|
// Uncomment this line to disable tab selection from changing.
|
|
//*pResult = 1;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTabCtrlEx
|
|
|
|
CTabCtrlEx::CTabCtrlEx()
|
|
{
|
|
// TODO: add construction code here.
|
|
m_bXPBorder = false;
|
|
}
|
|
|
|
CTabCtrlEx::~CTabCtrlEx()
|
|
{
|
|
// TODO: add destruction code here.
|
|
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC(CTabCtrlEx, CXTTabCtrl)
|
|
|
|
BEGIN_MESSAGE_MAP(CTabCtrlEx, CXTTabCtrl)
|
|
//{{AFX_MSG_MAP(CTabCtrlEx)
|
|
ON_COMMAND(XT_IDC_TAB_CLOSE, OnCloseTab)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTabCtrlEx message handlers
|
|
|
|
void CTabCtrlEx::OnCloseTab()
|
|
{
|
|
if ( GetItemCount( ) == 1 )
|
|
{
|
|
AfxMessageBox( IDS_CANNOTDEL );
|
|
}
|
|
else
|
|
{
|
|
DeleteView( GetCurSel( ) );
|
|
}
|
|
}
|