有人可以告诉我类private和protected成员之间的区别吗?
我从最佳实践约定中了解到应该在类外部调用的变量和函数private- 但是看看我的MFC项目,MFC似乎更喜欢protected.
有什么区别,我应该使用哪个?
假设我只使用它们用于"普通"GUI程序(没有COM,没有ActiveX,没有什么花哨的东西),我将在ATL和MFC之间看到的根本区别是什么,以帮助我找出使用哪一个?
我在网上做了一些搜索,但最终没有一个答案真的回答了我的问题:
http://msdn.microsoft.com/en-us/library/bk8ytxz5(v=vs.80).aspx:
"ATL是一种快速,简便的方法,可以在C++中创建COM组件并保持较小的占用空间.如果您不需要MFC自动提供的所有内置功能,请使用ATL创建控件."
没有真正回答我的问题,因为:
我不和COM合作.
这是否意味着MFC 是不是快吗?为什么/怎么样?
"MFC允许您创建完整的应用程序,ActiveX控件和活动文档.如果您已经使用MFC创建了一个控件,您可能希望继续在MFC中进行开发.在创建新控件时,如果您不需要,请考虑使用ATL所有MFC的内置功能."
也不回答我的问题,因为:
我甚至不知道ActiveX 是什么.
看起来微软似乎不鼓励使用MFC,但我无法弄清楚原因.
MFC的"内置功能" 到底是什么ATL没有提供?
一般来说,这不能回答我的问题,因为它没有解释它们背后的缺点和原因.
因为直接或间接,一切似乎都链接回上一页:
如何决定是否将ATL,MFC,Win32或CLR用于新的C++项目?
"ATL和MFC在两者之间做出决定有点棘手. [[不开玩笑!]] 我会引用你的MSDN页面进行选择,以便在它们之间作出决定."
显然,这不能回答我的问题.:)
http://www.codeguru.com/forum/archive/index.php/t-64778.html
等等
我目前观察到的(在过去几天内,在尝试学习两者时):
但它们之间似乎没有任何架构差异:
BEGIN_MSG_MAP与BEGIN_MESSAGE_MAP...大不了)CWndvs.CWindow但是,如果除了编译时与运行时方面之外没有真正的区别,那么为什么它们都存在呢?其中一个不应该足够吗?
我在这里错过了什么?
什么区别LPCSTR,LPCTSTR和LPTSTR?
为什么我们需要这样做才能将字符串转换为LV/ _ITEMstructure变量pszText:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Run Code Online (Sandbox Code Playgroud) CString非常方便,同时std::string与STL容器更兼容.我在用hash_map.但是,hash_map不支持CString作为键,所以我想转换CString成std::string.
编写CString哈希函数似乎需要花费很多时间.
CString -----> std::string
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
std::string -----> CString:
inline CString toCString(std::string const& str)
{
return CString(str.c_str());
}
Run Code Online (Sandbox Code Playgroud)
我对吗?
编辑:
以下是更多问题:
我怎么能转换wstring,CString彼此?
//wstring -> CString,
std::wstring src;
CString result(src.c_str());
//CString->wstring.
CString src;
::std::wstring des(src.GetString());
Run Code Online (Sandbox Code Playgroud)
有什么问题吗?
我怎么能转换std::wstring,std::string彼此?
我刚刚开始我的第一个C++项目.我正在使用Visual Studio 2008.它是一个单一窗体的Windows应用程序,可以访问几个数据库并启动WebSphere MQ事务.我基本上理解ATL,MFC,Win32(实际上我对它有点模糊)和CLR之间的差异,但我对如何选择感到茫然.
这些中的一个或多个是为了向后兼容吗?
CLR 是个坏主意吗?
任何建议赞赏.
编辑: 我为这个项目选择了C++,原因是我没有在帖子中介绍,这些并不完全是技术性的.所以,假设 C++是唯一/最佳选择,我应该选择哪个?
如何在我的Unicode MFC应用程序中转换CString为const char*?
我的同事正在使用Visual Studio 2002并使用C++ MFC.我正在用C#开发.
它之前没有任何问题,但现在质疑我们的客户是否真的应该在不同的环境中发展.我的同事们(当然)认为我应该转向C++ MFC.我认为他们可以使用.NET而不是MFC.
有没有理由学习MFC?感觉有点过时了,还是我错了?与MFC相比,针对.NET和.NET的争论是什么?
编辑:
我们正在为核工业开发过程系统和辅助应用.主要应用程序是模拟旧计算机系统并使用C++/MFC的模拟器.它是非常关键的时间,也许它应该仍然是原生C++中的核心.但是仿真器和所有周围应用程序的GUI并不是特别关键.
您是否应该更换现有的MFC应用程序?
下面的图片(放大,因此您最好看到差异)显示动态创建的编辑控件(上面的两个示例)和从对话框编辑器(下面的示例)创建的编辑控件之间的字体差异.如何使我动态创建的CEdit控件的字体看起来像默认(下面的示例)?

我创建了CEdit控件,如下所示:
obj->CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
rect.left, rect.top, rect.Width(), rect.Height(),
GetSafeHwnd(), reinterpret_cast<HMENU>(mId));
obj->SetFont(&mFont); // mFont was created in the Dialog Constructor
// with mFont.CreatePointFont(80, _T("MS Shell Dlg"));
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我有一个类,让我们说CAppPath有一个静态方法:
public:
static CString GetAppPath();
Run Code Online (Sandbox Code Playgroud)
并在CAppPath.cpp其中定义为:
CString CAppPath::GetAppPath()
{
return "C:\..\MypAth";
}
Run Code Online (Sandbox Code Playgroud)
现在我有另一个班CXMLHandler,我已经加入CAppPath.h了.但是我如何调用该GetAppPath()方法?我试过了:
#include "CAppPath.h"
void CXMLHandler::MyMethod
{
CNDSClientDlg->GetAppPath();
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我应该如何访问此方法?由于它是一个静态方法,我是否需要创建该类的对象,还是应该使该类本身是静态的?