昨天在同事的建议下写了自己的第一篇博客,当然现在想想自己应该感到羞愧才对,学习编程,也有半年多了,正式开始使用编程语言进行工作也有几个月了,到现在都没有养成记录自己遇到的问题和新学到的知识技能.因为自己C语言用得少,之前的工作中很多时候都会遇到相同的问题,总是一遍又一遍的去进行百度查找方法,确实不应该,有了问题并知道解决问题的办法以后应该及时进行总结,防止下一次继续被同样的问题难住.
今天写一下自己开始使用MFC以来遇到的基础问题吧,都是一些基本的语法问题.
1.在使用MFC过程中遇到的字符串问题.
在C语言的标准库中,包含的字符串类型有std::string(单字节的字符)和std::wstring(宽字节的字符),定义字符串的方法一般就是使用""来定义,而MFC使用的是CString,定义字符串使用的是_T(""),_T()是一个宏定义,这样MFC会自动根据项目的字符集编码进行对字符的字节进行识别.
string 转 CString
CString.format("%s", string.c_str());
char 转 CString
CString.format("%s", char*);
char 转 string
string s(char *);
string 转 char *
char *p = string.c_str();
CString 转 string
string s(CString.GetBuffer());
2.在使用MFC过程中遇到的字符串匹配问题.
%c 字符
%f 浮点数
%e 浮点数指数输出
%g 浮点数不显示无意义的零
%i %d 有符号十进制整数
%u 无符号十进制整数
%o 八进制整数
%x(%X) 十六进制整数
%p 指针
%s 字符串
%% %号
%- 左对齐
%+ 右对齐
%-md 左对齐(m为位数)
%m.ns 输出m为取字符串左起n位,右补空格
%m.nf 输出浮点数,m为宽度,n为小数点右边位数
长度 h为短整型,l为长整型
使用.Format()进行字符串匹配,例如string1.Format(_T("%s%d"),string2,number); 将string2和number的数据匹配到string1中
使用sscanf_s()会将参数str的字符串根据参数format字符串来转换并格式化数据,例如sscanf(string1,_T("%s%d"),&string2,&number);将string1中的数据匹配到string2和number中.
3.使用串口接收数据并进行数据转换的问题.
在工作过程中需要使用串口进行数据的收发,一开始接收到的数据都是乱码,在同事的帮助下进行数据的格式转换,能够完整的显示出来数据了,在这里记录一下读取数据的过程.
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[12800];
if(MSCOMM_CONTROL.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=D_MSCOMM_PDM_CONTROL.get_Input();//读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
std::stringstream ss;
ss.clear();
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k);//字符型
ss << bt;
}
wstring TEMPSTRING = CodeConverter::AcsiiToUnicode(ss.str()); //ACSII码转Unicode方法
EDIT_TEMP_TEST_VALUE += TEMPSTRING.c_str();
}
4.对MFC中Dialog数据初始化的问题.
刚开始使用MFC的时候以为只是进行控件的拖拽(使用的为VS2012),然后在控件属性串口进行一些相关的数据配置,需要对控件添加一下响应事件则选择相应的选项就行了.后来同事建议我对空间数据初始化放在Dialog初始化方法 OnInitDialog() 中,一开始我还不以为然,后来程序遇到了问题,该显示的数据没有显示出来,这是后才意识到将初始化数据放在OnInitDialog()方法中的好处,对自己要进行初始化的数据一眼就可以看出来,而且方便修改,