使用MFC过程中遇到的问题以及解决方法(二)

    xiaoxiao2021-03-25  75

    昨天在同事的建议下写了自己的第一篇博客,当然现在想想自己应该感到羞愧才对,学习编程,也有半年多了,正式开始使用编程语言进行工作也有几个月了,到现在都没有养成记录自己遇到的问题和新学到的知识技能.因为自己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()方法中的好处,对自己要进行初始化的数据一眼就可以看出来,而且方便修改,

    转载请注明原文地址: https://ju.6miu.com/read-15652.html

    最新回复(0)