VC宏定义如何用? VC中很多宏定义,MFC也是靠一堆宏定义给搭建的!到底有多少宏定义,如何利用这些宏定义!?还请高手们一一指教!MFC帮助中都是英文的,看不太懂!而且越详细越好! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在MFC中一个项目中自建的宏,基本包括DECLARE_MESSAGE_MAP()、BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()、BEGIN_MESSAGE_MAP(CXXXXAppDlg, CDialog)END_MESSAGE_MAP()等等,很多都是在你对工程进行搭建的过程中在相应的宏中添加内容代码,比如说我要对某一个对话框添加WM_COPYDATA消息,就会在BEGIN_MESSAGE_MAP(CXXXXAppDlg, CDialog)END_MESSAGE_MAP()中添加一句:ON_WM_COPYDATA(),当然还有其他的实现函数部分具体看看这个吧:http://wenku.baidu.com/view/c39b4c0e7cd184254b353589.html 楼主可以去看看 深入浅出MFC. 这个问题很泛咯 o(∩_∩)o宏只是手段,是微观的;学习MFC应该从宏观入手,多关注机制方面。如文档-视图-框架机制、消息映射机制、对话框的数据交互机制(DDX)、命令执行与状态更新机制(command/update_command_ui)等。 MFC中的宏都是为了MFC这个框架而存在,方便你的实际编程你自己开发程序,一般不必去关注宏但了解宏用助于你深入了解MFC,比如,动态创建,消息映射循环,文件的写入与读取等 找了些东西,我是想要这些东西,对于宏而言,我不是恐惧,MFC就是宏搭起的框架,只是想更多了解#Pragma 指令 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。其格式一般为 #Pragma Para 其中Para 为参数,下面来看一些常用的参数。 message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#Pragma message(“消息文本”) 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif 当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 另一个使用得比较多的pragma参数是code_seg。格式如:#pragma code_seg( ["section-name"[,"section-class"] ] ) 它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 最后一个比较常用的就是上面所说的#pragma once 指令了。 VC预定义的宏 在VC中有一类宏并不是由用户用#define语句定义的,而是编译器本身就能够识别它们。这些宏的作用也是相当大的。让我们来看第一个,也是MFC中使用得最频繁的一个:__FILE__ 。 当编译器遇到这个宏时就把它展开成当前被编译文件的文件名。好了,我们马上就可以想到可以用它来做什么,当应用程序发生错误时,我们可以报告这个错误发生的程序代码在哪个文件里,比方在文件test.cpp中有这样的代码:try{char * p=new(char[10]);}catch(CException *e ){TRACE(“ there is an error in file: %s\n”,__FILE__);} 在程序运行的时候,如果内存分配出现了错误,那么在调试窗口中会出现there is an error in file: test.cpp 这句话,当然,我们还可以把这个错误信息显示在别的地方。 如果我们还能够记录错误发生在哪一行就好了,幸运的是,与__FILE__宏定义一样,还有一个宏记录了当前代码所在的行数,这个宏是__LINE__。使用上面的两个宏,我们可以写出一个类似于VC提供的ASSERT语句。下面是方法#define MyAssert(x) \if(!(x)) \MessageBox(__FILE__,__LINE__,NULL,MB_OK); 我们在应用程序中可以象使用ASSERT语句一样使用它,在错误发生时,它会弹出一个对话框,其标题和内容告诉了我们错误发生的文件和代码行号,方便我们的调试,这对于不能使用ASSERT语句的项目来说是非常有用的。 除了这两个宏以外,还有记录编译时间的__TIME__,记录日期的__DATE__,以及记录文件修改时间的__TIMESTAMP__宏。 使用这些预定义的宏,我们几乎可以生成和VC能够生成的一样完整的源代码信息报表。 表达得太好了,学习MFC应该从大到小,从广到细,从动态机制到静态概念学习,要抓大局,重细节! 考考你。。。 想在屏幕上写字,应该怎样设置字体? DirectX使用问题 棘手的问题,ocx调用导出类dll,怎么调用? vc如何读取3ds文件 VC6。0不能装在XP上吗? 有关绘图的简单问题 关于 PreCreateWindow 探讨:Windows的画图类是否存在内存泄露!!! 套接字的一个函数问题???? http post文件,HttpSendRequestEx报错error_http_header_not_found? 高分请教,vc6.0中使用ADO数据库??????
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()、BEGIN_MESSAGE_MAP(CXXXXAppDlg, CDialog)
END_MESSAGE_MAP()
等等,很多都是在你对工程进行搭建的过程中在相应的宏中添加内容代码,比如说我要对某一个对话框添加WM_COPYDATA消息,就会在
BEGIN_MESSAGE_MAP(CXXXXAppDlg, CDialog)
END_MESSAGE_MAP()中添加一句:ON_WM_COPYDATA(),当然还有其他的实现函数部分具体看看这个吧:http://wenku.baidu.com/view/c39b4c0e7cd184254b353589.html
如文档-视图-框架机制、消息映射机制、对话框的数据交互机制(DDX)、
命令执行与状态更新机制(command/update_command_ui)等。
你自己开发程序,一般不必去关注宏
但了解宏用助于你深入了解MFC,比如,动态创建,消息映射循环,文件的写入与读取等
#Pragma 指令 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。其格式一般为 #Pragma Para 其中Para 为参数,下面来看一些常用的参数。 message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#Pragma message(“消息文本”) 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif 当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 另一个使用得比较多的pragma参数是code_seg。格式如:#pragma code_seg( ["section-name"[,"section-class"] ] ) 它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 最后一个比较常用的就是上面所说的#pragma once 指令了。 VC预定义的宏 在VC中有一类宏并不是由用户用#define语句定义的,而是编译器本身就能够识别它们。这些宏的作用也是相当大的。让我们来看第一个,也是MFC中使用得最频繁的一个:__FILE__ 。 当编译器遇到这个宏时就把它展开成当前被编译文件的文件名。好了,我们马上就可以想到可以用它来做什么,当应用程序发生错误时,我们可以报告这个错误发生的程序代码在哪个文件里,比方在文件test.cpp中有这样的代码:try
{
char * p=new(char[10]);
}
catch(CException *e )
{
TRACE(“ there is an error in file: %s\n”,__FILE__);
} 在程序运行的时候,如果内存分配出现了错误,那么在调试窗口中会出现there is an error in file: test.cpp 这句话,当然,我们还可以把这个错误信息显示在别的地方。 如果我们还能够记录错误发生在哪一行就好了,幸运的是,与__FILE__宏定义一样,还有一个宏记录了当前代码所在的行数,这个宏是__LINE__。使用上面的两个宏,我们可以写出一个类似于VC提供的ASSERT语句。下面是方法#define MyAssert(x) \
if(!(x)) \
MessageBox(__FILE__,__LINE__,NULL,MB_OK); 我们在应用程序中可以象使用ASSERT语句一样使用它,在错误发生时,它会弹出一个对话框,其标题和内容告诉了我们错误发生的文件和代码行号,方便我们的调试,这对于不能使用ASSERT语句的项目来说是非常有用的。 除了这两个宏以外,还有记录编译时间的__TIME__,记录日期的__DATE__,以及记录文件修改时间的__TIMESTAMP__宏。 使用这些预定义的宏,我们几乎可以生成和VC能够生成的一样完整的源代码信息报表。
表达得太好了,学习MFC应该从大到小,从广到细,从动态机制到静态概念学习,要抓大局,重细节!