?? apexcommctl.cpp
字號:
///////////////////////////////////////////////////////////////
// 文件: ApexCommCtl.cpp
// 功能: 控件功能實現文件,實現控件屬性的改變和方法的功能
// 作者: 王念峰
// 日期: 1999.04.19 - 創建
// 1999.05.15 - 修改,整理
// E_mai:wnf@wisepeak.com
// Http://www.wisepeak.com
///////////////////////////////////////////////////////////////
// 版本: 1.0
///////////////////////////////////////////////////////////////
// 注:由于涉及串口通訊,要求系統必須同時響應串口事件和用戶輸入,
// 所以該處使用多線程來實現
///////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ApexComm.h"
#include "ApexCommCtl.h"
#include "vcthread.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CApexCommCtrl, COleControl)
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CApexCommCtrl, COleControl)
//{{AFX_MSG_MAP(CApexCommCtrl)
ON_WM_WINDOWPOSCHANGING()
//}}AFX_MSG_MAP
//自定義消息映射,包括串口讀到數據事件,串口掛起事件
// 接收數據出錯事件,數據傳輸完畢事件
afx_msg ON_THREAD_MESSAGE(USER_RECEIVEDATA,ReceiveData)
afx_msg ON_THREAD_MESSAGE(USER_ONCOMMHANGUP,CommHangup)
afx_msg ON_THREAD_MESSAGE(USER_RECEIVEDATAERROR,ReceiveDataError)
afx_msg ON_THREAD_MESSAGE(USER_DATASENDFINISHED,DataSendFinished)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
BEGIN_DISPATCH_MAP(CApexCommCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CApexCommCtrl)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "PortID", m_portID, OnPortIDChanged, VT_BSTR)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "BaudRate", m_baudRate, OnBaudRateChanged, VT_I4)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "EnableParity", m_enableParity, OnEnableParityChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutxCtsFlow", m_outxCtsFlow, OnOutxCtsFlowChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutxDsrFlow", m_outxDsrFlow, OnOutxDsrFlowChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "DtrControl", m_dtrControl, OnDtrControlChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "DsrSensitivity", m_dsrSensitivity, OnDsrSensitivityChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "TxContinueOnXoff", m_txContinueOnXoff, OnTxContinueOnXoffChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutxXonXoffFlow", m_outxXonXoffFlow, OnOutxXonXoffFlowChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "InxXonXoffFlow", m_inxXonXoffFlow, OnInxXonXoffFlowChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReplaceWhenParityError", m_replaceWhenParityError, OnReplaceWhenParityErrorChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "IgnoreNullChar", m_ignoreNullChar, OnIgnoreNullCharChanged, VT_BOOL)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "RtsControl", m_rtsControl, OnRtsControlChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XonLimit", m_xonLimit, OnXonLimitChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XoffLimit", m_xoffLimit, OnXoffLimitChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ByteSize", m_byteSize, OnByteSizeChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "Parity", m_parity, OnParityChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "StopBits", m_stopBits, OnStopBitsChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XonChar", m_xonChar, OnXonCharChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "XoffChar", m_xoffChar, OnXoffCharChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReplaceChar", m_replaceChar, OnReplacedCharChanged, VT_I2)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "InputBufferSize", m_inputBufferSize, OnInputBufferSizeChanged, VT_I4)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "OutputBufferSize", m_outputBufferSize, OnOutputBufferSizeChanged, VT_I4)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReadIntervalTimeout", m_readIntervalTimeout, OnReadIntervalTimeoutChanged, VT_I4)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReadTotalTimeoutMultiplier", m_readTotalTimeoutMultiplier, OnReadTotalTimeoutMultiplierChanged, VT_I4)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "ReadTotalTimeoutConstant", m_readTotalTimeoutConstant, OnReadTotalTimeoutConstantChanged, VT_I4)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "WriteTotalTimeoutMultiplier", m_writeTotalTimeoutMultiplier, OnWriteTotalTimeoutMultiplierChanged, VT_I4)
DISP_PROPERTY_NOTIFY(CApexCommCtrl, "WriteTotalTimeoutConstant", m_writeTotalTimeoutConstant, OnWriteTotalTimeoutConstantChanged, VT_I4)
DISP_FUNCTION(CApexCommCtrl, "OpenPort", OpenPort, VT_EMPTY, VTS_NONE)
DISP_FUNCTION(CApexCommCtrl, "ClosePort", ClosePort, VT_EMPTY, VTS_NONE)
DISP_FUNCTION(CApexCommCtrl, "WritePort", WritePort, VT_BOOL, VTS_BSTR VTS_I4)
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
/////////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_MAP(CApexCommCtrl, COleControl)
//{{AFX_EVENT_MAP(CApexCommCtrl)
EVENT_CUSTOM("OnReceiveData", FireOnReceiveData, VTS_BSTR VTS_I4)
EVENT_CUSTOM("OnCommHangup", FireOnCommHangup, VTS_BOOL)
EVENT_CUSTOM("ReceiveDateError", FireReceiveDateError, VTS_I4)
EVENT_CUSTOM("DataSendFinished", FireDataSendFinished, VTS_NONE)
//}}AFX_EVENT_MAP
END_EVENT_MAP()
/////////////////////////////////////////////////////////////////////////////
//由此向下不要修改,由系統維護
IMPLEMENT_OLECREATE_EX(CApexCommCtrl, "APEXCOMM.ApexCommCtrl.1",
0xf0a2bec8, 0xf8b2, 0x11d2, 0x8a, 0x54, 0, 0x80, 0xc8, 0xeb, 0x2f, 0xfe)
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_OLETYPELIB(CApexCommCtrl, _tlid, _wVerMajor, _wVerMinor)
/////////////////////////////////////////////////////////////////////////////
const IID BASED_CODE IID_DApexComm =
{ 0xf0a2bec6, 0xf8b2, 0x11d2, { 0x8a, 0x54, 0, 0x80, 0xc8, 0xeb, 0x2f, 0xfe } };
const IID BASED_CODE IID_DApexCommEvents =
{ 0xf0a2bec7, 0xf8b2, 0x11d2, { 0x8a, 0x54, 0, 0x80, 0xc8, 0xeb, 0x2f, 0xfe } };
/////////////////////////////////////////////////////////////////////////////
static const DWORD BASED_CODE _dwApexCommOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE;// |
//OLEMISC_INVISIBLEATRUNTIME;
//OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CApexCommCtrl, IDS_APEXCOMM, _dwApexCommOleMisc)
/////////////////////////////////////////////////////////////////////////////
// CApexCommCtrl::CApexCommCtrlFactory::UpdateRegistry -
BOOL CApexCommCtrl::CApexCommCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegApartmentThreading to 0.
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_APEXCOMM,
IDB_APEXCOMM,
afxRegApartmentThreading,
_dwApexCommOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
//以上代碼不必修改
////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//構造函數
CApexCommCtrl::CApexCommCtrl()
{
InitializeIIDs(&IID_DApexComm, &IID_DApexCommEvents);
SetInitialSize(24,24);//設置控件初始大小
m_portID="COM1";
m_hCommFile=NULL;
m_bSendDataEmpty=true;
}
/////////////////////////////////////////////////////////////////////////////
CApexCommCtrl::~CApexCommCtrl()
{
// TODO: Cleanup your control's instance data here.
}
/////////////////////////////////////////////////////////////////////////////
//顯示設計狀態下的控件外觀
/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CBitmap bitmap;
BITMAP bmp;
CPictureHolder picHolder;
CRect rcSrcBounds;
//裝入位圖
bitmap.LoadBitmap(IDB_APEX);
bitmap.GetObject(sizeof(BITMAP), &bmp);
rcSrcBounds.right = bmp.bmWidth;
rcSrcBounds.bottom = bmp.bmHeight;
//創建位圖并拉伸
picHolder.CreateFromBitmap((HBITMAP)bitmap.m_hObject, NULL, false);
picHolder.Render(pdc, rcBounds, rcSrcBounds);
}
/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Long(pPX, _T("BaudRate"), m_baudRate, 9600);
PX_Bool(pPX, _T("EnableParity"), m_enableParity, FALSE);
PX_Bool(pPX, _T("OutxCtsFlow"), m_outxCtsFlow, FALSE);
PX_Bool(pPX, _T("OutxDsrFlow"), m_outxDsrFlow, FALSE);
PX_Short(pPX, _T("DtrControl"), m_dtrControl, 0);
PX_Bool(pPX, _T("DsrSensitivity"), m_dsrSensitivity, FALSE);
PX_Bool(pPX, _T("TxContinueOnXoff"), m_txContinueOnXoff, TRUE);
PX_Bool(pPX, _T("OutxXonXoffFlow"), m_outxXonXoffFlow, FALSE);
PX_Bool(pPX, _T("InxXonXoffFlow"), m_inxXonXoffFlow, FALSE);
PX_Bool(pPX, _T("ReplaceWhenParityError"), m_replaceWhenParityError, FALSE);
PX_Bool(pPX, _T("IgnoreNullChar"), m_ignoreNullChar, FALSE);
PX_Short(pPX, _T("RtsControl"), m_rtsControl, 0);
PX_Short(pPX, _T("XonLimit"), m_xonLimit, 200);
PX_Short(pPX, _T("XoffLimit"), m_xoffLimit, 200);
PX_Short(pPX, _T("ByteSize"), m_byteSize, 3);
PX_Short(pPX, _T("Parity"), m_parity, 0);
PX_Short(pPX, _T("StopBits"), m_stopBits, 0);
PX_Short(pPX, _T("XonChar"), m_xonChar, 17);
PX_Short(pPX, _T("XoffChar"), m_xoffChar, 19);
PX_Short(pPX, _T("ReplaceChar"), m_replaceChar, 63);
PX_Long(pPX, _T("InputBufferSize"), m_inputBufferSize, 2048);
PX_Long(pPX, _T("OutputBufferSize"), m_outputBufferSize, 1024);
PX_Long(pPX, _T("ReadIntervalTimeout"), m_readIntervalTimeout, 100);
PX_Long(pPX, _T("ReadTotalTimeoutMultiplier"), m_readTotalTimeoutMultiplier, 0);
PX_Long(pPX, _T("ReadTotalTimeoutConstant"), m_readTotalTimeoutConstant, 0);
PX_Long(pPX, _T("WriteTotalTimeoutMultiplier"), m_writeTotalTimeoutMultiplier, 0);
PX_Long(pPX, _T("WriteTotalTimeoutConstant"), m_writeTotalTimeoutConstant, 0);
// TODO: Call PX_ functions for each persistent custom property.
}
/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::OnResetState()
{
COleControl::OnResetState(); // Resets defaults found in DoPropExchange
}
/////////////////////////////////////////////////////////////////////////////
//改變控件的屬性
/////////////////////////////////////////////////////////////////////////////
void CApexCommCtrl::OnPortIDChanged()
{
if (m_hCommFile != NULL) return;
SetModifiedFlag();
}
void CApexCommCtrl::OnBaudRateChanged()
{
if (m_baudRate<110) m_baudRate=110;
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnEnableParityChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnOutxCtsFlowChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnOutxDsrFlowChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnDtrControlChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnDsrSensitivityChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnTxContinueOnXoffChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnOutxXonXoffFlowChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnInxXonXoffFlowChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnReplaceWhenParityErrorChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnIgnoreNullCharChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnRtsControlChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnXonLimitChanged()
{
if (m_xonLimit<=0)
m_xonLimit=1;
else
if (m_xonLimit>m_outputBufferSize) m_xonLimit=(short) m_outputBufferSize;
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnXoffLimitChanged()
{
if (m_xoffLimit<= 0)
m_xoffLimit=1;
else
if (m_xoffLimit>m_inputBufferSize) m_xoffLimit=(short)m_inputBufferSize;
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnByteSizeChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnParityChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnStopBitsChanged()
{
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnXonCharChanged()
{
if (m_xonChar<0 || m_xonChar>127) m_xoffChar=17;
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnXoffCharChanged()
{
if (m_xoffChar<0 || m_xoffChar>127) m_xoffChar=19;
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnReplacedCharChanged()
{
if (m_replaceChar<0 || m_replaceChar>127) m_replaceChar=63;
if (m_hCommFile != NULL) SetPortState();
SetModifiedFlag();
}
void CApexCommCtrl::OnInputBufferSizeChanged()
{
if (m_inputBufferSize<128) m_inputBufferSize=128;
if (m_xoffLimit>m_inputBufferSize) m_xoffLimit=(short)m_inputBufferSize;
if (m_hCommFile != NULL)
if (SetupComm(m_hCommFile, m_inputBufferSize, m_outputBufferSize))
SetModifiedFlag();
}
void CApexCommCtrl::OnOutputBufferSizeChanged()
{
if (m_outputBufferSize<128) m_outputBufferSize=128;
if (m_xonLimit>m_outputBufferSize) m_xonLimit=(short)m_outputBufferSize;
if (m_hCommFile != NULL)
if (SetupComm(m_hCommFile, m_inputBufferSize, m_outputBufferSize))
SetModifiedFlag();
}
void CApexCommCtrl::OnReadIntervalTimeoutChanged()
{
if (m_readIntervalTimeout<0) m_readIntervalTimeout=0;
if (m_hCommFile != NULL) SetCommTimeState();
SetModifiedFlag();
}
void CApexCommCtrl::OnReadTotalTimeoutMultiplierChanged()
{
if (m_readTotalTimeoutMultiplier<0) m_readTotalTimeoutMultiplier=0;
if (m_hCommFile != NULL) SetCommTimeState();
SetModifiedFlag();
}
void CApexCommCtrl::OnReadTotalTimeoutConstantChanged()
{
if (m_readTotalTimeoutConstant<0) m_readTotalTimeoutConstant=0;
if (m_hCommFile != NULL) SetCommTimeState();
SetModifiedFlag();
}
void CApexCommCtrl::OnWriteTotalTimeoutMultiplierChanged()
{
if (m_writeTotalTimeoutMultiplier<0) m_writeTotalTimeoutMultiplier=0;
if (m_hCommFile != NULL) SetCommTimeState();
SetModifiedFlag();
}
void CApexCommCtrl::OnWriteTotalTimeoutConstantChanged()
{
if (m_writeTotalTimeoutConstant<0) m_writeTotalTimeoutConstant=0;
if (m_hCommFile != NULL) SetCommTimeState();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -