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

时间:2021-07-15 15:51:45

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