www.pudn.com > CustomTabCtrl.zip > MainFrm.cpp
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "CustomTabCtrlDemoSDI.h"
#include "MainFrm.h"
#include "CustomTabCtrlDemoSDIDoc.h"
#include "CustomTabCtrlDemoSDIView.h"
#include "DlgProperties.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CTabSDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CTabSDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_DECHEIGHT, OnDecheight)
ON_UPDATE_COMMAND_UI(ID_DECHEIGHT, OnUpdateDecheight)
ON_COMMAND(ID_INHEIGHT, OnInheight)
ON_UPDATE_COMMAND_UI(ID_INHEIGHT, OnUpdateInheight)
ON_COMMAND(ID_BOTTOM, OnBottom)
ON_COMMAND(ID_LEFT, OnLeft)
ON_COMMAND(ID_RIGHT, OnRight)
ON_COMMAND(ID_TOP, OnTop)
ON_UPDATE_COMMAND_UI(ID_BOTTOM, OnUpdateBottom)
ON_UPDATE_COMMAND_UI(ID_LEFT, OnUpdateLeft)
ON_UPDATE_COMMAND_UI(ID_RIGHT, OnUpdateRight)
ON_UPDATE_COMMAND_UI(ID_TOP, OnUpdateTop)
//}}AFX_MSG_MAP
ON_NOTIFY(CTCN_RCLICK, IDC_TABCTRL, OnRclickTabctrl)
ON_NOTIFY(CTCN_CLICK, IDC_TABCTRL, OnClickTabctrl)
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_nHeight = 20;
m_orientation = ID_LEFT;
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
if(!m_wndTab.Create(WS_CHILD|WS_VISIBLE|CTCS_FOURBUTTONS|CTCS_DRAGMOVE|CTCS_TOOLTIPS|CTCS_CLOSEBUTTON|CTCS_LEFT,CRect(0,0,m_nHeight,m_nHeight),this,IDC_TABCTRL))
{
TRACE0("Failed to create tab control\n");
return -1;
}
m_wndTab.SetDragCursors(AfxGetApp()->LoadCursor(IDC_CURSORMOVE),NULL);
m_wndTab.SetItemTooltipText(CTCID_FIRSTBUTTON,"First");
m_wndTab.SetItemTooltipText(CTCID_PREVBUTTON,"Prev");
m_wndTab.SetItemTooltipText(CTCID_NEXTBUTTON,"Next");
m_wndTab.SetItemTooltipText(CTCID_LASTBUTTON,"Last");
m_wndTab.SetItemTooltipText(CTCID_CLOSEBUTTON,"Close");
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnDecheight()
{
m_nHeight--;
m_wndTab.MoveWindow(0,0,m_nHeight,m_nHeight);
RecalcLayout();
}
void CMainFrame::OnUpdateDecheight(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nHeight>=18);
}
void CMainFrame::OnInheight()
{
m_nHeight++;
m_wndTab.MoveWindow(0,0,m_nHeight,m_nHeight);
RecalcLayout();
}
void CMainFrame::OnUpdateInheight(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nHeight<=30);
}
void CMainFrame::OnClickTabctrl(NMHDR* pNMHDR, LRESULT* pResult)
{
CTabSDIFrameWnd::OnClickTabctrl(pNMHDR, pResult);
if(((CTC_NMHDR*)pNMHDR)->nItem==CTCHT_ONCLOSEBUTTON)
GetActiveDocument()->SetModifiedFlag();
}
void CMainFrame::OnRclickTabctrl(NMHDR* pNMHDR, LRESULT* pResult)
{
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING,1,_T("Add View"));
menu.AppendMenu(MF_STRING,2,_T("Delete View"));
menu.AppendMenu(MF_STRING,3,_T("Properties"));
if(((CTC_NMHDR*)pNMHDR)->nItem>=0)
SetCurView(((CTC_NMHDR*)pNMHDR)->nItem);
if(m_wndTab.GetItemCount()<2)
menu.EnableMenuItem(2,MF_GRAYED);
CPoint pt(((CTC_NMHDR*)pNMHDR)->ptHitTest);
m_wndTab.ClientToScreen(&pt);
int nRet = menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD|TPM_NONOTIFY, pt.x, pt.y, this);
switch(nRet)
{
case 1:
{
CCustomTabCtrlDemoSDIView* pView = new CCustomTabCtrlDemoSDIView;
if(!pView)
break;
if(!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0), AfxGetApp()->GetMainWnd(), AFX_IDW_PANE_FIRST, NULL))
break;
AddView(pView->m_sLabel,pView,pView->m_sTooltip);
pView->Navigate2(pView->m_sUrl,NULL,NULL);
GetActiveDocument()->SetModifiedFlag();
}
break;
case 2:
{
if(DeleteActiveView())
GetActiveDocument()->SetModifiedFlag();
}
break;
case 3:
{
DWORD dwData;
int ndx = m_wndTab.GetCurSel();
m_wndTab.GetItemData(ndx,dwData);
CCustomTabCtrlDemoSDIView* pView = (CCustomTabCtrlDemoSDIView*)dwData;
CDlgProperties dlg;
dlg.m_sLabel = pView->m_sLabel;
dlg.m_sTooltip = pView->m_sTooltip;
dlg.m_sUrl = pView->m_sUrl;
if(dlg.DoModal()==IDOK)
{
pView->m_sLabel = dlg.m_sLabel;
m_wndTab.SetItemText(ndx,dlg.m_sLabel);
pView->m_sTooltip = dlg.m_sTooltip;
m_wndTab.SetItemTooltipText(ndx,dlg.m_sTooltip);
pView->m_sUrl = dlg.m_sUrl;
pView->Navigate2(dlg.m_sUrl,NULL,NULL);
pView->GetDocument()->SetModifiedFlag();
}
}
break;
}
*pResult = 0;
}
void CMainFrame::OnBottom()
{
m_orientation = ID_BOTTOM;
m_wndTab.ModifyStyle(CTCS_LEFT,0,0);
m_wndTab.MoveWindow(0,0,m_nHeight,m_nHeight);
RecalcLayout();
}
void CMainFrame::OnLeft()
{
m_orientation = ID_LEFT;
m_wndTab.ModifyStyle(0,CTCS_LEFT,0);
m_wndTab.MoveWindow(0,0,m_nHeight,m_nHeight);
RecalcLayout();
}
void CMainFrame::OnRight()
{
m_orientation = ID_RIGHT;
m_wndTab.ModifyStyle(CTCS_TOP,CTCS_RIGHT,0);
m_wndTab.MoveWindow(0,0,m_nHeight,m_nHeight);
RecalcLayout();
}
void CMainFrame::OnTop()
{
m_orientation = ID_TOP;
m_wndTab.ModifyStyle(CTCS_RIGHT,CTCS_TOP,0);
m_wndTab.MoveWindow(0,0,m_nHeight,m_nHeight);
RecalcLayout();
}
void CMainFrame::OnUpdateBottom(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_orientation==ID_BOTTOM);
}
void CMainFrame::OnUpdateLeft(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_orientation==ID_LEFT);
}
void CMainFrame::OnUpdateRight(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_orientation==ID_RIGHT);
}
void CMainFrame::OnUpdateTop(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_orientation==ID_TOP);
}