📄 dlgsplitter.cpp
字号:
}
/////////////////////////////////////////////////////////////////////////////
// CDlgSplitterWnd command routing
BOOL CDlgSplitterWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (CWnd::OnCommand(wParam, lParam))
return TRUE;
// route commands to the splitter to the parent frame window
//下面注释的是原程序的语句
//return GetParentFrame()->SendMessage(WM_COMMAND, wParam, lParam);
return GetParent()->SendMessage(WM_COMMAND, wParam, lParam);
}
BOOL CDlgSplitterWnd::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if (CWnd::OnNotify(wParam, lParam, pResult))
return TRUE;
// route commands to the splitter to the parent frame window
//下面注释的是源程序的语句
//*pResult = GetParentFrame()->SendMessage(WM_NOTIFY, wParam, lParam);
*pResult = GetParent()->SendMessage(WM_NOTIFY, wParam, lParam);
return TRUE;
}
BOOL CDlgSplitterWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
//The code line below is necessary if using CxSplitterWnd in a regular dll
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
return CWnd::OnWndMsg(message, wParam, lParam, pResult);
}
/////////////////////////////////////////////////////////////////////////////
// Scroll messages
BOOL CDlgSplitterWnd::OnMouseWheel(UINT fFlags, short zDelta, CPoint point)
{
BOOL bRetVal = FALSE;
int row;
int col;
// find panes in the splitter that has scroll bars
// and have them do their scrolling
for (row = 0; row < m_nRows; row++)
{
for (col = 0; col < m_nCols; col++)
{
// only do the scrolling if the window is-a CScrollView
CWnd* pPane = GetPane(row, col);
CScrollView* pView = DYNAMIC_DOWNCAST(CScrollView, pPane);
if (pView != NULL)
{
// prefer to scroll vertically if available
CScrollBar* pBar = pView->GetScrollBarCtrl(SB_VERT);
if (pBar == NULL)
{
pBar = pView->GetScrollBarCtrl(SB_HORZ);
if (pBar == NULL)
continue;
}
// get the old position, do the scrolling, and
// then trigger the repaint
int nOldPos = pBar->GetScrollPos();
if (pView->DoMouseWheel(fFlags, zDelta, point))
bRetVal = TRUE;
if (col < m_nCols -1)
pBar->SetScrollPos(nOldPos, FALSE);
}
}
}
return TRUE;
}
void CDlgSplitterWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
ASSERT(pScrollBar != NULL);
int col = _AfxGetDlgCtrlID(pScrollBar->m_hWnd) - AFX_IDW_HSCROLL_FIRST;
ASSERT(col >= 0 && col < m_nMaxCols);
ASSERT(m_nRows > 0);
int nOldPos = pScrollBar->GetScrollPos();
#ifdef _DEBUG
int nNewPos;
#endif
for (int row = 0; row < m_nRows; row++)
{
GetPane(row, col)->SendMessage(WM_HSCROLL,
MAKELONG(nSBCode, nPos), (LPARAM)pScrollBar->m_hWnd);
#ifdef _DEBUG
if (row == 0)
{
nNewPos = pScrollBar->GetScrollPos();
if (pScrollBar->GetScrollPos() != nNewPos)
{
TRACE0("Warning: scroll panes setting different scroll positions.\n");
// stick with the last one set
}
}
#endif //_DEBUG
// set the scroll pos to the value it was originally for the next pane
if (row < m_nRows - 1)
pScrollBar->SetScrollPos(nOldPos, FALSE);
}
}
void CDlgSplitterWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
ASSERT(pScrollBar != NULL);
int row = _AfxGetDlgCtrlID(pScrollBar->m_hWnd) - AFX_IDW_VSCROLL_FIRST;
ASSERT(row >= 0 && row < m_nMaxRows);
ASSERT(m_nCols > 0);
int nOldPos = pScrollBar->GetScrollPos();
#ifdef _DEBUG
int nNewPos;
#endif
for (int col = 0; col < m_nCols; col++)
{
GetPane(row, col)->SendMessage(WM_VSCROLL,
MAKELONG(nSBCode, nPos), (LPARAM)pScrollBar->m_hWnd);
#ifdef _DEBUG
if (col == 0)
{
nNewPos = pScrollBar->GetScrollPos();
if (pScrollBar->GetScrollPos() != nNewPos)
{
TRACE0("Warning: scroll panes setting different scroll positions.\n");
// stick with the last one set
}
}
#endif //_DEBUG
// set the scroll pos to the value it was originally for the next pane
if (col < m_nCols - 1)
pScrollBar->SetScrollPos(nOldPos, FALSE);
}
}
// synchronized scrolling
BOOL CDlgSplitterWnd::DoScroll(CView* pViewFrom, UINT nScrollCode, BOOL bDoScroll)
{
ASSERT_VALID(pViewFrom);
int rowFrom, colFrom;
if (!IsChildPane(pViewFrom, &rowFrom, &colFrom))
return FALSE;
BOOL bResult = FALSE;
// save original positions
int nOldVert = 0;
CScrollBar* pScrollVert = pViewFrom->GetScrollBarCtrl(SB_VERT);
if (pScrollVert != NULL)
nOldVert = pScrollVert->GetScrollPos();
int nOldHorz = 0;
CScrollBar* pScrollHorz = pViewFrom->GetScrollBarCtrl(SB_HORZ);
if (pScrollHorz != NULL)
nOldHorz = pScrollHorz->GetScrollPos();
// scroll the view from which the message is from
if (pViewFrom->OnScroll(nScrollCode, 0, bDoScroll))
bResult = TRUE;
if (pScrollVert != NULL)
{
#ifdef _DEBUG
int nNewVert = pScrollVert->GetScrollPos();
#endif
// scroll related columns
for (int col = 0; col < m_nCols; col++)
{
if (col == colFrom)
continue;
// set the scroll pos to the value it was originally
pScrollVert->SetScrollPos(nOldVert, FALSE);
// scroll the pane
CView* pView = (CView*)GetPane(rowFrom, col);
ASSERT_KINDOF(CView, pView);
ASSERT(pView != pViewFrom);
if (pView->OnScroll(MAKEWORD(-1, HIBYTE(nScrollCode)), 0,
bDoScroll))
{
bResult = TRUE;
}
#ifdef _DEBUG
if (pScrollVert->GetScrollPos() != nNewVert)
{
TRACE0("Warning: scroll panes setting different scroll positions.\n");
// stick with the last one set
}
#endif
}
}
if (pScrollHorz != NULL)
{
#ifdef _DEBUG
int nNewHorz = pScrollHorz->GetScrollPos();
#endif
// scroll related rows
for (int row = 0; row < m_nRows; row++)
{
if (row == rowFrom)
continue;
// set the scroll pos to the value it was originally
pScrollHorz->SetScrollPos(nOldHorz, FALSE);
// scroll the pane
CView* pView = (CView*)GetPane(row, colFrom);
ASSERT_KINDOF(CView, pView);
ASSERT(pView != pViewFrom);
if (pView->OnScroll(MAKEWORD(LOBYTE(nScrollCode), -1), 0,
bDoScroll))
{
bResult = TRUE;
}
#ifdef _DEBUG
if (pScrollHorz->GetScrollPos() != nNewHorz)
{
TRACE0("Warning: scroll panes setting different scroll positions.\n");
// stick with the last one set
}
#endif
}
}
return bResult;
}
BOOL CDlgSplitterWnd::DoScrollBy(CView* pViewFrom, CSize sizeScroll, BOOL bDoScroll)
{
int rowFrom, colFrom;
if (!IsChildPane(pViewFrom, &rowFrom, &colFrom))
return FALSE;
BOOL bResult = FALSE;
// save original positions
int nOldVert = 0;
CScrollBar* pScrollVert = pViewFrom->GetScrollBarCtrl(SB_VERT);
if (pScrollVert != NULL)
nOldVert = pScrollVert->GetScrollPos();
int nOldHorz = 0;
CScrollBar* pScrollHorz = pViewFrom->GetScrollBarCtrl(SB_HORZ);
if (pScrollHorz != NULL)
nOldHorz = pScrollHorz->GetScrollPos();
// scroll the view from which the message is from
if (pViewFrom->OnScrollBy(sizeScroll, bDoScroll))
bResult = TRUE;
if (pScrollVert != NULL)
{
#ifdef _DEBUG
int nNewVert = pScrollVert->GetScrollPos();
#endif
// scroll related columns
for (int col = 0; col < m_nCols; col++)
{
if (col == colFrom)
continue;
// set the scroll pos to the value it was originally for the next pane
pScrollVert->SetScrollPos(nOldVert, FALSE);
// scroll the pane
CView* pView = (CView*)GetPane(rowFrom, col);
ASSERT_KINDOF(CView, pView);
ASSERT(pView != pViewFrom);
if (pView->OnScrollBy(CSize(0, sizeScroll.cy), bDoScroll))
bResult = TRUE;
#ifdef _DEBUG
if (pScrollVert->GetScrollPos() != nNewVert)
{
TRACE0("Warning: scroll panes setting different scroll positions.\n");
// stick with the last one set
}
#endif
}
}
if (pScrollHorz != NULL)
{
#ifdef _DEBUG
int nNewHorz = pScrollHorz->GetScrollPos();
#endif
// scroll related rows
for (int row = 0; row < m_nRows; row++)
{
if (row == rowFrom)
continue;
// set the scroll pos to the value it was originally for the next pane
pScrollHorz->SetScrollPos(nOldHorz, FALSE);
// scroll the pane
CView* pView = (CView*)GetPane(row, colFrom);
ASSERT_KINDOF(CView, pView);
ASSERT(pView != pViewFrom);
if (pView->OnScrollBy(CSize(sizeScroll.cx, 0), bDoScroll))
bResult = TRUE;
#ifdef _DEBUG
if (pScrollHorz->GetScrollPos() != nNewHorz)
{
TRACE0("Warning: scroll panes setting different scroll positions.\n");
// stick with the last one set
}
#endif
}
}
return bResult;
}
/////////////////////////////////////////////////////////////////////////////
// Focus control and control over the current pane/child
BOOL CDlgSplitterWnd::CanActivateNext(BOOL)
{
ASSERT_VALID(this);
if (GetActivePane() == NULL)
{
TRACE0("Warning: Can't go to next pane - there is no current pane.\n");
return FALSE;
}
ASSERT(m_nRows != 0);
ASSERT(m_nCols != 0);
// if more than 1x1 we can go to the next or prev pane
return (m_nRows > 1) || (m_nCols > 1);
}
void CDlgSplitterWnd::ActivateNext(BOOL bPrev)
{
ASSERT_VALID(this);
// find the coordinate of the current pane
int row, col;
if (GetActivePane(&row, &col) == NULL)
{
TRACE0("Warning: Cannot go to next pane - there is no current view.\n");
return;
}
ASSERT(row >= 0 && row < m_nRows);
ASSERT(col >= 0 && col < m_nCols);
// determine next pane
if (bPrev)
{
// prev
if (--col < 0)
{
col = m_nCols - 1;
if (--row < 0)
row = m_nRows - 1;
}
}
else
{
// next
if (++col >= m_nCols)
{
col = 0;
if (++row >= m_nRows)
row = 0;
}
}
// set newly active pane
SetActivePane(row, col);
}
void CDlgSplitterWnd::SetActivePane(int row, int col, CWnd* pWnd)
{
// set the focus to the pane
CWnd* pPane = pWnd == NULL ? GetPane(row, col) : pWnd;
//下面加注释的是原有代码的主要部分。
//if (pPane->IsKindOf(RUNTIME_CLASS(CView)))
//{
//CFrameWnd* pFrameWnd = GetParentFrame();
//ASSERT_VALID(pFrameWnd);
//pFrameWnd->SetActiveView((CView*)pPane);
//}
//else
//{
//TRACE0("Warning: Next pane is not a view - calling SetFocus.\n");
pPane->SetFocus();
//}
}
CWnd* CDlgSplitterWnd::GetActivePane(int* pRow, int* pCol) // return active view, NULL when no active view
{
ASSERT_VALID(this);
//获得当前的获得焦点的窗口
//下面注释的是原有的代码的主要部分。
//attempt to use active view of frame window
//CWnd* pView = NULL;
//CFrameWnd* pFrameWnd = GetParentFrame();
//ASSERT_VALID(pFrameWnd);
//pView = pFrameWnd->GetActiveView();
// failing that, use the current focus
//if (pView == NULL)
// pView = GetFocus();
CWnd* pView = GetFocus(); //新加
// make sure the pane is a child pane of the splitter
if (pView != NULL && !IsChildPane(pView, pRow, pCol))
pView = NULL;
return pView;
}
/////////////////////////////////////////////////////////////////////////////
// CDlgSplitterWnd diagnostics
#ifdef _DEBUG
void CDlgSplitterWnd::AssertValid() const
{
CWnd::AssertValid();
ASSERT(m_nMaxRows >= 1);
ASSERT(m_nMaxCols >= 1);
ASSERT(m_nMaxCols > 1 || m_nMaxRows > 1); // 1x1 is not permitted
ASSERT(m_nRows >= 1);
ASSERT(m_nCols >= 1);
ASSERT(m_nRows <= m_nMaxRows);
ASSERT(m_nCols <= m_nMaxCols);
}
void CDlgSplitterWnd::Dump(CDumpContext& dc) const
{
CWnd::Dump(dc);
if (m_pDynamicViewClass != NULL)
dc << "m_pDynamicViewClass = " << m_pDynamicViewClass->m_lpszClassName;
dc << "\nm_nMaxRows = " << m_nMaxRows;
dc << "\nm_nMaxCols = " << m_nMaxCols;
dc << "\nm_nRows = " << m_nRows;
dc << "\nm_nCols = " << m_nCols;
dc << "\nm_bHasHScroll = " << m_bHasHScroll;
dc << "\nm_bHasVScroll = " << m_bHasVScroll;
dc << "\nm_cxSplitter = " << m_cxSplitter;
dc << "\nm_cySplitter = " << m_cySplitter;
if (m_bTracking)
{
dc << "\nTRACKING: m_htTrack = " << m_htTrack;
dc << "\nm_rectLimit = " << m_rectLimit;
dc << "\nm_ptTrackOffset = " << m_ptTrackOffset;
dc << "\nm_rectTracker = " << m_rectTracker;
if (m_bTracking2)
dc << "\nm_rectTracker2 = " << m_rectTracker2;
}
dc << "\n";
}
#endif
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -