wincomm.cpp
来自「这是一个在正实际应用当中运行的电力监控系统软件源代码」· C++ 代码 · 共 1,963 行 · 第 1/5 页
CPP
1,963 行
GetApplication()->MakeWindow (DispWindow[RXBUFFWINDOW]);
}
else
{
// if (lstrcmpi (GrName, DispWindow[RXBUFFWINDOW]->GraphName) != 0)
// DispWindow[RXBUFFWINDOW]->ReplaceGraph (Text, GrName);
// else if (Flag==2) DispWindow[RXBUFFWINDOW]->ReplaceGraph (Text, GrName);
// else
{
if (IsIconic (DispWindow[RXBUFFWINDOW]->HWindow) != 0)
ShowWindow (DispWindow[RXBUFFWINDOW]->HWindow, SW_RESTORE);
BringWindowToTop (DispWindow[RXBUFFWINDOW]->HWindow);
}
}
}
return TRUE;
}
// 菜单响应函数, 设置窗口背景颜色
void TMainWindow::CMUColor (RTMessage)
{
CHOOSECOLOR ccTemp;
ccTemp.lStructSize = sizeof (CHOOSECOLOR);
ccTemp.hwndOwner = HWindow;
ccTemp.hInstance = 0;
ccTemp.rgbResult = BackColor; // CC_RGBINIT flag makes this the default color
ccTemp.lpCustColors = crTemp;
ccTemp.Flags = CC_RGBINIT;
ccTemp.lCustData = 0L;
ccTemp.lpfnHook = NULL;
ccTemp.lpTemplateName = NULL;
if (ChooseColor (&ccTemp) == TRUE)
{
BackColor = ccTemp.rgbResult;
// 刷新所有已存在的子窗口
if (GetLastChild () != NULL)
{
PTWindowsObject CurrentIndex = GetFirstChild();
if (CurrentIndex != NULL)
{
do
{
InvalidateRect (CurrentIndex->HWindow, NULL, TRUE);
CurrentIndex = CurrentIndex->Next ();
} while (CurrentIndex != GetLastChild());
InvalidateRect (CurrentIndex->HWindow, NULL, TRUE);
}
}
}
}
//======================================================================
void TMainWindow::WMLButtonDblClk (RTMessage)
{
/*
if (pStatusWin)
{
BringWindowToTop (pStatusWin->HWindow);
ShowWindow (pStatusWin->HWindow, SW_RESTORE);
}
else
{
pStatusWin = new NodeStatusWindow (NULL, "Node Status");
GetApplication ()->MakeWindow (pStatusWin);
InvalidateRect (hNodeWnd, NULL, TRUE);
}
*/
}
//------------------------------------------------------------------------------//
//定义状态行显示参数
int StatusBarW[5]={100, 110, 90, 360, 137};
COLORREF StatusLineC[5]={RGB(128,0,0), RGB(0,128,128), RGB(128,128,64), RGB(0,0,128),RGB(0,128,64)};
void TMainWindow::Paint (HDC, PAINTSTRUCT&)
{
if (IsIconic (HWindow) != 0) return;
HDC hDC = GetDC (HWindow);
RECT rect;
HBRUSH BkBrush[5];
HBRUSH hOldBrush;
hOldBrush = (HBRUSH)SelectObject (hDC, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
LOGPEN lpPen = {PS_SOLID, {1, 1}, RGB(128, 128, 128)};
HPEN hGrayPen = CreatePenIndirect (&lpPen);
HPEN hOldPen = (HPEN)SelectObject (hDC, hGrayPen);
for (int i=0; i<5; i++) BkBrush[i] = CreateSolidBrush (StatusLineC[i]);
Rectangle (hDC, MRect.left, MRect.top, MRect.right, MRect.bottom);
SelectObject (hDC, (HPEN)GetStockObject(WHITE_PEN));
MoveTo (hDC, MRect.left, MRect.top);
LineTo (hDC, MRect.right, MRect.top);
rect.left = 0; rect.right = 0;
rect.top = MRect.top+3; rect.bottom = MRect.bottom-2;
for (i=0; i<5; i++)
{
SelectObject(hDC, (HPEN)GetStockObject(BLACK_PEN));
rect.left = rect.right+3;
rect.right += StatusBarW[i];
MoveTo (hDC, rect.right, rect.top);
LineTo (hDC, rect.left, rect.top);
LineTo (hDC, rect.left, rect.bottom-1);
SelectObject(hDC, (HPEN)GetStockObject(WHITE_PEN));
LineTo (hDC, rect.right, rect.bottom-1);
LineTo (hDC, rect.right, rect.top-1);
// SelectObject (hDC, hGrayPen);
SelectObject (hDC, BkBrush[i]);
Rectangle (hDC, rect.left+1, rect.top+1, rect.right, rect.bottom-1);
}
DrawStatusLine("", 0, MRect);
for (i=0; i<5; i++) DeleteObject (BkBrush[i]);
DeleteObject (hGrayPen);
ReleaseDC (HWindow, hDC);
// InvalidateRect (ClientWnd->HWindow, NULL, TRUE);
}
//-----------------------------------------------
void TMainWindow::WMCommand (RTMessage Msg)
{
TMDIFrame::WMCommand (Msg);
BOOL Flag = 0;
switch (Msg.WParam)
{
case 555:
Freq = GetFrequency()-1;
WORD k, protono;
for (int i=0; i<TotalChNum; i++)
{
if ((lpChannelParam+i)->CHValidFlag)
{
/*
if ((lpChannelParam+i)->MultiStation==88) //一站多址
{
for (BYTE j=0;j<TotalStaNum;j++)
{
if ((lpStaParam+j)->PollCdt && (lpStaParam+j)->CurrUsedCh == i)
{
protono=(lpStaParam+j)->ProtoType;
if (Protocal[protono].RxProc!=NULL)
{
(lpChannelParam+i)->StaNo=j;
Protocal[protono].RxProc(HWindow, i, lpChannelParam, lpStaParam);
}
}
}
}
else
*/
{
k=(lpChannelParam+i)->StaNo;
if (k<TotalStaNum && (lpStaParam+k)->CurrUsedCh == i && (lpChannelParam+i)->CHValidFlag)
{
protono=(lpStaParam+k)->ProtoType;
if (Protocal[protono].RxProc!=NULL)
Protocal[protono].RxProc(HWindow, i, lpChannelParam, lpStaParam);
}
}
}
}
WORD currentch;
if (ThisNodeName == MainFertName) //如果本机是主机,则发送
{
for (i=0; i<TotalStaNum; i++)
{
currentch = (lpStaParam+i)->CurrUsedCh;
if ((currentch != 0xffff) && (currentch<TotalChNum) && (lpChannelParam+currentch)->CHValidFlag)
{
protono=(lpStaParam+i)->ProtoType;
if (Protocal[protono].TxProc!=NULL && (lpChannelParam+currentch)->StaNo==i)
{
if (OdsFlag!=0)
Protocal[protono].TxProc(HWindow, lpChannelParam+currentch, lpStaParam+i,i|0x80);
else Protocal[protono].TxProc(HWindow, lpChannelParam+currentch, lpStaParam+i,i);
}
}
} // end for
} //end if
break;
}
}
int initcount;
void ChkChStatus()
{
CHANNELPARAM FAR *chp = lpChannelParam;
DWORD chst, chst1;
EVENT eve;
WORD FLAG;
struct dosdate_t d;
struct dostime_t t;
BYTE initflag=0,i,ii;
BYTE CommInitFlag=0;
initcount++;
BYTE cards=syscfg->GetCommCardNums();
for (i=1;i<=cards*8+2;i++)
{
if (NetTestFlag && CommCount[i]>5 ) MessageBeep(0);
if (CommPara[i-1].Used==0) continue;
BYTE ChNum=CalChNum(i);
if (CommCount[i]>30000l && CommPara[i-1].Used!=0 && (chp+ChNum)->CHType==1)
{
if (idComDev[i]>=0) CloseComm(idComDev[i]);
if (InputCommMem[i]) GlobalFree(InputCommMem[i]);
if (OutputCommMem[i]) GlobalFree(OutputCommMem[i]);
InitOneComm(i);
// InitAllModem();
// for (int ii=0;ii<TotalChNum;ii++) InitOneModem(ii);
}
if (ChNum<TotalChNum)
if (CommCount[i]>50 && CommPara[i-1].Used!=0 && (chp+ChNum)->CHType==2)
{
{
if (idComDev[i]>=0) CloseComm(idComDev[i]);
if (InputCommMem[i]) GlobalFree(InputCommMem[i]);
if (OutputCommMem[i]) GlobalFree(OutputCommMem[i]);
InitOneComm(i);
// InitAllModem();
// for (int ii=0;ii<TotalChNum;ii++) InitOneModem(ii);
}
}
}
for (i=0;i<TotalChNum;i++)
{
if ((chp+i)->CHStatus&ChInit&&(initcount >=200)) //jgx 200
{
if (HardwareInstallFlag[CTKBOARD] && initflag==0)
{
initflag=1;
CTKSIO FAR *lpCtkSioParam = (CTKSIO FAR *)GlobalLock(hCTKSIOMem);
StopCTK();
HardwareInstallFlag[CTKBOARD]=NULL;
HardwareInstallFlag[CTKBOARD]=InitialCTK(hMainWindow, lpChannelParam, lpCtkSioParam);
GlobalUnlock(hCTKSIOMem);
}
}
// (chp+i)->RxWriteP=(chp+i)->RxReadP=0;//jgx //
(chp+i)->CHStatus&=~ChInit;
}
if (initflag==1)
{
initflag=0;
initcount=0;
}
for (i=0; i<TotalChNum; i++)
{
chst = (chp+i)->CHStatus;
FLAG=0;
if ((chp+i)->ChangFlag&2) FLAG|=CommBreakFlag1;
if ((chp+i)->ChangFlag&4) FLAG|=CharInvFlag1;
if ((chp+i)->ChangFlag&8) FLAG|=NoSyncFlag1;
if ((chp+i)->ChangFlag&0x10) FLAG|=ErrDataFlag1;
if ((chp+i)->ChangFlag&0x20) FLAG|=NoTxFlag1;
if ((chp+i)->ChangFlag&0x40) FLAG|=OnlySyncFlag1;
/*********************************************************/
if ((chp+i)->ErrDataNum>=400)
{
if ((chp+i)->ErrDataNum%400==0)
{
(chp+i)->CHStatus|=ErrDataFlag;
chst|=ErrDataFlag;
chst|=ChInit;
}
if ((chp+i)->ErrDataNum>=410)
{
(chp+i)->ErrDataNum=0;
(chp+i)->CHStatus&=~ErrDataFlag;
}
}
/*********************************************************/
(chp+i)->CHStatus &= ~(CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1);
if ((chp+i)->CHValidFlag && (chp+i)->CHCheckFlag)
{
if ((chp+i)->CHStatus & CommBreakFlag) (chp+i)->CHStatus |= (CommBreakFlag1);
if ((chp+i)->CHStatus & CharInvFlag) (chp+i)->CHStatus |= CharInvFlag1;
if ((chp+i)->CHStatus & NoSyncFlag) (chp+i)->CHStatus |= (NoSyncFlag1);
if ((chp+i)->CHStatus & OnlySyncFlag) (chp+i)->CHStatus |= OnlySyncFlag1;
if ((chp+i)->CHStatus & ErrDataFlag) (chp+i)->CHStatus |= ErrDataFlag1;
if ((chp+i)->CHStatus & NoTxFlag) (chp+i)->CHStatus |= NoTxFlag1;
chst1 = (chp+i)->CHStatus^chst;
if (chst1 & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1) & FLAG)
{
chst = (chp+i)->CHStatus;
eve.EventType = TDEVENT;
eve.EventAttr = 0;
if (!(chst & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1) & FLAG))
// if (!(chst & CommBreakFlag1))
{eve.EventAttr |= TDHF; goto Out;} //通道恢复
else if ((chst&CommBreakFlag1) && (chst1&CommBreakFlag1)) {eve.EventAttr |= TDZD; goto Out;}
else if ((chst&CharInvFlag1) && (chst1&CharInvFlag1)) {eve.EventAttr |= TDZFWX; goto Out;}
else if ((chst&NoSyncFlag1) && (chst1&NoSyncFlag1)) {eve.EventAttr |= TDSB; goto Out;}
else if ((chst&OnlySyncFlag1) && (chst1&OnlySyncFlag1)){ eve.EventAttr |= TDJTBZ; goto Out;}
else if ((chst&ErrDataFlag1) && (chst1&ErrDataFlag1)){ eve.EventAttr |= TDWM; goto Out;}
else if ((chst&NoTxFlag1) && (chst1&NoTxFlag1)) {eve.EventAttr |= TDKF; goto Out;}
else eve.EventAttr = 0;
Out: eve.Station = (chp+i)->StaNo;
eve.Order = i;
_dos_getdate(&d);
_dos_gettime(&t);
eve.Hour = t.hour;
eve.Min = t.minute;
eve.Sec = t.second;
eve.Ms = 0;
// if ((eve.EventAttr&TDZD) || (eve.EventAttr&TDHF) ||(eve.EventAttr&TDSB)){eve.EventAttr=TDZD;WriteAEvent(EVENTDB, &eve);}
WriteAEvent(EVENTDB, &eve);
}
}
}
// shy 97.9.28
/*
WORD stano, yxno;
BYTE stastatus;
for (i=0; i<TotalChNum; i++)
{
stano = (chp+i)->StaNo;
yxno = GetRcdNum(YXDB, stano);
if ((chp+i)->CHValidFlag)
{
if ((chp+i)->CHStatus & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1))
stastatus = 0;
else
stastatus = 1;
if (yxno!=0)
{
yxno--;
SetValue(YXDB, stano, yxno, (DWORD)stastatus);
}
}
}
*/
STATIONPARAM FAR *stp = lpStaParam;
WORD yxno;
WORD chno, stastatus;
chp = lpChannelParam;
for (i=0; i<TotalStaNum-1; i++)
{
if (!(stp+i)->DataToHost) continue;
yxno = GetRcdNum(YXDB, i);
chno = (stp+i)->CurrUsedCh;
if (chno==0xffff || chno>TotalChNum) continue;
FLAG=0;
if ((chp+chno)->ChangFlag&2) FLAG|=CommBreakFlag1;
if ((chp+chno)->ChangFlag&4) FLAG|=CharInvFlag1;
if ((chp+chno)->ChangFlag&8) FLAG|=NoSyncFlag1;
if ((chp+chno)->ChangFlag&0x10) FLAG|=ErrDataFlag1;
if ((chp+chno)->ChangFlag&0x20) FLAG|=NoTxFlag1;
if ((chp+chno)->ChangFlag&0x40) FLAG|=OnlySyncFlag1;
stastatus=1;
if ((chno==0xffff) || !(chp+chno)->CHValidFlag)
stastatus = 1;
else if ((chp+chno)->CHStatus & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1) & FLAG)
stastatus = 0;
if (yxno!=0 && chno!=0xffff) SetValue(YXDB, i, yxno-1, (DWORD)stastatus);//tzc
// if ((chp+chno)->CHStatus & (NoSyncFlag1)) initcount+=100;
// 如果当前通道状态是故障
if (stastatus==1 && (chp+chno)->CHCheckFlag)
{
if ( chno==(stp+i)->BackCh[0] ) chno = (stp+i)->BackCh[1];
else chno = (stp+i)->BackCh[0];
if (chno!=0xffff && chno<TotalChNum)
{
// (chp+(stp+i)->CurrUsedCh)->CHStatus&=~(CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1);
// (chp+(stp+i)->CurrUsedCh)->CHStatus&=~(CommBreakFlag+CharInvFlag+NoSyncFlag+OnlySyncFlag+ErrDataFlag+NoTxFlag);
// (chp+(stp+i)->CurrUsedCh)->CHStatus&=~ChOpen;
(stp+i)->CurrUsedCh= chno;
(chp+chno)->CHValidFlag=1;
(chp+chno)->CHStatus|=ChInit;
(chp+chno)->CHStatus|=ChOpen;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?