用VS2005写MFC时遇到的问题汇总

时间:2022-10-31 19:47:38

1.VC2005:无法执行添加/移除操作,因为代码元素是只读的....多个解决办法

最近在编程过程中偶尔会遇到这个错误, 非常烦人, 因为一旦添加事件处理函数就会弹出这个窗口

解决方案:
1
、重启VC
2
、打开Resource.h文件看看 一看就知道了 有些定义重复了 可以手动改掉 保存 编辑器重新加载 。。。。。。。。

3
、关闭解决方案,删除ncb文件重新添加即可
4
、实在不行就手动添加消息处理
5
、查看.h.cpp文件的属性,有可能是只读的,修改属性后就可以了
6
、把你要添加事件的对话框相应的类文件(*.h*.cpp)给关了就可以了
上面几种方法网上搜罗的。推荐第3种。 

PS:第三种办法确实是有效的!

 

2mfc编程怎么用编辑框输入值并用另一个编辑框输出内容

 

void CMy11Dlg::OnButton1() 
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_EDIT1,str);

//GetDlgItemText(文本框ID,字符串),将文本框内容存放到字符串中.
SetDlgItemText(IDC_EDIT2,str);

//SetDlgItemText(文本框ID,字符串),将文本框的内容设置为字符串的内容.
}

 

至于需要用文本框的内容计算.

如果内容是数字的话. 可以通过int t=atoi(str);将其转换int类型.

计算完成后,将结果Format到字符串中.

:

int t=atoi(str);
t+=2;
str.Format("%d",t);

//在文本框1输入12, 文本框2的内容就是14.

3MFCCString转换成char数组的问题

 
 

由于结构体中用到联合体(联合体需要确定分配内存分配大小)或其它因素,需要用char数组来保存字符串,但是在MFC中一般都是用CString来存放字条串。关于它们之间的转换,在VS2008中有时会出现异常情况。在MSDN是这样写的:

    CString orig("Hello, World!");

    // Convert to a char*
    const size_t newsize = 100;
    char nstring[newsize];
    strcpy_s(nstring, orig);


       
但在实际应用中,并不能通过,总会在strcpy_s()函数中出错,或者在nstring的后面跟着很多乱码尾巴。在网上查阅了一些方法。如下:

方法一:
char *p;
CString str="hello";
p=str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
方法二
:
CString str="hello";
char ch[20];
memcpy(ch,str,str.GetLength());
方法三
:
char *ch;
CString str="hello";
ch=(LPSTR)(LPCTSTR)str;

但总达不到期望的结果。随后再在网上查,发现是Unicode字符集的问题。选择项目->项目属性(或直接按alt+F7->配置属性,在右边找到字符集,将使用Unicode字符集改为使用多字节字符集。保存之后需要重新生成解决方案。这样上面的方法都可以通过并实现,但是在方法二中,最好不要使用memcpy,直接用strcpy_s(char*, CString)就可以了,因为用memcpy也会出现乱码尾巴。

如果不想改变Unicode字符集,网上也有介绍方法,在此列出来供网友们参考:

CString strPath = L"adfafs主声音文件fsfsa";
int nLength = strPath.GetLength();
int nBytes = WideCharToMultiByte(CP_ACP,0,strPath,nLength,NULL,0,NULL,NULL);
char* VoicePath = new char[ nBytes + 1];
memset(VoicePath,0,nLength + 1);
WideCharToMultiByte(CP_OEMCP, 0, strPath, nLength, VoicePath, nBytes, NULL, NULL);
VoicePath[nBytes] = 0;

 

用多字节编码的话可以试试这个

    char temp[4];

    CString str = _T("23");

    char* pchar = str.GetBuffer(0);

    strcpy(temp,pchar);

如果是unicode编码的话,用这个

    char temp[4];

    CString str = _T("23");

    USES_CONVERSION;

    char* pchar = _T("");

    pchar = W2A(str);

    strcpy(temp,pchar);

 

4strcpy_s Buffer is too small 解决方法

错误信息如下:

Microsoft Visual C++ Debug Library

Debug Assertion Failed!

Program: ######.exe
File: ./tcscpy_s.inl
Line: 30

Expression: (L"Buffer is too small" && 0)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

Abort Retry Ignore

函数声明如下:

         strcpy_s(char *strDestination, size_t sizeInBytes, const char *strSource );

问题就出在第二个参数上,sizeInBytes的值必须比strSource 存放的字符数大1。比如strSource 6个字符,sizeInBytes的值就应该为7,多出来这个用来添加字符串的结束符'/0';

一般用法如下:

strcpy_s(strDestination, strlen(strSource )+1, strSource );

注:strDestination必须有足够的空间存放strSource中的字符。

5char型字符串转换为十六进制整数问题

int main()

{

    char a[9]="1234567a";

    long b=0x1;

    sscanf(a,"%x",&b);

    printf("%x",b);

    return 0;

}

6、警告信息 warning C4018: 有符号/无符号不匹配

--------------------------------------------------------------------

仔细研究之后发现是进行了与v.size()有关的操作引起的,用其中容器中与size()是被定义为unsigned int 型,而我们在遍历时会用int型导致警告的产生,因此在int 前面添加 unsigned即可。

例子如下:

1.   /** 

2.       求向量中所有元素的交错和 

3.       @param v欲求交错和的向量 

4.       @return 返回所有元素的交错和 

5.   */  

6.   double alternating_sum(const vector<double>& v)  

7.   {  

8.       if(v.size()==0) return false;  

9.       double sum=0.0;  

10.      for(unsigned int i=0;i<v.size();i++)  

11.      {  

12.          if(i%2==0)  

13.              sum+=v[i];  

14.          else sum-=v[i];  

15.      }  

16.      return sum;  

17.  }  

-------------------------------------------------------------

上面的函数中 for循环中的i设置为unsigned int

 for(unsigned int i=0;i<v.size();i++)
------------------------------------------------------------