VC控件与程序指南.docx
- 文档编号:16906239
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:36
- 大小:563.05KB
VC控件与程序指南.docx
《VC控件与程序指南.docx》由会员分享,可在线阅读,更多相关《VC控件与程序指南.docx(36页珍藏版)》请在冰点文库上搜索。
VC控件与程序指南
VC对话框控件使用指南
1.1常见控件列表
Windows标准控件即普通控件,Word就带了一脸的控件:
字体选择下拉框、工具栏、滚动条、状态栏,如此等等。
常见的Windows标准控件在VC里就有:
图2控件集窗口
通常这个控件集窗口在你的对话框设计界面的附近总能找到,如果找不到,在VC工具栏的任何空白处点击右键,在弹出菜单的Controls菜单项前面打上勾即可,如图所示:
图3显示控件集窗口
图1所示的FlashPlayer中有3个控件是Windows标准控件,先系统地学习一下怎么使用这3个控件。
1.2引入控件
1.准备对话框
对话框相当于控件的容器,我们当然要先准备一个对话框。
好办,直接创建一个基于对话框的工程就是了:
图4准备对话框Step1
注意,在Step2中要确认“3DControls”和“ActiveXControls”前面打上勾,如图所示:
图5准备对话框Step2
这样你的程序就支持三维控件和我们后面即将使用到的ActiveX控件了。
如果去掉了勾,或者你面对的正是你师兄当年准备论文的旧的project,它好像并不支持ActiveX控件,那该怎么办呢(好多VC网友总是带着那张哭丧脸的表情问我这种问题)?
没事,在主程序文件的InitInstance()函数头部加上以下语句即可:
BOOL CFlashPlayerApp:
:
InitInstance()
{ AfxEnableControlContainer();
#ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL
#else Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
//…
}
对话框准备好了,缺省情况下,它总会自动带上3个控件:
2个按钮,“确定”与“取消”和一个“TODO:
在这里设置对话控制”文本标签。
2.准备文本编辑框
文本标签我们并不需要,那么就直接删除之。
但我们需要一个文本编辑框,用以显示Flash文件路径。
引入新的Windows标准控件很简单,只要简单地从控件集窗口选择相应的控件拖拽至对话框即可。
好,我们拖来一个文本编辑框:
图6引入文本编辑框控件
1.3设置控件属性
引入来的控件,可以通过鼠标简单的拖拽调整其位置和大小,当然,你还可以通过属性对话框来设计这个控件。
在控件上右击鼠标,弹出菜单:
图7控件的属性窗口
这个菜单即将覆盖本教程的大部分内容,菜单最下面的三行分别为:
ClassWizard…为控件创建类及变量
Events…为控件映射事件
Properties设置控件的属性
前两项后面的内容将要讨论到,我们现在只关心Properties(属性),点击它即可弹出文本编辑框的属性界面:
图8文本编辑框的属性界面
我们按照以下的步骤进行控件的属性设置:
1.在“General(普通)”标签页里将文本编辑框的ID修改成IDC_FLASH_FILE,而不是缺省的IDC_STATIC;
2.在“Styles(样式)”标签页里将文本编辑框的Read-only打勾,这样我们的文本编辑框就显示成灰色,并且只读。
也就是说,它的,内容只能由程序更改,用户不能手动输入;
3.同理,在两个按钮的“General(普通)”标签页里,设置它们的Caption(标题),分别为“浏览…”和“退出”;
4.在“浏览…”按钮的“General(普通)”标签页里,将它的ID设置成ID_BROWSER;
需要指出的是,每个控件都具有ID,就相当于每个人都具有一个身份证号。
除了IDC_STATIC(它的值是-1),每个对话框的控件的ID都必须唯一,不能重复。
一些特定的ID代表特定的含义,如:
IDOK对应于“确定”按钮,IDCANCEL对应于“取消”按钮,IDC_STATIC则对应于一个匿名控件。
MFC认识这些特定的ID,并赋值于指定的行为,例如:
你可以不需要编写任何代码,就可以使用“确定”按钮关闭对话框,就是这个原因。
以上内容指引你如何修改控件的属性,包括它的ID、标题以及样式。
这种修改都是所见即所得的,运行程序,你就会欣喜地发现,一切确实都改过来了。
1.4映射控件变量
好了,你现在有了一个文本编辑框,可是如何使用它,你还是一无所知。
那么,我们开始学习如何将控件映射成一个变量,这个过程即“映射控件变量”,或曰“绑定控件变量”。
映射控件变量是VC的一个很好的功能,有了它,你就可以象使用一个变量一样控制控件。
映射成什么类型的变量,这依赖于你的控件。
一般来说,一个控件可以映射成一个值变量(Value),也可以映射成一个控件对象(Control)。
如:
一个文本编辑框既可以映射成一个CString值,也可以映射成一个CEdit对象,CString是个字符串,而CEdit则是MFC为文本编辑框专门准备的控件类。
1.4.1控件->值变量
我们从简单的入手,先将我们的文件路径文本编辑框映射成一个普通的值变量,按照以下操作慢慢来:
1.在编辑框上打开右键菜单(如图7所示),选择ClassWizard…,弹出以下界面:
图9ClassWizard窗口
有点晕。
先不管别的,因为我们要映射变量,我们就选择“MemberVariables”标签页,这儿可以看到当前对话框中的所有控件,包括我们的文本框和其它两个按钮;
2.找到我们的IDC_FLASH_FILE,双击之(或者点击“AddVariable…”按钮),就弹出了映射控件变量窗口:
图10添加控件值变量
该界面分别要求输入变量名、类别和变量类型,不用争了,我们选择Value和CString,将IDC_FLASH_FILE映射成CStringm_sFilePath。
大功告成!
可以同时观察VC程序代码中的变化:
class CFlashPlayerDlg :
public CDialog
{ // … // Dialog Data
//{{AFX_DATA(CFlashPlayerDlg)
enum { IDD = IDD_FLASHPLAYER_DIALOG };
CString m_sFilePath;
//}}AFX_DATA }
CFlashPlayerDlg:
:
CFlashPlayerDlg(CWnd* pParent /*=NULL*/) :
CDialog(CFlashPlayerDlg:
:
IDD, pParent)
{ //{{AFX_DATA_INIT(CFlashPlayerDlg)
m_sFilePath = _T("");
//}}AFX_DATA_INIT
// …
}
void CFlashPlayerDlg:
:
DoDataExchange(CDataExchange* pDX)
{ CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFlashPlayerDlg)
DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);
//}}AFX_DATA_MAP
}
下面我们先试试这个CStringm_sFilePath的使用,如:
BOOL CFlashPlayerDlg:
:
OnInitDialog()
{ CDialog:
:
OnInitDialog(); m_sFilePath = "空即是色"; // …
}
遗憾的是,以上的代码是没用的!
与VisualBasic不同,在VC的世界里,映射的值变量与实际控件的内容并不保持同步,欲使用映射的值变量就必须额外地使用到UpdateData()函数,它的函数原型如下:
CWnd:
:
UpdateData BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
简单地说,UpdateData(TRUE)读取对话框中各控件的内容,并及时反映到其映射值中去;UpdateData(FALSE)则恰恰相反,它将当前映射值反映到控件中去,如:
在文本框里面显示你刚刚设置的字符串“空即是色”。
我们现在是要通过变量修改控件,因此,我们采用UpdateData(FALSE),以上的代码修改成:
BOOL CFlashPlayerDlg:
:
OnInitDialog()
{ CDialog:
:
OnInitDialog();
m_sFilePath = "请点击“浏览”按钮选择文件!
";
UpdateData(FALSE);
// …
}
现在的运行界面就可以看到m_sFilePath的内容了:
图11使用映射变量修改文本编辑框的内容
UpdateData()如何知道哪些控件与哪些变量映射,靠的是DoDataExchange(),读者没必要对DoDataExchange()了解更多,但注意不要随便手动修改DoDataExchange()中的代码。
1.4.2控件->控件对象
与值变量不同,如果映射变量是一个控件对象,那么就没有必要调用UpdateData()来完成同步。
将一个控件映射成控件对象也很简单,依2.4.1的步骤而行,同样弹出添加变量窗口:
图12添加控件对象变量
注意在Category(类别)一栏选择Control,变量类型别无选择,选择CEdit,点击OK。
这样我们的IDC_FLASH_FILE即有了2个映射变量:
图13同时为控件绑定值变量和对象变量
同样地,以上的映射亦体现在代码里:
void CFlashPlayerDlg:
:
DoDataExchange(CDataExchange* pDX)
{ CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFlashPlayerDlg)
DDX_Control(pDX, IDC_FLASH_FILE, m_FilePathEdit);
DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);
//}}AFX_DATA_MAP
}
DDX_Control标明控件IDC_FLASH_FILE与m_FilePathEdit映射,接下来,我们就可以通过使用CEdit类来控制文本编辑框控件,如图所示:
图14使用CEdit变量修改控件内容
这时候,使用如下代码同样可以达到设置编辑框内容的效果:
m_FilePathEdit.SetWindowText("请点击“浏览”按钮选择文件!
");
相比而言,使用控件对象,可以最大限度地控制控件;但是,谁都知道,使用一个对象的步骤比操纵一个变量要麻烦得多。
删除控件变量并不需要任何技巧,在ClassWizard窗口选定该变量,点击“DeleteVariable”即可。
为了配合后续教程,我们先删掉这个CEditm_FilePathEdit,在2.6节,我们将要把这个文本编辑框映射成我们自定义的类型。
1.5响应控件事件
控件都是一个个的窗口,所以控件都有事件。
最简单的,按钮被鼠标按下时,将产生BN_CLICKED事件。
那好,就响应“浏览”按钮的BN_CLICKED事件:
1.弹出右键菜单(如图7所示),选择“Events…”,弹出如下窗口:
图15控件事件窗口
窗口主要分成3部分:
左侧为当前控件的所有消息列表,右上侧为已响应的消息,右下侧为当前窗口所有的控件列表(包括窗口本身)。
注意到我们的“浏览”按钮现在还没有任何已响应的消息。
2.双击左侧的“BN_CLICKED”(或者点击右边的“AddHandler”按钮),即弹出如下窗口,提示为响应函数取个名字:
图16为事件响应函数命名
响应函数的名字一般皆以On打头,缺省的名字OnBrowser就蛮好,点击“OK”。
可以看到,现在我们的事件窗口已经包含了这个BN_CLICKED:
图17已添加事件响应
3.选择BN_CLICKED事件点击EditExisting(也可以在上一步即点击AddandEdit),即可观察到代码中已增加以下内容:
BEGIN_MESSAGE_MAP(CFlashPlayerDlg, CDialog)
//{{AFX_MSG_MAP(CFlashPlayerDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(ID_BROWSER, OnBrowser)
//}}AFX_MSG_MAP END_MESSAGE_MAP()
void CFlashPlayerDlg:
:
OnBrowser()
{
// TODO:
Add your control notification handler code here
}
4.我们现在就可以修改这个OnBrowser()的代码,以实现我们需要的操作,既然我们希望它弹出一个选择文件的对话框,那么我们就这么写:
void CFlashPlayerDlg:
:
OnBrowser()
{ //文件对话框
CFileDialog FileDialog(true, ".swf", "", OFN_EXPLORER, "Flash动画文件(*.swf)|*.swf|所有文件(*.*)|*.*||", this); //显示对话框
if(FileDialog.DoModal() == IDOK)
{ m_sFilePath = FileDialog.GetPathName();
UpdateData(FALSE);
}
}
呵呵,是不是又注意到UpdateData(FALSE)了?
没错,将变量赋值了,就应该调用UpdateData(FALSE)将值反映出来。
现在我们的运行界面可以选择文件了:
图18事件响应函数OnBrowser()的实现
添加事件处理还有一种方法,就是使用我们前面熟悉到的ClassWizard窗口,打开“MessageMaps(消息映射)”标签页,即可管理我们的控件消息:
图19使用ClassWizard窗口管理消息映射
1.6控件子类化
尽管Windows系统提供了各种丰富的控件,但总会有美中不足的时候。
你是否注意到了?
我们现在的文本框远没有FlashPlayer成品中的好看。
FlashPlayer中的文本框黑底绿字,那叫一个酷!
那么我们就准备在原有文本编辑框的基础上再做一些定制,解决的办法是控件的子类化。
子类化是应用于窗口的高级技术,当然就可以应用于控件。
子类化其原理就在于它修改了窗口(控件)的类内存块,这样既有窗口(控件)就不知不觉地修改了自己的模样和行为。
得益于控件的变量映射机制,在VC里,子类化控件并不是一件很难的事情。
具体操作就是:
为控件准备一个新类,例如CCoolEdit。
一般这些类都从某个原有的MFC类(如:
CEdit)继承而来,这样它就可以很方便地继承基类的模样和行为;接下来的工作,就是我们将控件映射成这个新的CCoolEdit,完全如同CEdit一样。
就这么简单,我们仔细走走看:
1.准备子类;
已经有很好的CEdit类,既然我们要改造它,那就直接继承它:
图20子类化CEdit
注意Classtype选择MFCClass,我们将这个新的子类命名为CCoolEdit。
2.映射控件对象;
参照图12,我们现在再打开“添加控件变量”窗口,打开变量类型列表,会发现我们的CCoolEdit已经赫然在列了。
不错,我们就映射一个CCoolEdit变量m_CoolEdit。
图21添加CCoolEdit对象变量
现在我们操作的控件即为CCoolEdit类型,实际上,谁都清楚,除了名字,我们的CCoolEdit与CEdit类没有什么两样;这时候,运行程序,界面并不会发生任何变化。
既然我们需要FlashPlayer最终版本的那样酷的文本输入框,那我们继续下一步。
3.定制子类CCoolEdit;
多查点资料,我们就可以知道:
在控件显示之前,每一个控件都会向父对话框发送一个WM_CTLCOLOR消息要求获取绘制所需要的颜色(更多内容可以查阅《电脑爱好者合订本》2003年(上)附录分册《VC++界面美化编程》篇)。
只要响应WM_CTLCOLOR消息,我们就可以修改控件的颜色。
那好,我们响应WM_CTLCOLOR消息试试看。
首先在类视图选中CCoolEdit,弹出右键菜单:
图22添加消息处理函数
选择AddWindowsMessageHandler…,即弹出以下窗口:
图23响应控件的WM_CTLCOLOR消息
复习2.5节的内容,双击WM_CTLCOLOR,添加事件响应函数CCoolEdit:
:
CtlColor()。
接下来,我们可以在CtlColor()里完成界面的定制:
HBRUSH CCoolEdit:
:
CtlColor(CDC* pDC, UINT nCtlColor)
{ // TODO:
Change any attributes of the DC here
//设置前景色
pDC->SetTextColor(RGB(0, 255, 0));
//设置字体背景色
pDC->SetBkColor(RGB(0, 0, 0));
//设置背景色
return (HBRUSH):
:
GetStockObject(BLACK_BRUSH);
// TODO:
Return a non-NULL brush if the parent's handler should not be called
}
就这么多了,运行程序,以下是运行结果:
图24CCoolEdit的运行结果
呵呵,怎么样?
这个CCoolEdit你以后还可以使用到其它场合哦!
什么都不用做,只要正常地将你的文本输入框映射成CCoolEdit就行了。
以上部分操纵的都是Windows标准控件,其实在Windows里,你还会常常接触到ActiveX控件,它来源于第三方,而非Windows操作系统。
这样的控件一般来说,功能丰富而且使用方便,从而大大简化了程序员的工作。
本章节以我们需要使用到的Flash控件为例细作阐述。
1使用ActiveX控件
以上部分操纵的都是Windows标准控件,其实在Windows里,你还会常常接触到ActiveX控件,它来源于第三方,而非Windows操作系统。
这样的控件一般来说,功能丰富而且使用方便,从而大大简化了程序员的工作。
本章节以我们需要使用到的Flash控件为例细作阐述。
1.1控件的注册
不同于Windows标准控件,ActiveX控件需要注册才能使用,ActiveX一般以.OCX或者.DLL文件格式发布,可以使用VC附带的工具来注册某个控件,按照以下步骤:
1.在VC的Tools菜单下启动ActiveXControlTestContainer;
2.在ActiveXControlTestContainer里打开菜单File\RegisterControls…;
3.弹出窗口RegisterControls显示系统中已注册的所有ActiveX控件,点击左下角的“Register…”按钮;
4.选择待注册的控件文件,如:
“C:
\WINNT\system32\Macromed\Flash\swflash.ocx”即为MacromediaFlash的ShockwaveFlash控件文件;
5.点击“打开”按钮,即完成以上控件的注册,我们可以在控件列表中发现它的名字为“ShockwaveFlash.ShockwaveFlash.1”;
以上操作画面如图所示:
图25注册ActiveX控件
还有一种简单一点的办法,使用regsvr32注册之即可,如图示出注册画面:
图26使用regsvr32注册ActiveX控件
对于某些软件,安装时即完成对自带控件的注册。
例如:
MacromediaFlash安装之后,你的Internet浏览器就可以播放动画了,你也可以在控件列表里找到ShockwaveFlash控件。
那么这些软件是如何完成控件的自注册的呢(这也是常见的问题之一)?
一种途径是使用安装程序,它们可以自动完成ActiveX控件的注册;另一种方法是利用程序调用DllRegisterServer()即可:
HMODULE hModule=LoadLibrary(sControlFilePath);
if(hModule)
{ FARPROC DLLRegisterServer = (FARPROC)GetProcAddress(hModule "DllRegisterServer");
if(DLLRegisterServer)
{ HRESULT regResult = DLLRegisterServer();
if(regResult !
= NOERROR)
MessageBox(NULL "注册ActiveX控件时发生错误!
" "警告" MB_OK|MB_ICONINFORMATION);
}
FreeLibrary(hModule);
}
1.2引入控件
好了,目前为止,我们已经有Flash控件了,那么我们在程序中引入它:
1.在对话框设计界面空白处右键,弹出菜单,选择InsertActiveXControl…,如下所示:
图27选择InsertActiveXControl
2.在InsertActiveXControl窗口中,在控件列表中选择ShockwaveFlashObject,如图所示:
图28选择ShockwaveFlashObject
1.好了,现在的Flash控件成功引入!
我们继续调整Flash控件的大小和位置:
图29引入Flash控件
引入ActiveX控件,还有一种途径,就是通过Project\Add
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 控件 程序 指南
![提示](https://static.bingdoc.com/images/bang_tan.gif)