Visual C++6.0初学者实用技巧(MFC)

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编辑框中,你可以如下指定状态栏上的提示信息

 

16:使用中文VC(VC++在中文平台下可以使用中文,但编译后那些按钮上的、对话框上的中文都成ASCII码了)因为VC++在安装时是默认按单字节字符安装的,而中文字符是双字节编码,自然就不能正确显示了。

解决方法: 将VC++光盘上DEVSTUDIO/SHAREDIDE/BIN/IDE路径下的中文资源语言模块Appwzchs.dll拷贝至硬盘DevStudio/SharedIDE/BIN/IDE路径下即可。

 

17:位图按钮的使用(可产生动态效果)

选定要使用位图的按钮(以OK按钮为例,假设其标识符为IDOK),选其属性中的Owner draw选项(必须),此时,在对话框编辑器中就可看到原先显示在按钮上的字符都消失了。将按钮的Caption改为OK(必须为大写)。打开Insert菜单,单击其中的Resource选项,随后选择Bitmap。再按下Import(导入)按钮,将所需位图导入项目(Project)。在Resource View窗口中通过右键单击刚才导入的位图,将其ID(标识符)改为“OKU”(注意:字符必须为大写) 双引号及字母U必不可少。 字母U代表的按钮为按下状态时所显示的位图。 此外还可使用后缀D、F、X,分别表示按下、拥有输入焦点时、按钮处于无效状态时所显示的位图。通过对同一个按钮的不同状态使用不同的位图,很容易做出具有动态效果的按钮。 当将按钮所需使用的位图导入到项目中后,就应该在使用位图按钮的那个对话框的类声明文件中加入位图按钮变量的定义CBitmapButton m_OK。在用到Bitmap处,加入如下语句: m_BtonOK.AutoLoad(IDC_BtonOK) 使程序在运行时将位图装入内存并显示。 至此,创建位图按钮的整个步骤即告结束。

 

18:通用对话框的使用

大家都遇到过CFileDialog文件对话框吧,它的参数让人头疼.下面解除大家的头疼. 先在使用文件对话框的类的类定义文件中加入对象定义CFileDialog m_MyOpenDialog(TRUE,"avi","*.avi")。随后,在需要使用该对话框的地方加入以下语句: m_MyOpenDialog.Domodal(); 就可以预览所有.avi文件. 其调用规则为: 函数原型: CFileDialog(BOOL bOpenFileDialog,LPCTSTR lpszDefExt=NULL,LPCTSTR lpszFileName=NULL,DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPR OMPT,LPCTSTR lpszFilter=NULL,CWnd * pParentWnd =NULL); 参数说明: bOpenFileDialog:为TRUE或FALSE。TRUE为打开文件;FALSE为保存文件。 lpszDefExt :为缺省的扩展名。 lpszFileName :为显示在文件名组合框的编辑框的文件名,一般可选NULL dwFlags :为对话框风格,一般为OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,即隐藏只读选项和覆盖已有文件前提示。 LpszFilter :为下拉列表枢中显示文件类型。 pParentWnd :一般可选NULL。 例如:在文件类型列表框的编辑框要显示“可执行文件(*.exe)”,而在它的下拉列表框中列出“视频文件(*.avi)、All Files(*.*)”内容,则变量定义如下:CFileDialog m_MyOpenDialog(TRUE,"exe",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"可执行文件(*.exe) | *.exe|视频文件(*.bat) | *.bat |All Files (*.*) | *.* ||",NULL); 注:看看没有*.*后的||会是什么效果.

 

19:怎样添加无基类的类? 在ClassView中右键选new class,class type选 Generic Class,填上Class Name就可以了。

 

20:如何定义基于CObject的类? 按照问题4生成新类,手动在新类的头文件的class CYourClass后加上:public CObject. 形式如下: class CYourClass : public CObject 即可.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值