var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年04月29日

    MFC的变化

    分类:

    一、         VC 6.0中的MFC ClassWizardVisual Studio 2005开始已被分拆成两个功能:

    1.     对控件和菜单建立事件映射的功能

    菜单视图(View)->Solution ExplorerCtrl+W,SResource Files树下,在资源视图(通过双击资源文件*.rc可进入该视图)选中某一个菜单或者控件,右键其中的某项,在弹出的菜单中选择“添加事件处理程序”(Add Event Handler...),接下来就能找到VS 6中类似Message Maps的选项;

    2.     添加窗体的消息映射

    菜单视图(View)->类视图(Class View)Ctrl+W,C进入类视图单击类,右键此类选中“属性”(Properties),进入属性界面,其上有事件(Events)、消息(Messages)、重写(Overrides)等。对比VS 6没有了Automation(以前称作OLE自动化,COM IDispatch接口)选项。

    Visual Studio 2005开始有了MFC Class Wizard,不过是在类视图中选中项目,右键Add->Class,选中MFC->MFC Class,点击Add后才出现的。

     

    二、         Visual Studio 2005环境起,字符串如"Microsoft"无法自动转换为LPCTSTR类型,解决方法见微软FAQ: Cannot convert from 'const char [..]' to 'LPCTSTR'

     

    三、         *View.h消息映射中

    //{{AFX_MSG(*)

    ...

    //}}AFX_MSG

    这两个AFX_MSG注释宏不再存在,其中*代表建立的项目名。

    同样在*View.cpp消息映射中注释宏AFX_MSG_MAP也不再存在了。

     

    四、         连接*.lib。在VC6.0中是在Project->Setting中设置,而自Visual Studio 2005起,菜单Project->Properties,设置lib路径(只存在VS2005中):Configuration Properties->General->Addition Library Directories,添加lib:Configuration Properties->Linker->Input->Addition Dependences

     

    五、         Visual C++ Components目录VC 7.0就已被移除,原先在VC++ 6.0中的操作为:菜单Project->Add To Project->Components and Controls->Visual C++ Components->Popup Menu.Net环境项目可以通过工具 (Tools) ->选择工具箱项 (Choose Toolbox Items) 进行; MFC中添加Popup Menu可以通过向View类中添加消息WM_CONTEXTMENU进行。Splash Screen 组件也因此不存在,但可以参照Microsoft Visual Studio 9.0\Samples\1033\AllVCLanghageSamples.zip中拷贝出splash.cppsplash.h这两个文件加入到现有项目中或者对话框增强版

     

    六、         Visual Studio 2003起,控件通知消息WM_INITDIALOG移到了重写(Overrides)里面,重写里的方法OnInitDialog()对应WM_INITDIALOG消息。

     

    七、         VS2005起对消息的检查更为严格,VC6中没问题的

    ON_MESSAGE(message,OnMyMessage);

    返回值必须规范为LRESULT

    afx_msg LRESULT OnMyMessage(WPARAM, LPARAM)

    返回值可以为TRUE或者FALSE 

     

    八、         Components里添加ActiveX(基于COM)不再可行,自VS2005以来中需要Add Class->MFC Class From ActiveX Control,点Add,窗口Add Class From ActiveX Control Wizard显现。 

     

    九、         ActiveX Control Test Containertstcon32.exe,默认保存在%programfiles%\Microsoft Visual Studio 9.0\Common7\Tools\目录中,但从VS2008起已被移除,VS2005是最后一个包含它的版本,如想获取它可以自行编译TSTCON sample或者单独获取其早期版本。

     

    【资源】

    ActivexOLECOMOCXDLL之间有什么区别?

     

    【附录】

    ALPCTSTR

    LPCTSTR = Long Pointer to a Const TCHAR STRing

    LP表示长指针,这是为了兼容Windows 3.116位操作系统遗留下来的,在win32中以及其它32位操作系统中,long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。

    P表示是指针。

    C表示是常量即const

    TWin32环境中是一个_T宏,这个宏用来表示你的字符是否使用UNICODE。如果你的程序定义了UNICODE或者其它相关的宏,那么这个字符或者字符串将被作为UNICODE字符串, 否则就是标准的ANSI字符串。

    STR表示这个变量是字符串。

    所以LPCTSTR就表示一个指向长地址的可以根据一些宏定义改变语义的固定字符串。

    完整定义见WinNT.h

    分享到: