📄 slistview.cpp
字号:
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 + -