作者在 2009-03-09 09:23:14 发布以下内容
Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意。作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助。
1:我怎样才能建立一个等待光标?
调用BeginWaitCursor函数来启动等待光标,调用EndWaitCursor函数 来结束等待光标。要注意,二者都要调用App的成员函数,如下所示:
AfxGetApp()->BeginWaitCursor(); // 要做的事 AfxGetApp()->EndWaitCursor();
2:什么是COLORREF? 我该怎样用它?
COLORREF是一个32-bit整型数值,它代表了一种颜色。你可以使用RGB函数来初始化COLORREF。
例如: COLORREF color = RGB(0, 255, 0); RGB函数接收三个0-255数值,一个代表红色,一个代表绿色,一个代表蓝色。在上面的例子中,红色和蓝色值都为0,所以在该颜色中没有红色和蓝色。绿色为最大值255。所以该颜色为绿色。0,0,0为黑色,255,255,255为白色。
3:我在我的程序中是了CDWordArray。我向它添加了约10,000个整数,这使得它变得非常非常慢。
CDWordArray是很好用的,只是因为你没有指定数组的最大尺寸。
因此,当你添加新元素时,该类会从堆中重新分配空间。不幸的是,该类会在每次插入新元素时都为数组重新分配空间。如果你向它添加了很多新元素,所有这些分配和复制数组的操作会就会使它变慢。
解决该问题的方法是,你可以使用SetSize 函数的第二个参数来改变这种重新分配的频率。例如,如果你把该参数设置为500 ,则每次数组空间超出时它才重新分配并添加500个新空间,而不是1个。这样一来 ,你就可以不用重新分配而添加了另外499个元素空间,这也会大大提高程序的运行速度。
4:AppWizard所产生的STDAFX文件是干什么用的?
它主要是协助产生预编译头文件的。通常你是不需要修改它的。
5:在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框?
MessageBox函数来自CWnd类,所以你只能在从CWnd继承的类(如CView)中调用它。但是,MFC也提供了AfxMessageBox函数,你可以在任何地方调用它。
6:我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该把它放到哪儿?
把该变量放到该应用程序类的头文件中的attribute处。然后,在程序的任何地方,你都可以用下面的方法来访问该变量:
CMyApp *m_App = (CMyApp *)AfxGetApp();
m_App->MyGlobalVariable = ...;
7:我听说MFC可以发现内存漏洞,我怎样使用该特性?
如果你在Debug菜单中的Go选项(不是Project菜单中的Execute选项)来运行你的应用程序,MFC应该在程序终止时报告内存漏洞。如果没有,那么试试运行MFC Tracer 工具程序(在VC++程序组中),并启动跟踪。然后返回应用程序。
8:我怎样才能在我的应用程序中循环浏览已经打开的文档?
使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数。
9:我怎样才能在我的应用程序中循环浏览已经打开的视?
使用CDocument中未公开的GetFirstViewPosition()和GetNextView()函数。
10:虚拟函数PreCreateWindow是干什么用的?
PreCreateWindow允许你在调用CreateWindow之前来改变窗口属性。
11:我应该怎样防止MFC在窗口标题栏上添加文档名?
在PreCreateWindow函数中删除FWS_ADDTOTITLE标志的窗口样式:
cs.style &= ~FWS_ADDTOTITLE ;
12:我应该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名?
在PreCreateWindow函数中删除FWS_PREFIXTITLE标志的窗口样式:
cs.style &= ~FWS_PREFIXTITLE;
13:我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象?
把“delete this”加到PostNcDestroy中。这主要用在需要自动删除对象的场合。
14:为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?
OnNcDestroy只被已建立的窗口调用。如果建立窗口失败(如PreCreateWindow), 则没有窗口处来发送WM_NCDESTROY消息。PostNcDestroy是在对象窗口被完全删除, 在OnNcDestroy后,甚至在窗口建立失败之后调用的。
15:File菜单中的MRU列表是从哪儿来的?列表中的名字放在哪儿了?我怎样才能改变列表中项目的最大值?
在应用程序类的InitInstance函数中对LoadStdProfileSettings的调用中。该调用接受一个参数(在缺省情况下如果没有传递值则为4)。MRU文件名是从INI文件中调用的。如果你有带有ID_FILE_MRU_FILE1的ID的菜单选项,它会为调入的MRU列表所替换。如果你改变传递给LoadStdProfileSettings的数值(最大为16),则你就改变了所装如文件名的最大值。
16:我在菜单中添加了新的项。但是,当我选该项时,在状态栏上没有出现任何提示信息。为什么?
打开资源文件中的菜单模板。打开新菜单选项的属性对话框。在对话框的底部的Prompt编辑框中,你可以如下指定状态栏上的提示信息和工具栏上的提示信息 (如果你已经建立的工具栏按钮): Status bar string\nFlying tag
1:我怎样才能建立一个等待光标?
调用BeginWaitCursor函数来启动等待光标,调用EndWaitCursor函数 来结束等待光标。要注意,二者都要调用App的成员函数,如下所示:
AfxGetApp()->BeginWaitCursor(); // 要做的事 AfxGetApp()->EndWaitCursor();
2:什么是COLORREF? 我该怎样用它?
COLORREF是一个32-bit整型数值,它代表了一种颜色。你可以使用RGB函数来初始化COLORREF。
例如: COLORREF color = RGB(0, 255, 0); RGB函数接收三个0-255数值,一个代表红色,一个代表绿色,一个代表蓝色。在上面的例子中,红色和蓝色值都为0,所以在该颜色中没有红色和蓝色。绿色为最大值255。所以该颜色为绿色。0,0,0为黑色,255,255,255为白色。
3:我在我的程序中是了CDWordArray。我向它添加了约10,000个整数,这使得它变得非常非常慢。
CDWordArray是很好用的,只是因为你没有指定数组的最大尺寸。
因此,当你添加新元素时,该类会从堆中重新分配空间。不幸的是,该类会在每次插入新元素时都为数组重新分配空间。如果你向它添加了很多新元素,所有这些分配和复制数组的操作会就会使它变慢。
解决该问题的方法是,你可以使用SetSize 函数的第二个参数来改变这种重新分配的频率。例如,如果你把该参数设置为500 ,则每次数组空间超出时它才重新分配并添加500个新空间,而不是1个。这样一来 ,你就可以不用重新分配而添加了另外499个元素空间,这也会大大提高程序的运行速度。
4:AppWizard所产生的STDAFX文件是干什么用的?
它主要是协助产生预编译头文件的。通常你是不需要修改它的。
5:在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框?
MessageBox函数来自CWnd类,所以你只能在从CWnd继承的类(如CView)中调用它。但是,MFC也提供了AfxMessageBox函数,你可以在任何地方调用它。
6:我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该把它放到哪儿?
把该变量放到该应用程序类的头文件中的attribute处。然后,在程序的任何地方,你都可以用下面的方法来访问该变量:
CMyApp *m_App = (CMyApp *)AfxGetApp();
m_App->MyGlobalVariable = ...;
7:我听说MFC可以发现内存漏洞,我怎样使用该特性?
如果你在Debug菜单中的Go选项(不是Project菜单中的Execute选项)来运行你的应用程序,MFC应该在程序终止时报告内存漏洞。如果没有,那么试试运行MFC Tracer 工具程序(在VC++程序组中),并启动跟踪。然后返回应用程序。
8:我怎样才能在我的应用程序中循环浏览已经打开的文档?
使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数。
9:我怎样才能在我的应用程序中循环浏览已经打开的视?
使用CDocument中未公开的GetFirstViewPosition()和GetNextView()函数。
10:虚拟函数PreCreateWindow是干什么用的?
PreCreateWindow允许你在调用CreateWindow之前来改变窗口属性。
11:我应该怎样防止MFC在窗口标题栏上添加文档名?
在PreCreateWindow函数中删除FWS_ADDTOTITLE标志的窗口样式:
cs.style &= ~FWS_ADDTOTITLE ;
12:我应该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名?
在PreCreateWindow函数中删除FWS_PREFIXTITLE标志的窗口样式:
cs.style &= ~FWS_PREFIXTITLE;
13:我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象?
把“delete this”加到PostNcDestroy中。这主要用在需要自动删除对象的场合。
14:为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?
OnNcDestroy只被已建立的窗口调用。如果建立窗口失败(如PreCreateWindow), 则没有窗口处来发送WM_NCDESTROY消息。PostNcDestroy是在对象窗口被完全删除, 在OnNcDestroy后,甚至在窗口建立失败之后调用的。
15:File菜单中的MRU列表是从哪儿来的?列表中的名字放在哪儿了?我怎样才能改变列表中项目的最大值?
在应用程序类的InitInstance函数中对LoadStdProfileSettings的调用中。该调用接受一个参数(在缺省情况下如果没有传递值则为4)。MRU文件名是从INI文件中调用的。如果你有带有ID_FILE_MRU_FILE1的ID的菜单选项,它会为调入的MRU列表所替换。如果你改变传递给LoadStdProfileSettings的数值(最大为16),则你就改变了所装如文件名的最大值。
16:我在菜单中添加了新的项。但是,当我选该项时,在状态栏上没有出现任何提示信息。为什么?
打开资源文件中的菜单模板。打开新菜单选项的属性对话框。在对话框的底部的Prompt编辑框中,你可以如下指定状态栏上的提示信息和工具栏上的提示信息 (如果你已经建立的工具栏按钮): Status bar string\nFlying tag