实例介绍
【实例简介】支持IEC104\IEC101\MODBUS规约,支持tcpserver、tcpclient、串口通信
【实例截图】
【实例截图】
【核心代码】
// MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "MaintTool.h" #include "MainFrm.h" #include "MaintToolDoc.h" #include "MaintToolView.h" //////////////// #include "YXData.h" #include "YCData.h" #include "YMData.h" #include "YKData.h" #include "SETData.h" #include "SettingCmmDlg.h" #include "SettingPrtDlg.h" #include "DataMonitorDlg.h" ///////////////// #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_SET_CMMPORT, OnSetCmmPort) ON_COMMAND(ID_SET_PROTOCOL, OnSetProtocol) ON_COMMAND(ID_COMMAND_CONCMM, OnConnectCmm) ON_COMMAND(ID_COMMAND_DISCONCMM, OnDisconncmm) ON_COMMAND(ID_COMMAND_DATAMONITOR, OnDataMonitor) ON_UPDATE_COMMAND_UI(ID_COMMAND_CONCMM, OnUpdateConcmm) ON_UPDATE_COMMAND_UI(ID_COMMAND_DISCONCMM, OnUpdateDisconcmm) ON_WM_CLOSE() ON_COMMAND(ID_VIEW_DATA, OnViewData) ON_COMMAND(ID_VIEW_MESSAGE, OnViewMessage) ON_UPDATE_COMMAND_UI(ID_VIEW_DATA, OnUpdateViewData) ON_UPDATE_COMMAND_UI(ID_VIEW_MESSAGE, OnUpdateViewMessage) ON_COMMAND(ID_COMMAND_PAUSE_DSP, OnPauseDsp) ON_COMMAND(ID_COMMAND_REFLASH_DSP, OnReflashDsp) ON_UPDATE_COMMAND_UI(ID_COMMAND_PAUSE_DSP, OnUpdatePauseDsp) ON_UPDATE_COMMAND_UI(ID_COMMAND_REFLASH_DSP, OnUpdateReflashDsp) ON_COMMAND(ID_COMMAND_CLEAR_DSP, OnClearDsp) ON_WM_SIZE() //}}AFX_MSG_MAP END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { IsCmmConnect = false; IsReflashMsg = true; IsFrameCreat = false; } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_TOOLBAR), //加载IDB_TOOLBAR IMAGE_BITMAP, //按位图格式 0,0, // cx,cy LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS ); HBITMAP hbm2 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_GRAYTOOLBAR), //加载IDB_TOOLBAR IMAGE_BITMAP, //按位图格式 0,0, // cx,cy LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS ); CBitmap bm,bm2; bm.Attach(hbm); bm2.Attach(hbm2); m_ToolBar.Create(24,24,ILC_COLOR16, 12, 0); m_ToolBar.Add(&bm,(CBitmap*)NULL); m_GrayToolBar.Create(24,24,ILC_COLOR16, 12, 0); m_GrayToolBar.Add(&bm2,(CBitmap*)NULL); if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ToolBar); m_wndToolBar.GetToolBarCtrl().SetDisabledImageList(&m_GrayToolBar); if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable //m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); //EnableDocking(CBRS_ALIGN_ANY); //DockControlBar(&m_wndToolBar); /////////////////// if (!m_wndMyBar1.Create(_T("数字显示窗口"), this, CSize(500,360),TRUE,123)) { TRACE0("Failed to create mybar\n"); return -1; } if (!m_wndMyBar2.Create(_T("信息提示窗口"), this,CSize(300,300),TRUE,124)) { TRACE0("Failed to create mybar\n"); return -1; } ////////////////////////////////////// m_wndToolBar.SetButtonText(0,"打开"); m_wndToolBar.SetButtonText(1,"保存"); m_wndToolBar.SetButtonText(3,"规约"); m_wndToolBar.SetButtonText(4,"端口"); m_wndToolBar.SetButtonText(6,"连接"); m_wndToolBar.SetButtonText(7,"断开"); m_wndToolBar.SetButtonText(9,"数据"); m_wndToolBar.SetButtonText(10,"消息"); m_wndToolBar.SetButtonText(12,"暂停"); m_wndToolBar.SetButtonText(13,"刷新"); m_wndToolBar.SetButtonText(14,"清空"); m_wndToolBar.SetButtonText(16,"关于"); /////////////调整工具条///////////////// CRect rc(0, 0, 0, 0); CSize sizeMax(0, 0); CToolBarCtrl& bar = m_wndToolBar.GetToolBarCtrl(); for (int nIndex = bar.GetButtonCount() - 1; nIndex >= 0; nIndex--) { bar.GetItemRect(nIndex, rc); rc.NormalizeRect(); sizeMax.cx = __max(rc.Size().cx, sizeMax.cx); sizeMax.cy = __max(rc.Size().cy, sizeMax.cy); } m_wndToolBar.SetSizes(sizeMax, CSize(24,24)); ////////////创建TAB Control,并把它加入到ControlBar中 /// 需要注意的是:同一个ControlBar只能加入一个"一级子窗口" m_TabCtrl.Create(TCS_DOWN|WS_CHILD|WS_VISIBLE,CRect(0,0,100,100),&m_wndMyBar1,125); m_TabCtrl.AddPage(RUNTIME_CLASS(CYXData),IDD_YXDATA,"遥信",IDI_ICON_yx); m_TabCtrl.AddPage(RUNTIME_CLASS(CYCData),IDD_YCDATA,"遥测",IDI_ICON_yc); m_TabCtrl.AddPage(RUNTIME_CLASS(CYMData),IDD_YMDATA,"遥脉",IDI_ICON_ym); m_TabCtrl.AddPage(RUNTIME_CLASS(CYKData),IDD_YKDATA,"遥控",IDI_ICON_yk); m_TabCtrl.AddPage(RUNTIME_CLASS(CSETData),IDD_SETDATA,"设定",IDI_ICON_yk); m_TabCtrl.UpdateWindow(); ////////////创建LIST Control,并把它加入到ControlBar中LVS_REPORT m_MsgList.Create(WS_THICKFRAME | WS_VSCROLL | WS_CHILD | WS_VISIBLE | LVS_REPORT,CRect(0,0,0,0),&m_wndMyBar2,126); DWORD styles = m_MsgList.GetExtendedStyle(); m_MsgList.SetExtendedStyle(styles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //整行选择和网格条纹 LVCOLUMN column[4]; int i; for (i=0; i<4; i ) { column[i].mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER; column[i].fmt = LVCFMT_LEFT; column[i].iSubItem = i; column[i].iOrder = i; } column[0].pszText = "名称"; column[1].pszText = "类型"; column[2].pszText = "时间"; column[3].pszText = "状态"; column[0].cx = 300; column[1].cx = 100; column[2].cx = 200; column[3].cx = 200; for (i=0; i<4; i ) m_MsgList.InsertColumn(i, column i); ///////////////两个WNDBAR的停靠控制/////////////////// m_wndMyBar1.SetBarStyle(m_wndMyBar1.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndMyBar2.SetBarStyle(m_wndMyBar2.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); //使工具栏可停靠 m_wndMyBar1.EnableDocking(CBRS_ALIGN_ANY); m_wndMyBar2.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); //3个工具栏停靠方式 DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_LEFT); DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM); /////////使浮动与停靠显示相同的头部//// #ifdef _SCB_REPLACE_MINIFRAME m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd); #endif //_SCB_REPLACE_MINIFRAME /////////////////// IsFrameCreat = true; return 0; } void CMainFrame::ListInsertEpdSoe(BYTE type, WORD dot, BYTE status, SOE_TIME *ptime) //显示SOE,EPD { int nRow; char ss[64]; CTime time = CTime::GetCurrentTime(); sprintf(ss, "遥信%d", dot); nRow = m_MsgList.InsertItem(0, ss);//插入行 if(type == EPD) { m_MsgList.SetItemText(nRow, 1, "COS(单点)");// sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d", time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond()); m_MsgList.SetItemText(nRow, 2, ss); } else if(type == EPD2) { m_MsgList.SetItemText(nRow, 1, "COS(双点)");// sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d", time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond()); m_MsgList.SetItemText(nRow, 2, ss); } else if(type == SOE) { m_MsgList.SetItemText(nRow, 1, "SOE(单点)");// sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d.%03d", ptime->year 2000, ptime->month, ptime->day, ptime->hour, ptime->minute, (ptime->msh*256 ptime->msl)/1000, (ptime->msh*256 ptime->msl)%1000); m_MsgList.SetItemText(nRow, 2, ss); } else if(type == SOE2) { m_MsgList.SetItemText(nRow, 1, "SOE(双点)");// sprintf(ss,"%04d-%02d-%02d %02d:%02d:%02d.%03d", ptime->year 2000, ptime->month, ptime->day, ptime->hour, ptime->minute, (ptime->msh*256 ptime->msl)/1000, (ptime->msh*256 ptime->msl)%1000); m_MsgList.SetItemText(nRow, 2, ss); } sprintf(ss, "%d", status); m_MsgList.SetItemText(nRow, 3, ss);//设置数据 } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers void CMainFrame::OnSetCmmPort() { SetCmmPort(); } void CMainFrame::OnDataMonitor() { CDataMonitorDlg DMDlg; if (DMDlg.DoModal()==IDOK) { } } void CMainFrame::OnSetProtocol() { CSettingPrtDlg PrtDlg; if (PrtDlg.DoModal()==IDOK) // TODO: 保存通讯对话框设置的参数 { CMaintToolDoc* pDoc; pDoc = (CMaintToolDoc*)GetActiveDocument(); ASSERT_VALID(pDoc); switch (PrtDlg.m_PrtType) //选中通讯规约 { case 0: pDoc->m_PrtType = pDoc->IEC104_M; pDoc->m_MasterFlag = true; break; case 1: pDoc->m_PrtType = pDoc->IEC101_M; pDoc->m_MasterFlag = true; break; case 2: pDoc->m_PrtType = pDoc->IEC101_S; pDoc->m_MasterFlag = false; break; case 3: pDoc->m_PrtType = pDoc->Modbus_M; pDoc->m_MasterFlag = true; break; case 4: pDoc->m_PrtType = pDoc->Modbus_S; pDoc->m_MasterFlag = false; break; default: pDoc->m_PrtType = pDoc->IEC104_M; pDoc->m_MasterFlag = true; break; } //信息体寄存器地址、数量情况 pDoc->m_YXAddr = PrtDlg.m_YXAddr; pDoc->m_YCAddr = PrtDlg.m_YCAddr; pDoc->m_YMAddr = PrtDlg.m_YMAddr; pDoc->m_YXNum = PrtDlg.m_YXNum; pDoc->m_YCNum = PrtDlg.m_YCNum; pDoc->m_YMNum = PrtDlg.m_YMNum; pDoc->m_PrtIEC101.m_CallInterval = PrtDlg.m_IEC101CallInterval; pDoc->m_PrtIEC101.m_CallYMInterval = PrtDlg.m_IEC101CallYMInterval; pDoc->m_PrtIEC101.m_SyncTimeInterval = PrtDlg.m_IEC101SyncTimeInterval; pDoc->m_PrtIEC101.m_CheckCallYMEn = PrtDlg.m_ctrlCheckCallYM; pDoc->m_PrtIEC101.m_SyncTimeEn = PrtDlg.m_ctrlCheckTime; pDoc->m_CallIntvs = PrtDlg.m_CallIntvs; //if ((pDoc->m_PrtType == pDoc->IEC101_M) || (pDoc->m_PrtType == pDoc->IEC101_S)) {//保存IEC101规约参数 pDoc->m_PrtIEC101.m_Addr = PrtDlg.m_IEC101Addr; pDoc->m_PrtIEC104.m_Addr = PrtDlg.m_IEC101Addr; pDoc->m_PrtIEC101.m_CauseOfTranLen = PrtDlg.m_IEC101CauseLen; pDoc->m_PrtIEC101.m_CommAddrLen = PrtDlg.m_IEC101ASDULen; pDoc->m_PrtIEC101.m_MsgAddrLen = PrtDlg.m_IEC101MsgLen; } //else {//保存MODBUS规约参数 pDoc->m_PrtModbus.m_Addr = PrtDlg.m_ModbusAddr; pDoc->m_PrtModbus.m_CallIntv = PrtDlg.m_ModbusCallInt; pDoc->m_PrtModbus.m_YXFunc = PrtDlg.m_ModbusYXFunc; pDoc->m_PrtModbus.m_YCFunc = PrtDlg.m_ModbusYCFunc; pDoc->m_PrtModbus.m_YCSize = PrtDlg.m_ModbusYCSize; } pDoc->NewStackAddr(); //生成实时库空间 DrawGrid(); //绘制电子表格 if (pDoc->m_pYXData != NULL) UpdateYXGrid(); if (pDoc->m_pYCData != NULL) UpdateYCGrid(); if (pDoc->m_pYMData != NULL) UpdateYMGrid(); } } void CMainFrame::OnConnectCmm() { CMaintToolDoc* pDoc = (CMaintToolDoc*)GetActiveDocument(); //文档指针 主框架类函数; CMaintToolView* pView = (CMaintToolView*)GetActiveView(); //视图指针; // OnDisconncmm(); if (pDoc->m_PrtType == pDoc->Blank) //若协议为空,先选中可用协议 OnSetProtocol(); if (pDoc->m_PrtType == pDoc->Blank) //如协议对话框中,按‘取消’,仍未选中协议 { AfxMessageBox("请先选择/设置通讯协议"); return; } if(pDoc->m_PrtType == pDoc->IEC104_M) { pView->m_pPrtObj = &(pDoc->m_PrtIEC104); //协议对象指向IEC101协议 } else if ( (pDoc->m_PrtType == pDoc->IEC101_M) || ((pDoc->m_PrtType == pDoc->IEC101_S)) ) { pView->m_pPrtObj = &(pDoc->m_PrtIEC101); //协议对象指向IEC101协议 } else { pView->m_pPrtObj = &(pDoc->m_PrtModbus); //协议对象指向MODBUS协议 } pView->m_pPrtObj->InitPrt(); //规约初始化 if (pDoc->m_CmmPortType == pDoc->CommPort) { //串口通讯方式 pDoc->m_ComObj.m_hOwner = pView->GetSafeHwnd(); //串口消息发到该句柄的窗口 if (pDoc->m_ComObj.OpenPort()) { if ( (pView->m_pPrtObj != NULL) && (pDoc->m_MasterFlag) ) //主站时启动召唤定时器 { pView->m_pPrtObj->StartTimer(); } IsCmmConnect = true; } else { AfxMessageBox("无法打开" pDoc->m_ComObj.m_szPortName "\r\n" "请选择其它端口"); return; } } else { //网口通讯方式 switch (pDoc->m_NetParam.TCPPrtType) { case pDoc->m_NetParam.TCPServer: pDoc->m_pSrvSocketObj = new CDAServerSocket(pView->GetSafeHwnd());//当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数 if ( pDoc->m_pSrvSocketObj->OpenPort(pDoc->m_NetParam.LocalIPPort,pDoc->m_NetParam.LocalIPAddr) ) IsCmmConnect = true; else { AfxMessageBox("无法创建 " pDoc->m_NetParam.LocalIPAddr "服务端口"); return; } break; case pDoc->m_NetParam.TCPClient: if(pDoc->m_pCltSocketObj != NULL) { pDoc->m_pCltSocketObj->ClosePort(); delete pDoc->m_pCltSocketObj; pDoc->m_pCltSocketObj = NULL; } pDoc->m_pCltSocketObj = new CDAClientSocket(pView->GetSafeHwnd()); if (pDoc->m_pCltSocketObj->OpenPort(pDoc->m_NetParam.RemoteIPPort,pDoc->m_NetParam.RemoteIPAddr)) { } else { AfxMessageBox("无法创建网络端口"); return; } break; case pDoc->m_NetParam.UDP: pDoc->m_pUDPSocketObj = new CDAUDPSocket(pView->GetSafeHwnd()); if ( pDoc->m_pUDPSocketObj->OpenPort(pDoc->m_NetParam.LocalIPPort) ) { IsCmmConnect = true; pView->m_pSocketObj = (CAsyncSocket*)pDoc->m_pUDPSocketObj; if ( (pView->m_pPrtObj != NULL) && (pDoc->m_MasterFlag) ) //主站时启动召唤定时器 pView->m_pPrtObj->StartTimer(); } else { AfxMessageBox("无法打开网络端口,请重试 "); return; } break; default: break; } } } //绘制各页的电子表格; 及遥控对话窗口 void CMainFrame::DrawGrid() { CYXData* pYXDlg; CYCData* pYCDlg; CYMData* pYMDlg; CYKData* pYKDlg; //获取各页的指针 pYXDlg = (CYXData*)m_TabCtrl.GetPagePoint(0); pYCDlg = (CYCData*)m_TabCtrl.GetPagePoint(1); pYMDlg = (CYMData*)m_TabCtrl.GetPagePoint(2); pYKDlg = (CYKData*)m_TabCtrl.GetPagePoint(3); //各页绘制表格 pYXDlg->DrawYXGrid(); pYCDlg->DrawYCGrid(); pYMDlg->DrawYMGrid(); //加载各页控件参数 pYXDlg->UpdateYXChara(FALSE); pYKDlg->UpdateYKChara(FALSE); } //更新YX电子表格数据 void CMainFrame::UpdateYXGrid() { CYXData* pYXDlg; pYXDlg = (CYXData*)m_TabCtrl.GetPagePoint(0); pYXDlg->UpdateYXGrid(); } void CMainFrame::UpdateYCGrid() { CYCData* pYCDlg; pYCDlg = (CYCData*)m_TabCtrl.GetPagePoint(1); pYCDlg->UpdateYCGrid(); } void CMainFrame::UpdateYMGrid() { CYMData* pYMDlg; pYMDlg = (CYMData*)m_TabCtrl.GetPagePoint(2); pYMDlg->UpdateYMGrid(); } //断开通讯连接 void CMainFrame::OnDisconncmm() { CMaintToolDoc* pDoc = (CMaintToolDoc*)GetActiveDocument(); //文档指针 主框架类函数; CMaintToolView* pView = (CMaintToolView*)GetActiveView(); //视图指针; if ( (pView->m_pPrtObj != NULL) && (pDoc->m_MasterFlag) ) //主站时关闭召唤定时器 pView->m_pPrtObj->CloseTimer(); pView->m_pSocketObj = NULL; if (pDoc->m_CmmPortType == pDoc->CommPort) pDoc->m_ComObj.ClosePort(); else { //网口通讯方式 if(pDoc->m_pSrvSocketObj != NULL) { pDoc->m_pSrvSocketObj->ClosePort(); delete pDoc->m_pSrvSocketObj; pDoc->m_pSrvSocketObj = NULL; } if(pDoc->m_pCltSocketObj != NULL) { pDoc->m_pCltSocketObj->ClosePort(); delete pDoc->m_pCltSocketObj; pDoc->m_pCltSocketObj = NULL; } if(pDoc->m_pUDPSocketObj != NULL) { pDoc->m_pUDPSocketObj->ClosePort(); delete pDoc->m_pUDPSocketObj; pDoc->m_pUDPSocketObj = NULL; } } IsCmmConnect = false; } void CMainFrame::OnUpdateConcmm(CCmdUI* pCmdUI) { pCmdUI->Enable(!IsCmmConnect); } void CMainFrame::OnUpdateDisconcmm(CCmdUI* pCmdUI) { pCmdUI->Enable(IsCmmConnect); } void CMainFrame::OnClose() { CMaintToolDoc* pDoc; pDoc = (CMaintToolDoc*)GetActiveDocument(); if (IsCmmConnect) OnDisconncmm(); ASSERT_VALID(pDoc); if (pDoc != NULL) pDoc->SetModifiedFlag(FALSE); //屏蔽文件保存提示 CFrameWnd::OnClose(); } //底部消息窗口显示信息 void CMainFrame::DisplayEvent(UINT nflag, CString s2) { CTime t = CTime::GetCurrentTime(); CString s0; CString s1; s0 = t.Format("%y-%m-%d %H:%M:%S"); if (nflag == 1) s1 = "主站操作"; else if (nflag == 2) s1 = "子站应答"; else if (nflag == 3) s1 = "通道事件"; else s1 = "其它类型"; m_MsgList.InsertItem(LVIF_TEXT|LVIF_STATE, 0, s0, 0, LVIS_SELECTED,0, 0); m_MsgList.SetItemText(0,1,s1); m_MsgList.SetItemText(0,2,s2); int i; i = m_MsgList.GetItemCount(); if (i>8) m_MsgList.DeleteItem(i-1); } void CMainFrame::OnViewData() { ShowControlBar(&m_wndMyBar1, !m_wndMyBar1.IsVisible(), FALSE); } void CMainFrame::OnViewMessage() { ShowControlBar(&m_wndMyBar2, !m_wndMyBar2.IsVisible(), FALSE); } void CMainFrame::OnUpdateViewData(CCmdUI* pCmdUI) { pCmdUI->Enable(); pCmdUI->SetCheck(m_wndMyBar1.IsVisible()); } void CMainFrame::OnUpdateViewMessage(CCmdUI* pCmdUI) { pCmdUI->Enable(); pCmdUI->SetCheck(m_wndMyBar2.IsVisible()); } void CMainFrame::OnPauseDsp() { IsReflashMsg = false; } void CMainFrame::OnReflashDsp() { IsReflashMsg = true; } void CMainFrame::OnUpdatePauseDsp(CCmdUI* pCmdUI) { pCmdUI->Enable(IsReflashMsg); } void CMainFrame::OnUpdateReflashDsp(CCmdUI* pCmdUI) { pCmdUI->Enable(!IsReflashMsg); } void CMainFrame::OnClearDsp() { CMaintToolView* pView = (CMaintToolView*)GetActiveView(); //视图指针; pView->ClearMsg(); } void CMainFrame::SetCmmPort() { CSettingCmmDlg CmmDlg; if (CmmDlg.DoModal()==IDOK) // TODO: 保存通讯对话框设置的参数 { CMaintToolDoc* pDoc; pDoc = (CMaintToolDoc*)GetActiveDocument(); ASSERT_VALID(pDoc); if (CmmDlg.m_CmmType == 0) { // 串口参数 dcb pDoc->m_CmmPortType = pDoc->CommPort; pDoc->m_ComObj.m_szPortName = CmmDlg.m_sPortName ; pDoc->m_ComObj.m_nParity = CmmDlg.m_Parity ; pDoc->m_ComObj.m_nDataBits = CmmDlg.m_ByteSize 4 ; pDoc->m_ComObj.m_nStopBits = CmmDlg.m_StopBits ; switch (CmmDlg.m_BaudRate) { case 0: pDoc->m_ComObj.m_nBaudRate = CBR_300; break; case 1: pDoc->m_ComObj.m_nBaudRate = CBR_600; break; case 2: pDoc->m_ComObj.m_nBaudRate = CBR_1200; break; case 3: pDoc->m_ComObj.m_nBaudRate = CBR_2400; break; case 4: pDoc->m_ComObj.m_nBaudRate = CBR_4800; break; case 5: pDoc->m_ComObj.m_nBaudRate = CBR_9600; break; case 6: pDoc->m_ComObj.m_nBaudRate = CBR_14400; break; case 7: pDoc->m_ComObj.m_nBaudRate = CBR_19200; break; case 8: pDoc->m_ComObj.m_nBaudRate = CBR_38400; break; case 9: pDoc->m_ComObj.m_nBaudRate = CBR_56000; break; case 10: pDoc->m_ComObj.m_nBaudRate = CBR_57600; break; case 11: pDoc->m_ComObj.m_nBaudRate = CBR_115200; break; default: pDoc->m_ComObj.m_nBaudRate = CBR_9600; break; } } else { // 网口参数 pDoc->m_CmmPortType = pDoc->NetPort; switch (CmmDlg.m_TCPIPPrtType) { case 0: pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.TCPServer; break; case 1: pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.TCPClient; break; case 2: pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.UDP; break; default: pDoc->m_NetParam.TCPPrtType = pDoc->m_NetParam.TCPServer; break; } pDoc->m_NetParam.RemoteIPPort = CmmDlg.m_RemoteIPPort; pDoc->m_NetParam.LocalIPPort = CmmDlg.m_LocalIPPort; pDoc->m_NetParam.RemoteIPAddr = CmmDlg.m_sRemoteIPAddr; pDoc->m_NetParam.LocalIPAddr = CmmDlg.m_sLocalIPAddr; } } } void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWnd::OnSize(nType, cx, cy); if (!IsFrameCreat) return; else { CYXData* pYXDlg; CYCData* pYCDlg; CYMData* pYMDlg; // CYKData* pYKDlg; //获取各页的指针 pYXDlg = (CYXData*)m_TabCtrl.GetPagePoint(0); pYCDlg = (CYCData*)m_TabCtrl.GetPagePoint(1); pYMDlg = (CYMData*)m_TabCtrl.GetPagePoint(2); // pYKDlg = (CYKData*)m_TabCtrl.GetPagePoint(3); //各页绘制表格 pYXDlg->ReDrawCtr(); pYCDlg->ReDrawCtr(); pYMDlg->ReDrawCtr(); } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)