这应该是4-5年前了。 当年之会c#敲敲代码也不会C++但深信开发这东西只要思想有了。 只是语法问题。 对于C++这貌似只有大牛才能胜任的,而对于我来说是如此困难。 所以想想办法搞了很多通用类来避免C++中很多生疏的语法。
放出部分代码。如下图。
我们先以第一个为例:
ApplicationHelper为例:
看到这两个方法你想到什么了。 是的。 就是C#里的Application方法中的Doevent和startuppath方法。 由于C#中很多方法多需要自己手动的写。 而自己的经验积累的有限。 而且还局限于C#转行C++所以就只能写成这样了。 所以我想所的就是我上面的很多的类都是一C#为基础构造出来的避免再去了解过多的C++原理。何乐而不为!
在来看看里面的实现。
如有错误大家勿喷,本人对C++了解并不深。 但可以写C++项目仅此而已。
通用串口类 BCLSerialPort。 命名还是当年微软的mvc哈哈哈。 现在想想真有点囧!
1 // BCLSerialPort.h: interface for the BCLSerialPort class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_BCLSERIALPORT_H__86B3D83F_D22C_44F9_B138_40E3D480EDFB__INCLUDED_) 6 #define AFX_BCLSERIALPORT_H__86B3D83F_D22C_44F9_B138_40E3D480EDFB__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 typedef BOOL (CALLBACK* ONREAD)(const char * buf, DWORD dwBufLen, void* pContex); 13 14 #define READ_BUFFER_SIZE 1024 ///读取串口数据长度 15 #define READ_TIME_OUT 500 ///读超时 milliseconds 16 17 #define SERIALPOINT_DEFAULT 0 ///串口初始状态 18 #define SERIALPOINT_OPENED 1 ///串口已打开 19 #define SERIALPOINT_CLOSED 2 ///串口已关闭 20 21 22 class BCLSerialPort 23 { 24 public: 25 ///构造函数 26 BCLSerialPort(); 27 28 ///参数 comNo 串口号 29 ///参数 baudRate 波特率 30 BCLSerialPort(CString comNo, DWORD baudRate); 31 32 ///参数 comNo 串口号 33 ///参数 baudRate 波特率 34 ///参数 parity 校验位 35 ///参数 byteBit 数据位 36 ///参数 stopBit 停止位 37 BCLSerialPort(CString comNo, DWORD baudRate, DWORD parity, BYTE byteBit, BYTE stopBit); 38 39 ///打开串口 40 BOOL SerialPortOpen(); 41 ///关闭串口 42 void SerialPortClose(); 43 44 ///写串口 45 DWORD SerialPortWrite(LPCTSTR sBuf, DWORD dwToWrite); 46 ///读串口 47 BOOL SerialPortRead(LPTSTR sBuf, DWORD& dwRead); 48 49 virtual ~BCLSerialPort(); 50 51 public: 52 CString m_ComNo; ///串口号 53 DWORD m_BaudRate; ///波特率 54 BYTE m_ByteBit; ///数据位 55 BYTE m_StopBit; ///停止位 56 BYTE m_Parity; ///奇偶校验 (无校验-NOPARITY)(奇校验-ODDPARITY)(偶校验-EVENPARITY) 57 58 DWORD m_SendLength; ///发送数据长度 59 60 DWORD m_OpenState; ///串口打开状态 61 HANDLE h_Com; ///串口句柄 62 COMMTIMEOUTS m_CommTimeouts; ///串口超时 63 }; 64 65 #endif // !defined(AFX_BCLSERIALPORT_H__86B3D83F_D22C_44F9_B138_40E3D480EDFB__INCLUDED_)
通用Socket通讯类:
1 #pragma once 2 3 #include <winsock2.h> 4 #include <windows.h> 5 6 #pragma comment(lib,"ws2_32.lib") 7 8 #define WIN32_LEAN_AND_MEAN 9 #define MAX_RECIVE_SIZE (256*1024) 10 11 //定义连接断开事件 12 typedef void (CALLBACK* ONCLOSE)(void* pOwner); 13 //定义当有数据接收事件 14 typedef void (CALLBACK* ONTCPREAD)(void* pOwner, void* tsOwner, const char * buf, DWORD dwBufLen); 15 //定义Socket错误事件 16 typedef void (CALLBACK* ONTCPERROR)(void* pOwner,int nErrorCode); 17 18 class BCLTcpSocket 19 { 20 21 public: 22 BCLTcpSocket(); 23 virtual ~BCLTcpSocket(); 24 25 BOOL Connect(); //连接服务器 26 BOOL Close(void); //关闭 27 void CloseReciveThread(void); //关闭接收线程 28 29 void ReciveData(void); 30 BOOL Send(const char* data , int dwBufLen); //发送数据 31 void RegisteCallBack(ONCLOSE fClose, ONTCPREAD fRead, ONTCPERROR fError);// 设置处理回调接口 32 private: 33 HANDLE m_ExitReciveThread; //退出接收线程 34 static DWORD WINAPI Recive(LPVOID lparam); //接收数据 35 36 public: 37 SOCKET m_Socket; //Socket通讯句柄 38 HANDLE m_ReciveThread; //数据监听线程 39 40 DWORD m_ConnectState; //连接状态 -1未连接 0 连接成功 1 连接失败 41 DWORD m_ReciveThreadId; //接受线程ID 42 char m_Ip[255]; //ip地址 43 int m_Port; //端口号 44 char m_Data[MAX_RECIVE_SIZE]; //接受最大数据缓冲数据区 45 void* m_pOwner; //主线程指针 46 47 ONCLOSE OnClose; // 连接断开事件,回调函数 48 ONTCPREAD OnRead; // 接收数据事件,回调函数 49 ONTCPERROR OnError; // 发生错误事件,回调函数 50 };
数据库查询类 SearchCondition
1 #pragma once 2 #include <stdarg.h> 3 4 ///数据库条件 5 enum SqlOperator 6 { 7 Like = 0 , //模糊查询 8 LikeAt, //模糊查询匹配前面字符 9 LikeLast, //模糊查询匹配后面字符 10 NotLike, //不等于模糊查询匹配 11 Equal, //等于 12 NotEqual, //不等于 13 MoreThan, //大于、 14 MoreThanOrEqual, //大于等于 15 LessThan, //小于 16 LessThanOrEqual, //小于等于 17 In // 18 }; 19 20 class SearchCondition 21 { 22 public: 23 SearchCondition(); 24 virtual ~SearchCondition(); 25 26 ///获得条件 27 CString GetCondition(); 28 29 ///获得条件符号 30 CString GetSign(UINT operatorType); 31 32 ///清空条件语句 33 void NewSearchCondition(); 34 35 ///模糊查询 36 void SearchConditionLike(CString fied, CString value, CString likeStr); 37 38 ///模糊头查询 39 void SearchConditionLikeAt(CString fied, CString value, CString likeStr); 40 41 ///模糊尾查询 42 void SearchConditionLikeLast(CString fied, CString value, CString sign, CString likeStr); 43 44 ///模糊不包含查询 45 void SearchConditionNotLike(CString fied, CString value, CString sign, CString likeStr); 46 47 ///降序排序 48 void SearchConditionOrderByDesc(CString fied); 49 50 ///升序排序 51 void SearchConditionOrderByAsc(CString fied); 52 53 ///operatorType 数据库操作参数 fied 字段 value 值 sign 符号 likeStr 模糊查询符号 54 void SearchConditionAnd(CString fied, SqlOperator operatorType, CString value, CString sign); 55 56 ///operatorType 数据库操作参数 fied 字段 value 值 sign 符号 likeStr 模糊查询符号 57 void SearchConditionOr(CString fied, SqlOperator operatorType, CString value, CString sign); 58 59 60 public: 61 ///条件 62 CString m_Condition; 63 /// 64 SqlOperator m_SqlOperator; 65 };
通过以上写C++ 工控项目应该就不愁了。 串口, 有Socket通讯。 读写数据库。由于对C++不了解。 想用接口实现。后来才之后没接口概念。 通过需方法来代替。 这也给我提供了不少便利。
总结:都说C#转C++比较麻烦。在自己转向C++的过程中并没用出现太多的困难. 确实不是特别方便。 但是通过自己的逐步构造。 大多时候都将一些方法按照C#的命名方式转换过来。 这样写C++的代码跟写C#的一样。 感觉还是蛮爽的。
还望各路大神提供更牛X的方法!仅此提供给有需要c#转型C++的程序猿们一些思路。