WTL-学习疑问

写在文前:

仅仅是新手小白在学习C++和WTL过程中遇到的许多问题和解决方法,存在问题望大神指出~

1、double转cstring用format函数报错

答:因为WTL版本的Format方法不支持浮点,这跟MFC不一样!!!!我一开始就搞错了

需要转换的我用的是sprintf ,
会有安全性警告,在stdafx.h中最开头添加 #define _CRT_SECURE_NO_DEPRECATE
然后设置项目属性的预处理器定义添加_CRT_SECURE_NO_DEPRECATE
char s1[256];
sprintf(s1,"%lf",f);
r_str=CA2CT(s1);//使用CA2CT
r_str.TrimRight(_T(“0”));

2、 WTL的TrimRight() 和TrimLeft()方法

是用来剔除多余的空白空间,但是!MFC版本是剔除指定的任何字符/字符组,我之前用它来在MFC中剔除小数点后无效的0

3、在WTL中使用cstring

定义在atlmisc.h中,在前面加**上#define _WTL_USE_CSTRING,**否则会出问题滴~
在stdafx.h中添加#define _WTL_USE_CSTRING ,不然DDX_TEXT中就会报错重载问题,因为没有cstring
alddx要定义在atlmisc后,因为ddx_text会用到cstring

4、WTL单选判断

在MFC中设置单选按钮值((CButton)GetDlgItem(IDC_DEG)).SetCheck(1),但是 在WTL中Cwindow
用**CWindow::IsDlgButtonChecked(IDC_RAD)**来判断是否选中!

5、error RC2104: undefined keyword or key name 太坑了

其实是 有两种情况:
(1)就是网上能搜到的 如果升级VS工程,发现编辑了.rc后,出现这种编译错误基本上是由于升时,把*.rc中的#include <windows.h>去掉了,加了一个resouce.h,在**.**rc中将#include <windows.h>加上就可以了。
(2)有时候修改了rc还是出问题,非常有可能是控件重名。查看资源文件的代码,修改重名的控件及ID

6、WTL程序运行时中文显示乱码或者?号

这是资源文件*.rc中的语言设置
首先:LANGUAGE LANG_ENGLISH,LANG_ENGLISH_US修改为LANGUAGE LANG_CHINESE,LANG_CHINESE_SIMPLIFIED
然后:把下一行修改为**#pragma code_page(936)**
然后记得在下面控件名显示???的地方重新输入中文名

7、设置单选按钮的选中状态

CButton p = GetDlgItem(IDC_RADIO1);
p.SetCheck(1);
我在初始化对话框的时候设置按钮选中状态、

8、C++链表中为什么节点大多数采用的是结构体而不是类

节点里边一般只有成员变量,无成员函数,
而结构体里边的无修饰符的成员变量默认是public的,所以用结构体比类更方便
c++中类和结构体区别不大,都可以实现继承和多态

9/静态变量要在类外初始化

如:
在CMainDlg.h中定义static std::vector p;
在cpp实现文件中不能把初始化放在函数里,直接std::vector CMainDlg ::p(0);

10.调用对话框需要用到本对话框的变量时,通过对话框指针

如:
在CMainDlg.h中定义
static CMainDlg* mymaindlg;//对话框指针变量
在cpp文件中类外将指针变量初始化:
CMainDlg CMainDlg::mymaindlg = NULL;//对话框指针变量初始化 为空
并且在initDialog中
mymaindlg = this;
在调用该对话框变量的时候:
CMainDlg
mdlg = CMainDlg::mymaindlg;
people *p1= new people;//我自己的一个结构体
mdlg->p.push_back(*p1);//p是cmaindlg中的变量
注意:
记得做好dodataexchange,不然返回主对话框的时候数据没有从控件传递过来

11.获取tree中某节点的text和data

HTREEITEM hItem=m_tree.GetSelectedItem();
BSTR *strname=new BSTR();
 m_tree.GetItemText(hItem, *strname);
/CString strname1 = COLE2CT(*strname); //将BSTR转换为LPCTSTR,不可使用OLE2CT
/SysFreeString(*strname);
// 
 people* px = (people*)m_tree.GetItemData(hItem);
 item.mask = LVIF_PARAM;
people pi = *px;
m_list.InsertItem(ncount,pi.pname, 2);
	//将数据结构的指针作为treeitem的itemdata,在调用data的时候使用getiemdata

12. 有关 DoDataExchange()的详细内容

调用DoDataExchange()方法和在MFC中使用UpdateData()一样,DoDataExchange()的函数原型是:
BOOL DoDataExchange ( BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1 );
参数:bSaveAndValidate 指示数据传输方向的标志。
TRUE表示将数据从控件传输给变量,FALSE表示将数据从变量传输给控件。需要注意得是这个参数的默认值是FALSE,而MFC的UpdateData()函数的默认值是TRUE。为了方便记忆,你可以使用DDX_SAVE 和 DDX_LOAD标号(它们分别被定义为TRUE和FALSE)。

13. 添加资源-导入位图,在使用的时候需要手动保存一次,不然提示不能识别

  1. 如果在一个头文件food.h中类外定义了一个enum,如果animal.h中的类要用到这个枚举,include这个头文件,但是food,h如果再include“animal的话会报错,重定义或者未定义的符号

15. 不能将“this”指针从“const CFood”转换为“CFood &”

这是因为非常量成员函数调用了常量对象,如果这个函数不改变变量值,那么在函数参数列表后面加const,意思是这个函数是只读函数,不会改变变量值

16. MVC 界面和数据一定要分离,view model control之间的分离与数据传递关系

17. m_ComboGender.Attach(GetDlgItem(IDC_comboGender));

将控制变量与IDC_comboGender联系起来

18. 函数return报错?运行结束了就报错,可能是指针的问题,传入的对象用指针;或者内部指针有问题,内存泄漏,;

19. 提示读取地址访问冲突时,

访问非法的内存地址;new 的空间没有释放,或者提前释放访问了野指针,或者访问了超出已开辟的空间地址大小;参数没有进行初始化,导数访问冲突这种情况。

21. cstring不是ATL的成员,因为我拷贝到另一台电脑上,附加包含目录有问题,把包含目录地址修改一下就好了。

22. 如果发现添加的控件不响应了,一方面检查消息映射是否正确,另一方面检查控件是否重名或者ID重复

23. 当你发现主对话框运行不出来的时候,要么被你隐藏了,大概率是初始化函数中有问题,断点调试一下就可以发现

24. 如果是子对话框没有跳出,那么可能是消息映射有问题,或者是resource中控件名重复

25. 函数返回对象,不能用NULL,也不能用空对象,可以改为返回指针,指针可以为NULL

26.

在使用tree控件的时候用GetItemText获取选中节点的text时总是提示用BSTR,但是我想获得Cstring,就做了个转换//获取节点text

	//获取树控件节点的TEXT  cstring
	BSTR *strName=new BSTR();
	m_tree.GetItemText(selhtitem, *strName);
	CString strName1 = COLE2CT(*strName); //将BSTR转换为LPCTSTR,不可使用OLE2CT
	SysFreeString(*strName);
	m_tree.DeleteItem(selhtitem);

27. map的key查找value[],根据value找key则需要迭代器

例如我的结构体Stuff中成员stuffGender 是枚举类型,我又定义了一个map将对应string和枚举类型对上,在map根据value查找key的时候用迭代器找
enum GENDER{female,male};
Stuff()
{
m_mapGender[“女”]=female;
m_mapGender[“男”]=male;
}
std::mapstd::string,GENDER m_mapGender;

for(std::map<std::string,GENDER>::iterator it = selStuff->m_mapGender.begin();it!=selStuff->m_mapGender.end();it++) 
		{
			if(it->second==selStuff->stuffGender)
			{
				CString strGender(it->first.c_str());
				m_list.SetItemText(ncount,3,strGender);
			}
		} 

28. atlcom.h requires atlbase.h to be included first或者atlapp.h requires…

这是因为:atl与mfc混合使用的项目中,在stdafx.h中要先包含atlbase.h

29. 在使用指针的时候遇到的空指针问题,转自https://blog.csdn.net/qq_18108083/article/details/84346655

NULL在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况

30 转自https://blog.csdn.net/pyl88429/article/details/96482516

错误:mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file
由于VC需要把生成的文件中嵌入MANIFEST文件,而由于杀毒软件之类的会握有这个文件句柄(因为杀毒软件发现这个EXE,DLL正在读写),于是VC就写不进去了,方法是暂时关闭杀毒软件,这样就不用改写MANIFECT
除了这个博主的还有就是金山毒霸也有这个问题 ,我直接卸载了

网上搜到的解决办法:项目属性——配置属性——链接器——清单文件中, 把生成清单改成否就行了。
在项目属性——配置属性——清单工具——输入和输出中,把嵌入清单改成否也可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值