嗅探结果列表(续)
对ListControl控件进行初始化函数,代码如下:
void CSerialPort01Dlg::InitMyListControl( CListCtrl &m_ctrl )
{
CRect size_of_list;
int time_width = 80;
int num_width = 50;
m_ctrl.GetWindowRect(size_of_list); //获取 ListControl控件的尺寸
m_ctrl.InsertColumn(0,"Time",LVCFMT_LEFT,time_width,-1); //设置第一列为时间,宽度100
m_ctrl.InsertColumn(1,"NO.",LVCFMT_CENTER,num_width,-1);
m_ctrl.InsertColumn(2,"Command",LVCFMT_CENTER,size_of_list.right-size_of_list.left-time_width-num_width,-1);//设置第二列为命令内容,宽度为余下的全部
}
(由于这里我的工程叫做SerialPort01,所以类名如上)
利用该函数将两个ListControl全部初始化,函数执行放在:
BOOL CSerialPort01Dlg::OnInitDialog()
当中,初始化结果是:
进一步的,向这个ListControl当中添加内容!
ListControl 添加内容
这部分涉及到几个事儿:
- 如何将指定内容顺次填写到ListControl当中 [1]
- 如何生成当前系统时间 [2] [3]
- 怎样在收到上位、下位机串口信息的时候准确确定时间
将系统时间与特定字符串填写至 ListControl 中的代码如下:
void CSerialPort01Dlg::InsertTextToMyList( CListCtrl &m_ctrl, CString command, int row)
{
// CTime my_time = CTime::GetCurrentTime(); //获取时间
// CString current_time = my_time.Format("%H:%M:%S"); //显示时间
CString current_time;
GetLocalTime(&time_more_precise);
current_time.Format("%d:%d:%d:%d",time_more_precise.wHour,time_more_precise.wMinute,time_more_precise.wSecond,time_more_precise.wMilliseconds);
m_ctrl.InsertItem(row-1,current_time); //显示时间
current_time.Format("%d",row); // 显示序号
m_ctrl.SetItemText(row-1,1,current_time); // 显示序号
m_ctrl.SetItemText(row-1,2,command); // 显示内容
}
由于CTime只能精确到秒,所以采用了更加精确的一种方法进行系统时间的获取
将这个函数放在接收消息响应函数:
LONG CSerialPort01Dlg::OnCommunication( WPARAM ch, LPARAM port )
当中,就可以在接收到特定程序或者硬件的串口内容之后,将它们反映在不同的ListControl当中
具体代码参照[3]中的内容,编写如下:
LONG CSerialPort01Dlg::OnCommunication( WPARAM ch, LPARAM port )
{
//////////////////////////////////////////////////////////////////////////
// 接收后处理
CString received_char;
received_char.Format("0x%x",ch);
// 端口分开
switch (port)//这个port是硬件中的端口编号
// port1: com1,本机物理端口,对应的变量是 m_comm_Port[1]
// port2: com2, 本机虚拟端口,对应的变量是 m_comm_Port[0]
{
case 1://物理端口
// 收到物理端口的内容之后,转手发送到虚拟端口
send_up_buffer.Format("%c",(char)ch);
m_comm_Port[0].WriteToPort(send_up_buffer,send_up_buffer.GetLength());
InsertTextToMyList(m_ctrl_listbox_down,received_char,++row_down_sent);
break;
case 2://虚拟端口
//////////////////////////////////////////////////////////////////////////
// 收到虚拟端口的内容之后,转手发送到物理端口
send_down_buffer.Format("%c",(char)ch);
m_comm_Port[1].WriteToPort(send_down_buffer,send_down_buffer.GetLength());
InsertTextToMyList(m_ctrl_listbox_up,received_char,++row_up_sent);
//////////////////////////////////////////////////////////////////////////
break;
}
//////////////////////////////////////////////////////////////////////////
return 0;
}
至此全部的功能实现完毕。
参考
[1] 一步一步学List Control控件的用法(第二步)—-创建第一行
CTime类及其变量使用
[2] Ctime时间类的相关用法
[3] 请问怎么取得系统的时间,要精确到毫秒,CTime只能精确到秒