用VS2008写MFC时遇到的问题汇总
来源:互联网 发布:ubuntu永久关闭防火墙 编辑:程序博客网 时间:2024/04/30 07:49
转载自:http://blog.csdn.net/sduyyy/article/details/6309660
1.VC2005:无法执行添加/移除操作,因为代码元素是只读的....多个解决办法
最近在编程过程中偶尔会遇到这个错误, 非常烦人, 因为一旦添加事件处理函数就会弹出这个窗口
解决方案:
1、重启VC
2、打开Resource.h文件看看 一看就知道了 有些定义重复了 可以手动改掉 保存 编辑器重新加载 。。。。。。。。
3、关闭解决方案,删除ncb文件重新添加即可
4、实在不行就手动添加消息处理
5、查看.h和.cpp文件的属性,有可能是只读的,修改属性后就可以了
6、把你要添加事件的对话框相应的类文件(*.h和*.cpp)给关了就可以了
上面几种方法网上搜罗的。推荐第3种。
PS:第三种办法确实是有效的!
2、mfc编程怎么用编辑框输入值并用另一个编辑框输出内容
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.
3、MFC中CString转换成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);
4、strcpy_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中的字符。
5、char型字符串转换为十六进制整数问题
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++)
- 用VS2008写MFC时遇到的问题汇总
- 用VS2008写MFC时遇到的问题汇总
- 用VS2005写MFC时遇到的问题汇总
- vs2008 MFC 开发问题汇总
- vs2008 MFC 开发问题汇总
- vs2008 MFC 开发问题汇总
- vs2008 MFC 开发问题汇总
- vs2008 MFC 开发问题汇总
- vs2008 MFC 开发问题汇总
- MFC+opencv遇到的问题汇总
- vs2008中的MFC用共享DLL和静态中使用MFC,遇到的问题
- VS2008 MFC C++ 遇到的一些小问题总结一
- VS2008下MFC框架下开发ActiveX项目所遇到问题汇总
- 卸载VS2008时可能遇到的问题
- MFC写的一个界面遇到的问题
- 使用VS2008 遇到的问题
- vs2008调试遇到的问题
- 遇到的问题汇总
- row_.* 处出现 “未定义列”
- iPhone Instruments工具使用
- 《算法竞赛入门经典》勘误表
- sql语句创建表前怎么选中数据库
- iphone开发中遇到的错误
- 用VS2008写MFC时遇到的问题汇总
- Linuxx 2.6内核可加载模块的编译
- 在DLL工程中引用ShareMem单元问题
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 第一篇工作日志
- Android ViewFlipper触摸动画
- 【书摘】黑客与画家——设计者的品味
- 经典的单例模式
- 解读Android LOG机制的实现:(4)LOG设备驱动Logger