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

📄 slistview.cpp

📁 股票软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	if (bInTrade)
	{
		// 预警系统所需股票行情刷新
		CAlarmCondContainer& conds = AfxGetProfile().GetAlarmCondContainer();
		CStockContainer stocks;
		stocks.SetSize(0, conds.GetSize() + 5);
		for (int i = 0; i < conds.GetSize(); i++)
		{
			ALARMCOND cond = conds.GetAt(i);
			CStockInfo info;
			if (AfxGetStockContainer().GetStockInfo(cond.m_szCode, &info))
				stocks.Add(info);
		}
		CStockInfo infoMain, infoMainSzn;
		if (AfxGetStockContainer().GetStockInfo(STKLIB_CODE_MAIN, &infoMain)
			&& AfxGetStockContainer().GetStockInfo(STKLIB_CODE_MAINSZN, &infoMainSzn))
		{
			stocks.Add(infoMain);
			stocks.Add(infoMainSzn);
		}

		//  行情QuoteTip 需要行情数据
		if (!bQuoteTipSended)
		{
			CStockContainer & container = AfxGetStockContainer();
			container.Lock();
			for (int i=0; i<9 && i<container.GetSize(); i++)
				stocks.Add(container.ElementAt(i));
			container.UnLock();
		}

		if (stocks.GetSize() > 0)
			AfxGetStkReceiver().RequestStockData(CStock::dataReport, stocks.GetData(), stocks.GetSize(), 0, 0);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CSListView overrides

BOOL CSListView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	if (::IsWindow(m_Grid.GetSafeHwnd()))
		if (m_Grid.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
			return TRUE;

	return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

int CALLBACK ItemCompareFunc(LPARAM lParam1, LPARAM lParam2, 
	LPARAM lParamSort)
{
	if (lParam1 < 0 && lParam2 < 0)
		return 0;
	if (lParam1 < 0)
		return 1;
	if (lParam2 < 0)
		return -1;
	
	lParam1 = ((CGridCellBase *)lParam1)->GetData();
	lParam2 = ((CGridCellBase *)lParam2)->GetData();

	CStockContainer	& container = AfxGetStockContainer();
	if (lParam1 >= container.GetSize() || lParam2 >= container.GetSize())
	{
		ASSERT(FALSE);
		return 0;
	}
	CStockInfo &s1 = container.ElementAt(lParam1);
	CStockInfo &s2 = container.ElementAt(lParam2);
	return CStockContainer::SortFunction(&s1, &s2);
}

BOOL CSListView::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class

	if (m_Grid.GetSafeHwnd() == pMsg->hwnd)
	{
		if (WM_LBUTTONDBLCLK == pMsg->message
			|| (WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam))
		{
			int	nColumnCount	=	m_Grid.GetColumnCount();
			int	nRowCount		=	m_Grid.GetRowCount();
			if (nColumnCount <=0 || nRowCount <= 0)
				return CView::PreTranslateMessage(pMsg);
			CRect	rectCell;
			m_Grid.GetCellRect(0,0,&rectCell);
			CPoint	pt	=	pMsg->pt;
			::ScreenToClient(m_Grid.GetSafeHwnd(), &pt);
			if (pt.y >= rectCell.top && pt.y < rectCell.bottom)
				return CView::PreTranslateMessage(pMsg);

			int	nSelRow	=	m_Grid.GetFocusCell().row;
			if (nSelRow >= 1 && nSelRow < m_Grid.GetRowCount())
			{
				int	id	=	m_Grid.GetItemData(nSelRow,0);
				OnDblclkItem(id);
			}
		}
		else if (WM_LBUTTONUP == pMsg->message)
		{
			int	nColumnCount	=	m_Grid.GetColumnCount();
			int	nRowCount		=	m_Grid.GetRowCount();
			if (nColumnCount <=0 || nRowCount <= 0)
				return CView::PreTranslateMessage(pMsg);
			CRect	rectCell;
			m_Grid.GetCellRect(0,0,&rectCell);
			CPoint	pt	=	pMsg->pt;
			::ScreenToClient(m_Grid.GetSafeHwnd(), &pt);
			if (pt.y < rectCell.top || pt.y >= rectCell.bottom)
				return CView::PreTranslateMessage(pMsg);

			CCellID	cell	=	m_Grid.GetFocusCell();
			if (cell.col >=0 && cell.col < nColumnCount)
			{
				BOOL	bSortAscendNew	=	(m_nColSort == cell.col ? !m_bSortAscend : FALSE);

				m_nColSort		=	cell.col;
				m_bSortAscend	=	bSortAscendNew;

				LPARAM	lParam	=	m_Grid.GetItemData(0, cell.col);
				if (lParam >= 0)
				{
					CStockContainer & container = AfxGetStockContainer();
					container.Lock();
					//if (container.Sort(lParam, m_bSortAscend))
					//	OnUpdate(NULL, UPDATE_HINT_SLISTVIEW, NULL);
					CStockContainer::m_pSortContainer	=	&container;
					container.m_nSortVariantID	=	lParam;
					container.m_bSortAscend		=	m_bSortAscend;
					m_Grid.SortItems(ItemCompareFunc, m_nColSort, 0, m_bSortAscend);
					container.UnLock();
				}
				m_Grid.Invalidate();
				return 0;
			}
		}
	}
	
	return CView::PreTranslateMessage(pMsg);
}

void CSListView::OnDraw(CDC* pDC)
{
	CView::OnDraw(pDC);
}


/////////////////////////////////////////////////////////////////////////////
// CSListView message handlers

int CSListView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// Create GridCtrl
	CRect rect;
	GetClientRect(rect);
	if (!m_Grid.Create(rect, this, IDC_SLISTVIEW_GRID, WS_CHILD|WS_BORDER|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL))
	{
		TRACE("CSListView::OnCreate(...), Create m_Grid Error.\n");
		return -1;
	}

	// fill it up with stuff
	m_Grid.SetEditable(FALSE);
	m_Grid.SetListMode(TRUE);
	m_Grid.SetHeaderSort(FALSE); 
	m_Grid.SetSingleRowSelection(FALSE);
	m_Grid.EnableDragAndDrop(FALSE);
	m_Grid.SetGridLines(GVL_NONE);
	m_Grid.EnableTitleTips(FALSE);
	m_Grid.SetRowResize(TRUE);
	m_Grid.SetColumnResize(TRUE);
	m_Grid.AllowSelectRowInFixedCol(TRUE);
	m_Grid.SetFrameFocusCell(FALSE);

	m_Grid.SetBkColor(AfxGetProfile().GetColor(CColorClass::clrSListBK));
	m_Grid.SetTextBkColor(AfxGetProfile().GetColor(CColorClass::clrSListBK));

	COLORREF clr0 = RGB(153,153,204);
	COLORREF clr = AfxGetProfile().GetColor(CColorClass::clrSListSelected);
	m_Grid.SetSelectedBkColor(AfxGetProfile().GetColor(CColorClass::clrSListSelected));

	COLORREF clr1 = m_Grid.GetSelectedBkColor();

	m_Grid.SetOuterHScrollBar(TRUE, GetSafeHwnd());

	LOGFONT lf;
	memset(&lf, 0, sizeof(lf));
	AfxGetProfile().GetFontSListView(&lf);
	SetFont(&lf);

	ResetColumns();

	// 实时行情刷新
	AfxGetStkReceiver().AddRcvDataWnd(GetSafeHwnd());

	SetTimer(SLV_TIMER_REFRESH, 20000, NULL);

	// 股票行情接收
	AfxGetStkReceiver().CreateReceiver(this);
	AfxGetStkReceiver().EngineBeginWorking(TRUE);

	return 0;
}

void CSListView::OnDestroy() 
{
	// 停止行情刷新通知消息
	AfxGetStkReceiver().RemoveRcvDataWnd(GetSafeHwnd());
	KillTimer(SLV_TIMER_REFRESH);

	StoreColumnOrderArray();

	AfxGetStkReceiver().EngineEndWorking();

	CView::OnDestroy();
}

void CSListView::OnTimer(UINT nIDEvent) 
{
	if (SLV_TIMER_REFRESH == nIDEvent)
	{
		SendRequestQuote(FALSE);
	}
	
	CView::OnTimer(nIDEvent);
}

LRESULT CSListView::OnGetViewTitle(WPARAM wParam, LPARAM lParam)
{
	CString	strTitle = "股票列表";

	lstrcpyn((LPTSTR)lParam, (LPCTSTR)strTitle, wParam);
	if ((int)wParam > strTitle.GetLength())
		wParam = strTitle.GetLength();
	return wParam;
}

LRESULT CSListView::OnColorChange(WPARAM wParam, LPARAM lParam)
{
	m_Grid.SetBkColor(AfxGetProfile().GetColor(CColorClass::clrSListBK));
	m_Grid.SetTextBkColor(AfxGetProfile().GetColor(CColorClass::clrSListBK));
	m_Grid.SetSelectedBkColor(AfxGetProfile().GetColor(CColorClass::clrSListSelected));

	return 0L;
}

LRESULT CSListView::OnStkReceiverData(WPARAM wParam, LPARAM lParam)
{
	PCOMMPACKET	pCommPacket	=	(PCOMMPACKET)lParam;

	switch(wParam)
	{
	case CStock::dataReport:
		if (pCommPacket && CStock::dataReport == pCommPacket->m_dwDataType 
			&& pCommPacket->m_dwCount > 0)
		{
			CStockContainer & container = AfxGetStockContainer();
			// 如果当前股票列表显示的日期不是今天的,返回,不做刷新
			DWORD	dwDate = -1;;
			AfxGetStockContainer().GetCurrentType(NULL,NULL,&dwDate);
			if (-1 != dwDate && dwDate != CSPTime(pCommPacket->m_pReport[0].m_time).ToStockTimeDay())
				return 0L;

			container.Lock();

			// 刷新数据
			BOOL	bNeedReSort	=	FALSE;
			for (DWORD i=0; i<pCommPacket->m_dwCount; i++)
			{
				int	id = 0;
				if (container.GetStockInfo(pCommPacket->m_pReport[i].m_szCode, NULL, &id))
				{
					CStockInfo	& info	=	container.ElementAt(id);
					UpdateStockInfoByREPORT(info, &(pCommPacket->m_pReport[i]));
					StockInfoChanged(id, info);
					bNeedReSort	=	TRUE;
				}
			}

			// 统计平均值刷新
			if (bNeedReSort)
			{
				container.SetAverage();
			}

			// 重新排序
			if (-1 != m_nColSort && bNeedReSort)
			{
				LPARAM	lParam	=	m_Grid.GetItemData(0, m_nColSort);
				if (lParam >= 0)
				{
					CStockContainer::m_pSortContainer	=	&container;
					container.m_nSortVariantID	=	lParam;
					container.m_bSortAscend		=	m_bSortAscend;					
					m_Grid.SortItems(ItemCompareFunc, m_nColSort, 0, m_Grid.GetSortAscending());
				}
			}
			container.UnLock();

			m_Grid.Invalidate();
		}
		break;
	}
	return 0L;
}

BOOL CSListView::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
}

void CSListView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);

	CRect rect;
	GetClientRect(rect);

	if (::IsWindow(m_Grid.GetSafeHwnd()))
	{
		m_Grid.MoveWindow(0, 0, cx, cy);
		m_Grid.Invalidate();
		m_Grid.UpdateWindow();
	}
}

void CSListView::OnSetFocus(CWnd* pOldWnd) 
{
	CView::OnSetFocus(pOldWnd);

	if(m_Grid.GetSafeHwnd() == NULL) return;

	m_Grid.SetFocus();
	if (!m_Grid.GetFocusCell().IsValid()
		&& m_Grid.GetRowCount() > 1 && m_Grid.GetColumnCount() > 1)
	{
		m_Grid.SetFocusCell(1, 1);
		for (int nCol = 0; nCol < m_Grid.GetColumnCount(); nCol++)
			m_Grid.SetItemState(1, nCol, m_Grid.GetItemState(1, nCol) | GVIS_SELECTED);
	}
}

void CSListView::OnLButtonDown(UINT nFlags, CPoint point)
{
	SetFocus();

	Invalidate();

	CView::OnLButtonDown(nFlags, point);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -