⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcgptaskspane.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

		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 + -