用virtual list显示网络数据,即时更新问题?

xiaopan 2011-12-28 12:53:48
我现在做的是网络数据,通过socket传送和接收,就是这个实时更新问题没有解决。
因为一条数据过来后,要在item里面显示,然后在该位置闪烁一下或者是颜色变化一下,提示客户,
类似股票那种功能,不知道兄弟们有没好的办法?
...全文
195 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaopan 2012-01-04
  • 打赏
  • 举报
回复
经过研究,直接在数据结构体内用两个数据,一个用来保存旧的数据,一个用来保存最新的数据,然后比较大小,大的话,把背景画成红色,小的则画成绿色。
谢谢各位的帮忙。
xiaopan 2012-01-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ndy_w 的回复:]
引用 9 楼 xiaopan 的回复:
我的内存数据已经更新,但是界面上的数据怎么没有更改?就是说,没有同步。我的Item也是自绘的,
drawitem,兄弟能……

RedrawItems
[/Quote]

经过测试,数据已经在ongetdispinfo里面更新,然后我在drawitem里面画数据,界面也更新了。还有个功能不知道怎么实现,就是要把更新的那个数据项目在对应的item/subitem里面闪烁一下,或者背景颜色改变一下,不知道怎么实现。如果用OnNMCustomdrawList,没有反映,因为drawitem的话,OnNMCustomdrawList是响应不到的。由此可以确定,如果用drawitem,OnNMCustomdrawList不能响应,各位看看有没有高招??
ndy_w 2011-12-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaopan 的回复:]
我的内存数据已经更新,但是界面上的数据怎么没有更改?就是说,没有同步。我的Item也是自绘的,
drawitem,兄弟能……
[/Quote]
RedrawItems
xiaopan 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ndy_w 的回复:]
要用虚表的话,你内存里必须要有数据结构来记录内容。
收到数据->更新内存数据->重画相应的item。
动画效果用定时器。可能多个item同时更新,状态需要记录在你的内存数据结构里。
改变颜色用customdraw最简单。
[/Quote]

我的内存数据已经更新,但是界面上的数据怎么没有更改?就是说,没有同步。我的Item也是自绘的,
drawitem,兄弟能否说详细点呢?
xiaopan 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 visualeleven 的回复:]
起一个定时器,SetItemState();

C/C++ code


void CXXDlg::OnOK()
{
// TODO: Add extra validation here

m_list.SetFocus();

SetTimer(1, 500, NULL);
}

void CXXDlg::OnTimer(UINT n……
[/Quote]

老大,我是用的结构体保存数据和更新状态,然后自画drawitem,怎么样实现动态更新的效果出来呢??
Eleven 2011-12-29
  • 打赏
  • 举报
回复
起一个定时器,SetItemState();

void CXXDlg::OnOK()
{
// TODO: Add extra validation here

m_list.SetFocus();

SetTimer(1, 500, NULL);
}

void CXXDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(1 == nIDEvent)
{
if(m_list.GetSafeHwnd())
{
m_list.SetItemState(5, (LVIS_SELECTED == m_list.GetItemState(5, LVIS_SELECTED)) ? 0 : LVIS_SELECTED, LVIS_SELECTED);
static int nCount = 0;
#define MAX_FLASH_COUNT 5
if(++nCount >= MAX_FLASH_COUNT)
{
KillTimer(1);
m_list.SetItemState(5, LVIS_SELECTED, LVIS_SELECTED);
}
}
}
CDialog::OnTimer(nIDEvent);
}
xiaopan 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ndy_w 的回复:]
要用虚表的话,你内存里必须要有数据结构来记录内容。
收到数据->更新内存数据->重画相应的item。
动画效果用定时器。可能多个item同时更新,状态需要记录在你的内存数据结构里。
改变颜色用customdraw最简单。
[/Quote]
请教一下,如何重画相应的item?
xiaopan 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yu52000guang 的回复:]
为何发两次。。。。。。。。。
每个item设置一个标志位
响应Customdraw

void CPackViewerDlg::OnNMCustomdrawList(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

*p……
[/Quote]
按照兄弟的做法,你的FILE_NEW就是标志,然后定时器只要不停的更新FILE_NEW标志即可吧??
xiaopan 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yu52000guang 的回复:]
为何发两次。。。。。。。。。
每个item设置一个标志位
响应Customdraw

void CPackViewerDlg::OnNMCustomdrawList(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

*p……
[/Quote]
因为csdn发了之后找不到,就多发了一次,呵呵
ndy_w 2011-12-29
  • 打赏
  • 举报
回复
要用虚表的话,你内存里必须要有数据结构来记录内容。
收到数据->更新内存数据->重画相应的item。
动画效果用定时器。可能多个item同时更新,状态需要记录在你的内存数据结构里。
改变颜色用customdraw最简单。
xiaopan 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 visualeleven 的回复:]
起一个定时器,SetItemState();

C/C++ code


void CXXDlg::OnOK()
{
// TODO: Add extra validation here

m_list.SetFocus();

SetTimer(1, 500, NULL);
}

void CXXDlg::OnTimer(UINT n……
[/Quote]

部长,我现在的需求是:服务端采用全推的方式,先把总的数据发送过来,然后在发送更新的数据,我在客户端用cclistctrl显示,现在采用的是virtual list,总的数据显示是没有问题,更新的数据在我的数据结构体内也更新了(这个可以跟踪到),但是就是显示不出来,不知道部长有什么高招没有?多谢了
Icer 2011-12-28
  • 打赏
  • 举报
回复
为何发两次。。。。。。。。。
每个item设置一个标志位
响应Customdraw

void CPackViewerDlg::OnNMCustomdrawList(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

*pResult = CDRF_DODEFAULT;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
{
COLORREF clrNewTextColor, clrNewBkColor;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
// 这里是取我自己的虚列表数据,判断一下Item的状态改变颜色
CPackFile* pFile = m_Filter[nItem];
if(pFile->GetType() == CPackFile::FILE_NEW)
{
clrNewTextColor = RGB(0,0,255);
clrNewBkColor = RGB(255,255,255);
}
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;

*pResult = CDRF_DODEFAULT;
}
}
要控制颜色时间,做个定时器去掉标志就好了。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧