📄 bcgptaskspane.cpp
字号:
nTask = 0;
for (POSITION posTask = pGroup->m_lstTasks.GetHeadPosition (); posTask != NULL; ++nTask)
{
CBCGPTask* pTask = (CBCGPTask*) pGroup->m_lstTasks.GetNext (posTask);
ASSERT_VALID (pTask);
if (pTask->m_uiCommandID == uiCommandID)
{
return TRUE;
}
}
}
nGroup = -1;
nTask = -1;
return FALSE;
}
//******************************************************************************************
BOOL CBCGPTasksPane::GetTaskLocation (HWND hwndTask, int& nGroup, int& nTask) const
{
nGroup = 0;
for (POSITION pos = m_lstTaskGroups.GetHeadPosition (); pos != NULL; ++nGroup)
{
CBCGPTasksGroup* pGroup = (CBCGPTasksGroup*) m_lstTaskGroups.GetNext (pos);
ASSERT_VALID (pGroup);
nTask = 0;
for (POSITION posTask = pGroup->m_lstTasks.GetHeadPosition (); posTask != NULL; ++nTask)
{
CBCGPTask* pTask = (CBCGPTask*) pGroup->m_lstTasks.GetNext (posTask);
ASSERT_VALID (pTask);
if (pTask->m_hwndTask == hwndTask)
{
return TRUE;
}
}
}
nGroup = -1;
nTask = -1;
return FALSE;
}
//******************************************************************************************
CBCGPTask* CBCGPTasksPane::GetTask (int nGroup, int nTask) const
{
ASSERT(nGroup >= 0);
ASSERT(nGroup < m_lstTaskGroups.GetCount ());
CBCGPTasksGroup* pGroup = GetTaskGroup (nGroup);
ASSERT_VALID (pGroup);
POSITION pos = pGroup->m_lstTasks.FindIndex (nTask);
if (pos == NULL)
{
return NULL;
}
CBCGPTask* pTask = (CBCGPTask*) pGroup->m_lstTasks.GetAt (pos);
ASSERT_VALID (pTask);
return pTask;
}
//******************************************************************************************
BOOL CBCGPTasksPane::GetTaskLocation (CBCGPTask* pTask, int& nGroup, int& nTask) const
{
ASSERT_VALID (pTask);
ASSERT_VALID (pTask->m_pGroup);
nGroup = -1;
nTask = -1;
CBCGPTasksGroup* pGroupToFind = pTask->m_pGroup;
int nGroupCount = 0;
for (POSITION pos = m_lstTaskGroups.GetHeadPosition (); pos != NULL; nGroupCount++)
{
CBCGPTasksGroup* pGroup = (CBCGPTasksGroup*) m_lstTaskGroups.GetNext (pos);
ASSERT_VALID (pGroup);
if (pGroup == pGroupToFind)
{
int nTaskCount = 0;
for (POSITION posTask = pGroup->m_lstTasks.GetHeadPosition (); posTask != NULL; nTaskCount++)
{
CBCGPTask* pCurTask = (CBCGPTask*) pGroup->m_lstTasks.GetNext (posTask);
ASSERT_VALID (pCurTask);
if (pCurTask == pTask)
{
nGroup = nGroupCount;
nTask = nTaskCount;
return TRUE;
}
}
return FALSE;
}
}
return FALSE;
}
//******************************************************************************************
int CBCGPTasksPane::AddWindow (int nGroup, HWND hwndTask, int nWndHeight,
BOOL bAutoDestroyWindow/* = FALSE*/,
DWORD dwUserData/* = 0*/)
{
POSITION pos = m_lstTaskGroups.FindIndex (nGroup);
if (pos == NULL)
{
ASSERT (FALSE);
return -1;
}
ASSERT (::IsWindow (hwndTask));
CBCGPTasksGroup* pGroup = (CBCGPTasksGroup*) m_lstTaskGroups.GetAt (pos);
ASSERT_VALID (pGroup);
pGroup->m_lstTasks.AddTail (new CBCGPTask (
pGroup, _T(""), -1, 0, dwUserData, hwndTask, bAutoDestroyWindow, nWndHeight));
AdjustScroll ();
ReposTasks ();
return pGroup->m_lstTasks.GetCount () - 1;
}
//******************************************************************************************
BOOL CBCGPTasksPane::SetWindowHeight (int nGroup, HWND hwndTask, int nWndHeight)
{
POSITION pos = m_lstTaskGroups.FindIndex (nGroup);
if (pos == NULL)
{
ASSERT (FALSE);
return -1;
}
ASSERT (::IsWindow (hwndTask));
CBCGPTasksGroup* pGroup = (CBCGPTasksGroup*) m_lstTaskGroups.GetAt (pos);
ASSERT_VALID (pGroup);
POSITION pos2 = pGroup->m_lstTasks.GetHeadPosition();
while (pos2 != NULL)
{
CBCGPTask* pTask = (CBCGPTask*) pGroup->m_lstTasks.GetNext(pos2);
if (pTask->m_hwndTask == hwndTask)
{
pTask->m_nWindowHeight = nWndHeight;
if (!pGroup->m_bIsCollapsed)
{
AdjustScroll ();
ReposTasks ();
RedrawWindow (NULL, NULL, RDW_INVALIDATE | RDW_ERASE);
}
return TRUE;
}
}
return FALSE;
}
//******************************************************************************************
BOOL CBCGPTasksPane::SetWindowHeight (HWND hwndTask, int nWndHeight)
{
ASSERT (::IsWindow (hwndTask));
int nGroup, nTask;
if (GetTaskLocation (hwndTask, nGroup, nTask))
{
return SetWindowHeight (nGroup, hwndTask, nWndHeight);
}
return FALSE;
}
//******************************************************************************************
LRESULT CBCGPTasksPane::OnSetFont (WPARAM wParam, LPARAM /*lParam*/)
{
m_hFont = (HFONT) wParam;
CreateFonts ();
AdjustScroll ();
ReposTasks ();
return 0;
}
//******************************************************************************************
LRESULT CBCGPTasksPane::OnGetFont (WPARAM, LPARAM)
{
return (LRESULT) (m_hFont != NULL ? m_hFont : ::GetStockObject (DEFAULT_GUI_FONT));
}
//******************************************************************************************
void CBCGPTasksPane::CreateFonts ()
{
if (m_fontBold.GetSafeHandle () != NULL)
{
m_fontBold.DeleteObject ();
}
if (m_fontBoldUnderline.GetSafeHandle() != NULL)
{
m_fontBoldUnderline.DeleteObject ();
}
if (m_fontUnderline.GetSafeHandle () != NULL)
{
m_fontUnderline.DeleteObject ();
}
CFont* pFont = CFont::FromHandle (
m_hFont != NULL ? m_hFont : (HFONT) ::GetStockObject (DEFAULT_GUI_FONT));
ASSERT_VALID (pFont);
LOGFONT lf;
memset (&lf, 0, sizeof (LOGFONT));
pFont->GetLogFont (&lf);
lf.lfWeight = FW_BOLD;
m_fontBold.CreateFontIndirect (&lf);
lf.lfUnderline = TRUE;
m_fontBoldUnderline.CreateFontIndirect (&lf);
lf.lfWeight = FW_NORMAL;
lf.lfUnderline = TRUE;
m_fontUnderline.CreateFontIndirect (&lf);
}
//******************************************************************************************
void CBCGPTasksPane::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
CWnd::OnSettingChange(uFlags, lpszSection);
AdjustScroll ();
ReposTasks ();
}
//******************************************************************************************
HFONT CBCGPTasksPane::SetFont (CDC* pDC)
{
ASSERT_VALID (pDC);
return (HFONT) ::SelectObject (pDC->GetSafeHdc (),
m_hFont != NULL ? m_hFont : ::GetStockObject (DEFAULT_GUI_FONT));
}
//****************************************************************************************
CBCGPTask* CBCGPTasksPane::TaskHitTest (CPoint pt) const
{
if (!m_rectTasks.PtInRect (pt))
{
return NULL;
}
// ---------------
// Get active page
// ---------------
CBCGPTasksPanePage* pActivePage = NULL;
POSITION posPage = m_lstTasksPanes.FindIndex (m_arrHistoryStack[m_iActivePage]);
ASSERT(posPage != NULL);
pActivePage = (CBCGPTasksPanePage*) m_lstTasksPanes.GetAt (posPage);
ASSERT_VALID(pActivePage);
// -----------------------------
// Test all tasks in active page
// -----------------------------
for (POSITION pos = m_lstTaskGroups.GetHeadPosition (); pos != NULL;)
{
CBCGPTasksGroup* pGroup = (CBCGPTasksGroup*) m_lstTaskGroups.GetNext (pos);
ASSERT_VALID (pGroup);
if (pGroup->m_pPage == pActivePage)
{
for (POSITION posTask = pGroup->m_lstTasks.GetHeadPosition (); posTask != NULL;)
{
CBCGPTask* pTask = (CBCGPTask*) pGroup->m_lstTasks.GetNext (posTask);
ASSERT_VALID (pTask);
if (pTask->m_bVisible && pTask->m_rect.PtInRect (pt))
{
if (pTask->m_uiCommandID != 0) // ignore labels
{
return pTask;
}
}
}
}
}
return NULL;
}
//***************************************************************************************
CBCGPTasksGroup* CBCGPTasksPane::GroupCaptionHitTest (CPoint pt) const
{
if (!m_bCanCollapse)
{
return NULL;
}
if (!m_rectTasks.PtInRect (pt))
{
return NULL;
}
// ---------------
// Get active page
// ---------------
CBCGPTasksPanePage* pActivePage = NULL;
POSITION posPage = m_lstTasksPanes.FindIndex (m_arrHistoryStack[m_iActivePage]);
ASSERT(posPage != NULL);
pActivePage = (CBCGPTasksPanePage*) m_lstTasksPanes.GetAt (posPage);
ASSERT_VALID(pActivePage);
// ------------------------------
// Test all groups in active page
// ------------------------------
for (POSITION pos = m_lstTaskGroups.GetHeadPosition (); pos != NULL;)
{
CBCGPTasksGroup* pGroup = (CBCGPTasksGroup*) m_lstTaskGroups.GetNext (pos);
ASSERT_VALID (pGroup);
if (pGroup->m_pPage == pActivePage)
{
if (pGroup->m_rect.PtInRect (pt))
{
return pGroup;
}
}
}
return NULL;
}
//***************************************************************************************
BOOL CBCGPTasksPane::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
CPoint ptCursor;
::GetCursorPos (&ptCursor);
ScreenToClient (&ptCursor);
CBCGPTask* pTaskHit = TaskHitTest (ptCursor);
if (m_pClickedTask != NULL && m_pClickedTask->m_bEnabled ||
pTaskHit != NULL && pTaskHit->m_bEnabled)
{
::SetCursor (globalData.m_hcurHand);
return TRUE;
}
if (m_bCanCollapse && (m_pClickedGroupCaption != NULL ||
GroupCaptionHitTest (ptCursor) != NULL))
{
::SetCursor (globalData.m_hcurHand);
return TRUE;
}
return CBCGPDockingControlBar::OnSetCursor(pWnd, nHitTest, message);
}
//******************************************************************************************
void CBCGPTasksPane::OnMouseMove(UINT nFlags, CPoint point)
{
CBCGPDockingControlBar::OnMouseMove(nFlags, point);
if (m_bUseScrollButtons)
{
if (m_rectScrollUp.PtInRect (point) && IsScrollUpAvailable ())
{
m_iScrollMode = -1;
InvalidateRect (m_rectScrollUp);
}
else if (m_rectScrollDn.PtInRect (point) && IsScrollDnAvailable ())
{
m_iScrollMode = 1;
InvalidateRect (m_rectScrollDn);
}
else
{
m_iScrollMode = 0;
}
if (m_iScrollMode != 0)
{
SetTimer (iScrollTimerId, m_iScrollTimerDuration, NULL);
return;
}
}
CBCGPTasksGroup* pHotGroup = GroupCaptionHitTest (point);
CBCGPTask* pHotTask = TaskHitTest (point);
// ----------
// No changes
// ----------
if (m_pHotTask == pHotTask && m_pHotGroupCaption == pHotGroup)
{
return;
}
// ----------------
// No new hot areas
// ----------------
if (pHotTask == NULL && pHotGroup == NULL)
{
if (m_pHotGroupCaption != NULL)
{
// remove old group caption hotlight
CRect rectUpdate = m_pHotGroupCaption->m_rect;
m_pHotGroupCaption = NULL;
if (m_pClickedGroupCaption == NULL)
{
ReleaseCapture ();
}
RedrawWindow (rectUpdate, NULL, RDW_INVALIDATE | RDW_ERASE);
}
if (m_pHotTask != NULL)
{
// remove old task hotlight
CRect rectUpdate = m_pHotTask->m_rect;
m_pHotTask = NULL;
if (m_pClickedTask == NULL)
{
ReleaseCapture ();
}
RedrawWindow (rectUpdate, NULL, RDW_INVALIDATE | RDW_ERASE);
}
GetOwner()->SendMessage (WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);
return;
}
// ---------------------
// New hot group caption
// ---------------------
if (pHotGroup != NULL)
{
if (m_pHotGroupCaption == NULL)
{
if (GetCapture () != NULL)
{
return;
}
SetCapture ();
}
else
{
// remove old group caption hotlight
CRect rectTask = m_pHotGroupCaption->m_rect;
m_pHotGroupCaption = NULL;
RedrawWindow (rectTask, NULL, RDW_INVALIDATE | RDW_ERASE);
}
// remove old task hotlight
if (m_pHotTask != NULL)
{
CRect rectUpdate = m_pHotTask->m_rect;
m_pHotTask = NULL;
RedrawWindow (rectUpdate, NULL, RDW_INVALIDATE | RDW_ERASE);
}
// add new group caption hotlight
m_pHotGroupCaption = pHotGroup;
RedrawWindow (pHotGroup->m_rect, NULL, RDW_INVALIDATE | RDW_ERASE);
}
// ------------
// New hot task
// ------------
else if (pHotTask != NULL)
{
if (!pHotTask->m_bEnabled)
{
GetOwner()->SendMessage (WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);
return;
}
if (m_pHotTask == NULL)
{
if (GetCapture () != NULL)
{
return;
}
SetCapture ();
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -