VC++给人的第一感觉便是过于专业化,高深和晦涩。其实也并非如此,在基
本掌握了它之后你就会发现,VC++使用起来是很方便的。至于说难,那是有点。
但这并非是VC++的过错,而是Windows,这个庞大无比对用户亲切之至却对程序员
不那么友好的家伙。再说,VC++系出自名门,微软的哪样东西不是先把你服侍得
舒舒服服,然后再把你口袋中的钱掏个精光呢?好,下面就向大家介绍几个在使
用中的小技巧。
1.使用中文
VC++从1.5版到现在的6.0版,好像还没有出现过像VB一样的中文版。大概是
Microsoft认为能够用VC++编程的人英文水平都很高吧,但这对用户可不行啊。
VC++在中文平台下可以使用中文,但编译后那些按钮上的、对话框上的中文都成
ASCII码了。何故?因为VC++在安装时是默认按单词节字符安装的,而中文字符是
双字节编码,自然就不能正确显示了。要解决这个问题其实也很容易,将VC++光
盘上DEVSTUDIOSHAREDIDEBINIDE路径下的中文资源语言模块Appwzchs.dll拷贝至
硬盘DevStudioSharedIDEBINIDE路径下即可。
2.位图按钮的使用
我们知道Windows是一个图形界面的操作系统,如果在我们的应用程序中加入
一些图形的话,会起到锦上添花的效果。在VC++中使用位图,并不像在VB中信手
拈来那么简单。不过也并不复杂,其中以位图按钮用途较广。
选定要使用位图的按钮(以OK按钮为例,假设其标识符为IDC_BtonOK),选
其属性中的Owner draw选项,此时,在对话框编辑器中就可看到原先显示在按钮
上的字符都消失了。将按钮的Caption改为OK(必须为大写)。打开Insert菜单,
单击其中的Resource选项,随后选择Bitmap。再按下Import(导入)按钮,将所
需位图导入项目(Project)。可以在Resource View窗口中通过右键单击刚才导
入的位图,将其ID(标识符)改为"OKU",注意:字符必须为大写,双引号及字母
U必不可少。字母U代表的按钮为按下状态时所显示的位图。此外还可使用后缀D、
F、X,分别表示按下、拥有输入焦点时、按钮处于无效状态时所显示的位图。通
过对同一个按钮的不同状态使用不同的位图,很容易做出具有动态效果的按钮。
当将按钮所需使用的位图导入到项目中后,就应该在使用位图按钮的那个对
话框的类声明文件中加入位图按钮变量的定义CBitmapButton m_BtonOK。同时,
在适当的位置(一般是在对话框的OnInitDialog()函数中)加入如下语句:
m_BtonOK.AutoLoad(IDC_BtonOK),使程序在运行时将位图装入内存并显示。至
此,创建位图按钮的整个步骤即告结束。
上述方法不仅限于创建位图按钮,还可用于在对话框上显示简单的位图。嘘
,告诉你一个小秘密,位图按钮所使用的颜色最多可达256种,而非位图编辑器中
的16种。但对于256色位图,当在导入VC++的位图编辑器后就不能使用该编辑器作
任何修改。否则在编译连接后,原先256色位图就变成16色位图了。
3.通用对话框的使用
在编程中,自己要设计存储或打开文件时的对话框是件很头疼的事。不过
Windows既然已经为我们提供好了现成的通用对话框,只管拿来用就是了。先在使
用文件对话框的类的类定义文件中加入对象定义CFileDialog
m_OpenDialog(TRUE,"txt","*.txt")。随后,在需要使用该对话框的地方加入以
下语句:m_OpenDialog.Domodal();
其调用规则为:
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)",而在它的下
拉列表框中列出"小型可执行文件(*.com)、批处理文件(*.bat)、All
Files(*.*)"内容,则变量定义如下:CFileDialogc m_OpenDialog(TRUE
m_OpenDialog(TRUE,"exe",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"可
执行文件(*.exe) | *.exe|小型可执行文件(*.com)|*.com |批处理文件(*.bat)
| *.bat | All Files (*.*) | *.* ||",NULL);说明:第五个参数lpszFilter为
一个指向字符串的指针,在列表框中要显示的字符后跟一个用"|"括起来的字符串
,为要显示文件的文件类型。
4.最高窗口的实现
最高窗口就是总浮动在其他窗口上的,不会被一般窗口遮住的窗口,最高窗
口技术在编程中有着很广泛的应用。VC++中对基于SDI、MDI的运用程序,要实现
最高窗口,只要在框架窗口类CMainFrame中的PreCreateWindow()函数中加入
"cs.dwExStyle =WS_EX_TOPMOST;"即可。关于函数PreCreateWindow()及结构
CREATESTRUCT的详细信息可参见VC++的联机文档。
而对基于对话框的运用程序,如何实现最高窗口却很少论及,以下便是一种
实现方法。
重载要实观最高窗口的对话框的OnInitDialog()函数,方法是进入
ClassWizard,在Object ID列表框中选择该对话框的ID,在Message列表框中选择
WM_INITDIALOGG,单击Add Function按钮后,即对onlnitDialog函数进行了重载
。再按下Edit code按钮,加入以下语句:
const CWnd * pWndInsertAfter;pWndInsertAfter =
&wndTopMost;SetWindowPos(pWndInsertAfter,0,0,0,0,SWP_NOSIZE |
SWP_NOMOVE);函数SetWindowPos原型为BOOL SetWindowPos(const CWnd *
pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);pWndInsertAfter
为指向标识窗口类型的CWnd对象的指针。
x,y为窗口左上角的坐标。
cx,cy为窗口的宽与高。nFlags确定窗口的大小及位置。当为SWP_NOSIZE时
,忽略cx,cy。当为SWP_NOMOVE时,忽略x,y。
5.窗口最大化、最小化的实现
当利用AppWizard生成运用程序框架时,VC++已经为我们在标题条上做好了最
大化,最小化及恢复按钮。但有时我们也想在其它地方使用这些功能。这就可采
用下面的办法。在指定的消息处理函效中加入下列语句,则程序在收到该条消息
后即执行窗口最小化。
WINDOWPLACEMENT lwndpl;WINDOWPLACEMENT * lpwndpl;lpwndpl=&lwndpl;GetWindowPlacement(lpwndpl);lpwndpl->showCmd=SW_SHOWMINIMIZED;SetWindowPlacement(lpwndpl);函数BOOL GetWindowPlacement(WINDOWPLACEMENT * lpwndpl) const的作用为获取表示当前
窗口的布局的结构WINDOWPLACEMENT的结构变量指针。结构WINDOWPLACEMENT定义为:
typedef struct tagWINDOWPLACEMENT {/* wndpl * / UINT length;UINT flags;UINT showCmd;POINT ptMinPosition;POINT ptMaxPosition;RECT rcNormalPosition;} WINDOWPLACEMENT;
其中的成员变量showCmd确定当前窗口的状态。其取值一般为:
SW_HIDE隐藏窗口。SW_MINIMIZE最小化指定的窗口。SW_RESTORE将最大化或
最小化的窗口恢复原来大小。SW_SHOW以原来的大小激话并显示窗口。
SW_SHOWMAXIMIZED激活并最大化窗口。函数BOOL SetWindowPlacement(const
WINDOWPLACEMENT * lpwndpl)作用为按结构MENT的设置显示窗口。
6.OCX控件的使用
VC++的初学者可能会很羡慕VB或是C++Builder中那多得令人眼花缭乱且使用
方便的控件。其实,VC++中可使用的控件更多,只不过在通常的主界面上看不到
而已。如果打开Project菜单,选择Add To Project选项,在随后出现的子菜单中
,选择Components And Controls,随后就可在Components andControls Gallery
对话框中的列表框中看到Developer Studio Components和Registered ActiveX
Controls两个文件夹。随便打开一个文件夹,你会看到什么?这么多控件,够用
了吧。选定一个,要加入,单击Insert按钮;要帮助,单击More Info按钮。也可
以直接在对话框编辑器中,右键单击对话框空白处,选择Insert
ActiveXControls选项,然后就自己挑选去吧。下面向大家介绍两个常用的控件作为例子。
(1)在前面介绍的位图按钮中,可以用该方式在对话框中加入颜色最多仅
256色的位图,现在,利用Microsoft Forms 2.0 Image控件,你就可自由自在的
使用真彩色位图了。方法如下:右键单击要加入位图的对话框空白处,选择
Insert ActiveX Controls选项,随后选择Microsoft Forms 2.0 Image控件,加
入后,右键单击该控件,调整该控件的属性。在All标签列出的属性中,Picture
属性决定显示那一幅位图。属性调整完毕后,再编译连接,就一切OK了。
(2)在你的程序中要具有Tips of the Day功能,那定能增色不少。像通用
对话框一样,你无需自己去费时费力,Microsoft已经为你做好了,方法如下:打
开Project菜单,选择Add To Project选项,在随后出现的子菜单中,选择
Components And Controls,打开Developer Studio Components选择Tip of the
Day,将其加入到Project中去。再编译连接运行,Tips of the Day出来了。不过
此时Tips of the Day还没有任何内容。此时,需要打开project莱单,选择Add
To Project选项,在打开的子菜单选择New,随后创建一个名为tips.txt的TXT文
件,并加入到Project中去。用回车符来区分每一条Tip,注意,每条Tip不能以
Tab跳格开头,且长度不能超过1000个字符。这样,加入Tip of the Day就大功告
成了。
也许大家还记得,在用AppWizard创建运用程序框架时,有一步询问程序是否
需要ActiveX控件支持。因此,如果在创建运用程序框架时没有包含这一特性,后
来的Project就不能加入ActiveX控件了。但这也不是绝对的,利用函数
AfxEnableControlContainer()就可补上这一特性,在运用程序的
InitInstance()_函数中加入该函数,并在预编译文件StdAfx.h中加入#include即
可。