📄 serielldlg.cpp
字号:
// seriellDlg.cpp : Implementierungsdatei
//
#include "stdafx.h"
#include "seriell.h"
#include "seriellDlg.h"
#include "RS232.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSeriellDlg Dialogfeld
CSeriellDlg::CSeriellDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSeriellDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSeriellDlg)
// HINWEIS: Der Klassenassistent f黦t hier Member-Initialisierung ein
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CSeriellDlg::~CSeriellDlg()
{
delete m_rs232;
}
void CSeriellDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSeriellDlg)
DDX_Control(pDX, IDC_LIST, m_list);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSeriellDlg, CDialog)
//{{AFX_MSG_MAP(CSeriellDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN, OnOpen)
ON_BN_CLICKED(IDC_CLOSE, OnClose)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_ENABLE, OnEnableorDisable)
ON_NOTIFY(UDN_DELTAPOS, IDC_TIME, OnDeltaposTime)
ON_BN_CLICKED(IDC_SENDBTN, OnSendbtn)
ON_BN_CLICKED(IDC_FILE, OnFile)
ON_BN_CLICKED(IDC_DISABLE, OnEnableorDisable)
ON_MESSAGE(WM_DROPFILES, OnDropFile)
ON_BN_CLICKED(IDC_SAVE, OnSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSeriellDlg Nachrichten-Handler
//Ereignisse aus RS232.h
void CSeriellDlg::TriggerOnSignal(DWORD Signal)
{
if (Signal&EV_BREAK)
{SetText(ERROR_SUCCESS,"a BREAK received");};
if (Signal&EV_CTS)
{SetText(ERROR_SUCCESS,"CTS changed state");};
if (Signal&EV_DSR)
{SetText(ERROR_SUCCESS,"DSR changed state");};
if (Signal&EV_RING)
{SetText(ERROR_SUCCESS,"Ring signal detected");};
if (Signal&EV_RLSD)
{SetText(ERROR_SUCCESS,"RLSD changed state");};
if (Signal&EV_TXEMPTY)
{SetText(ERROR_SUCCESS,"Transmitt Queue Empty");};
if (Signal&EV_RXCHAR)
{/*NOP*/ };
if (Signal&EV_RXFLAG)
{/*NOP*/ };
m_rs232->GetModemState(m_rs232->m_Handles.hHandle);
}
void _stdcall OnSignal(
HANDLE hHandle,
DWORD dwErrorCode, //Fehlercode sollte immer "0" sein
DWORD InQueCount,
DWORD Event
)
{
CSeriellDlg* dlg = (CSeriellDlg*)AfxGetMainWnd();
if (dlg)
{
switch(dwErrorCode)
{
case 0:;
break;
default:
{
char* Msg = new char[MAX_PATH];
memset(Msg,0x00,MAX_PATH);
sprintf(Msg,"Fehler auf Schnittstellen %s [Code = %d; Handle = %d; Buffer = %d]",
dlg->m_rs232->m_Handles.name,dwErrorCode,hHandle,InQueCount);
dlg->SetText(1,Msg);
delete Msg;
};
};
};
dlg->TriggerOnSignal(Event);
}
void _stdcall OnError(
HANDLE hHandle,
DWORD dwErrorCode, //Fehlercode sollte immer "0" sein
char* ErrorMessage
)
{
char Msg[MAX_PATH] = {0};
char Err[MAX_PATH] = {0};
strcpy(Msg,ErrorMessage);
sprintf(Msg,"%s [Handle = %d] ",Msg,hHandle);
CSeriellDlg* dlg = (CSeriellDlg*)AfxGetMainWnd();
if (dlg)
{
switch(dwErrorCode)
{
case 0: dlg->SetText(ERROR_SUCCESS,ErrorMessage);
break;
default:
{
dlg->m_rs232->ReturnLastErrorMsg(dwErrorCode,Err);
strcat(Msg,Err);
dlg->SetText(1,Msg);
};
};
}
else MessageBox(0,ErrorMessage,NULL,MB_OK);
}
BOOL CSeriellDlg::OnInitDialog()
{
CDialog::OnInitDialog();
char* Namen = new char [MAX_PATH];
char* out = new char [MAX_PATH];
BOOL IsName = false;
memset(Namen,0x00,MAX_PATH);
memset(out,0x00,MAX_PATH);
LoadString(0,IDS_RIGHTS,out,MAX_PATH);
SetText(ERROR_SUCCESS,out);
LoadString(0,IDS_VERSION,out,MAX_PATH);
SetText(ERROR_SUCCESS,out);
LoadString(0,IDS_COMMENT,out,MAX_PATH);
SetText(ERROR_SUCCESS,out);
memset(out,0x00,MAX_PATH);
CComboBox* cb = (CComboBox*)GetDlgItem(IDC_NAMEN);
m_rs232 = new C_RS232(&m_DeviceCount, Namen,OnSignal, OnError);
//Anzeigen welche Schnittstellen verf黦bar sind
SetText(ERROR_SUCCESS,Namen);
for (WORD i = 1; i < strlen(Namen); i++)
{
if ((/*"["*/0x5b == Namen[i-1])
||(IsName))
{
strncat(out,&Namen[i],1);
IsName = (/*"]"*/0x5d != Namen[i+1]);
if (!IsName)
{
cb->AddString(out);
memset(out,0x00,sizeof(out));
};
};
};
//Angabe der Einstellungen, die zur Auswahl stehen
cb = (CComboBox*)GetDlgItem(IDC_BAUD);
for (i = 1; i <= 128; i *= 2)
{
sprintf(out,"%d",i*300);
cb->AddString(out);
};
cb = (CComboBox*)GetDlgItem(IDC_DATA);
for (i = 4; i <= 8; i++)
{
sprintf(out,"%d",i);
cb->AddString(out);
};
cb = (CComboBox*)GetDlgItem(IDC_STPB);
for (i = 10; i <= 20; i += 5)
{
sprintf(out,"%.1f",(float)i/10);
cb->AddString(out);
};
cb = (CComboBox*)GetDlgItem(IDC_PARITY);
for (i = 0; i < 5; i++)
cb->AddString(tagPARITYSTR[i]);
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
EnableWindow();
m_img.Create(IDB_IMG,16,1,RGB(255,0,255));
m_list.InsertColumn(0,"Meldungen",LVCFMT_LEFT,800);
m_list.SetImageList(&m_img, LVSIL_SMALL);
delete out;
delete Namen;
return TRUE;
}
void CSeriellDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // Ger鋞ekontext f黵 Zeichnen
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Symbol in Client-Rechteck zentrieren
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Symbol zeichnen
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CSeriellDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CSeriellDlg::SetText(int Index, char* Text)
{
int nCnt = m_list.GetItemCount();
int i = m_list.InsertItem(nCnt,Text,Index);
m_list.EnsureVisible(i,FALSE);
m_list.SetHotItem(nCnt);
return;
}
void CSeriellDlg::OnOpen()
{
CString str;
GetDlgItem(IDC_NAMEN)->GetWindowText(str);
char device[MAX_PATH] = {0};
strcpy(device,(const char*)str);
BYTE settings[4];
for (int i = IDC_BAUD; i <= IDC_PARITY; i++)
{
CComboBox* cb = (CComboBox*)GetDlgItem(i);
settings[i-IDC_BAUD]= (BYTE)cb->GetCurSel();
};
//TODO
m_rs232->m_dcb.XoffLim = MAX_BUFFERSIZE;
m_rs232->m_dcb.XonLim = MAX_BUFFERSIZE;
m_rs232->m_SignalEvents = true;
CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
if (m_rs232->UpdateDataControlBlock(
m_rs232->CreateHandle(device, false,(spin->GetPos())*1000),
settings[0],
settings[1],
settings[2],
settings[3]
))
{
sprintf(device,"%s ge鰂fnet",m_rs232->m_Handles.name);
SetText(ERROR_SUCCESS,device);
int Index = (int)m_rs232->m_Handles.hHandle;
SetTimer(Index,m_rs232->m_Timeout/10,NULL);
CProgressCtrl* prog = (CProgressCtrl*)GetDlgItem(IDC_PROG1);
prog->SetStep(1);
};
EnableWindow();
}
void CSeriellDlg::OnClose()
{
if (m_rs232->DestroyHandle(&m_rs232->m_Handles.hHandle))
{
CProgressCtrl* prog = (CProgressCtrl*)GetDlgItem(IDC_PROG1);
int Index = (int)m_rs232->m_Handles.hHandle;
char* Msg = new char[MAX_PATH];
memset(&Msg[0],0x00,MAX_PATH);
KillTimer(Index);
prog->SetPos(0);
EnableWindow();
sprintf(Msg,"%s geschlossen",m_rs232->m_Handles.name);
SetText(ERROR_SUCCESS,Msg);
return;
};
SetText(ERROR_INVALID_FUNCTION,"Schnittstelle konnte nicht geschlossen werden.");
}
void CSeriellDlg::OnTimer(UINT nIDEvent)
{
if (nIDEvent == (UINT)m_rs232->m_Handles.hHandle)
{
CProgressCtrl* prog = (CProgressCtrl*)GetDlgItem(IDC_PROG1);
prog->StepIt();
};
CDialog::OnTimer(nIDEvent);
}
void CSeriellDlg::OnEnableorDisable()
{
UINT Index = (UINT)m_rs232->m_Handles.hHandle;
switch(m_rs232->m_SignalEvents)
{
case true:
{
m_rs232->DisableOnSignal();
KillTimer(Index);
break;
};
case false:
{
m_rs232->EnableOnSignal();
SetTimer(Index,m_rs232->m_Timeout/10,NULL);
break;
};
};
EnableWindow();
}
void CSeriellDlg::OnDeltaposTime(NMHDR* pNMHDR, LRESULT* pResult)
{
CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
m_rs232->m_Timeout = (1000*(spin->GetPos()));
*pResult = 0;
}
void CSeriellDlg::EnableWindow()
{
BOOL en = ( (0 != m_rs232->m_Handles.hHandle)
&& (INVALID_HANDLE_VALUE != m_rs232->m_Handles.hHandle));
GetDlgItem(IDC_OPEN)->EnableWindow(!en);
GetDlgItem(IDC_CLOSE)->EnableWindow(en);
en = m_rs232->m_SignalEvents;
GetDlgItem(IDC_ENABLE)->EnableWindow(!en);
GetDlgItem(IDC_DISABLE)->EnableWindow(en);
}
void CSeriellDlg::OnSendbtn()
{
CString text;
GetDlgItem(IDC_SEND)->GetWindowText(text);
DWORD Size = text.GetLength();
if (0 >= Size)
{
SetText(ERROR_SUCCESS,"no value to send");
return;
};
char* buffer = new char[Size];
memcpy(&buffer[0],text,Size);
if (!m_rs232->ComWrite(&buffer[0],Size))
SetText(ERROR_INVALID_FUNCTION,"value was not written");
delete buffer;
}
void CSeriellDlg::OnFile()
{
CString Filter;
CString Default;
Filter.LoadString(IDS_FILTER);
Default.LoadString(IDS_DEFAULT);
CFileDialog* fdlg = new CFileDialog(true, Default, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Filter, AfxGetMainWnd());
if (IDOK == fdlg->DoModal())
OpenSettingFile(fdlg->GetPathName());
delete fdlg;
}
void CSeriellDlg::OnSave()
{
CString Filter;
CString Default;
Filter.LoadString(IDS_FILTER);
Default.LoadString(IDS_DEFAULT);
CFileDialog* fdlg = new CFileDialog(false, Default, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Filter, AfxGetMainWnd());
if (IDOK == fdlg->DoModal())
SaveSettingFile(fdlg->GetPathName());
delete fdlg;
}
void CSeriellDlg::OpenSettingFile(CString filename)
{
FILE* file;
char Text[MAX_PATH];
if (NULL != (file = fopen((const char*)filename,"r+t")))
{
for (int i = IDC_NAMEN; i <= IDC_PARITY; i++)
{
if (fscanf(file,"%s",Text))
{
CComboBox* cb = (CComboBox*)GetDlgItem(i);
int Index = cb->FindStringExact(0, Text);
if (CB_ERR != Index)
cb->SetCurSel(Index);
else
{
sprintf(Text,"falsche Einstellung in Zeile %d",(i-IDC_NAMEN)+1);
SetText(1,Text);
};
};
};
if (fscanf(file,"%s",Text))
{
int Pos = atoi(Text);
CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
spin->SetPos(Pos);
}
filename += " wurde geladen.";
char msg[MAX_PATH];
strcpy(&msg[0],(const char*)filename);
SetText(0,msg);
fclose(file);
};
}
void CSeriellDlg::SaveSettingFile(CString filename)
{
FILE* file;
CString Text;
if (NULL != (file = fopen((const char*)filename,"w+t")))
{
for (int i = IDC_NAMEN; i <= IDC_PARITY; i++)
{
GetDlgItem(i)->GetWindowText(Text);
fwrite(Text,sizeof(char),Text.GetLength(),file);
fwrite("\r\n",sizeof(char),2,file);
};
CSpinButtonCtrl* spin = (CSpinButtonCtrl*)GetDlgItem(IDC_TIME);
int Pos = spin->GetPos();
char msg[MAX_PATH];
sprintf(msg,"%d\r\n",Pos);
fwrite(msg,sizeof(char),strlen(msg),file);
filename += " wurde geschrieben.";
strcpy(&msg[0],(const char*)filename);
SetText(0,msg);
fclose(file);
};
}
LRESULT CSeriellDlg::OnDropFile(HDROP hDropInfo)
{
//Eine oder mehrere Dateien sind aus einenm Explorer
//in dieses Fenster gezogen worden
TCHAR szFileName[_MAX_PATH];
TCHAR szFileOut[2*_MAX_PATH];
UINT nFileCount = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
ASSERT(nFileCount != 0);
for (UINT i = 0; i < nFileCount; i++)
{
::DragQueryFile(hDropInfo, i, szFileName, _MAX_PATH);
sprintf(szFileOut,"%s wurde gew鋒lt.",szFileName);
SetText(0,szFileName);
};
::DragQueryFile(hDropInfo, 0, szFileName, _MAX_PATH);
OpenSettingFile(szFileName);
::DragFinish(hDropInfo);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -