• 白乔原创:VC之控件篇


     

    1 使用Windows标准控件

    1.1 常见控件列表

    Windows标准控件即普通控件,撰写此文时,笔者每天面对的Word就带了一脸的控件,当然你肯定也熟悉:字体选择下拉框、工具栏、滚动条、状态栏,如此等等。

    常见的Windows标准控件在VC里就有:

    图2 控件集窗口

    通常这个控件集窗口在你的对话框设计界面的附近总能找到,如果找不到,在VC工具栏的任何空白处点击右键,在弹出菜单的Controls菜单项前面打上勾即可,如图所示:

    图3 显示控件集窗口

    你也许已经看到了,我们图1所示的FlashPlayer中有3个控件是Windows标准控件,好,我们先系统地学习一下怎么使用这3个控件。

    1.2 引入控件

    1. 准备对话框

    对话框相当于控件的容器,我们当然要先准备一个对话框。好办,直接创建一个基于对话框的工程就是了:

    图4 准备对话框Step 1

    注意,在Step 2中要确认“3D Controls”和“ActiveX Controls”前面打上勾,如图所示:

    图5 准备对话框Step 2

    这样你的程序就支持三维控件和我们后面即将使用到的ActiveX控件了。如果去掉了勾,或者你面对的正是你师兄当年准备论文的旧的project,它好像并不支持ActiveX控件,那该怎么办呢(好多VC网友总是带着那张哭丧脸的表情问我这种问题)?没事,在主程序文件的InitInstance()函数头部加上以下语句即可:

    1. BOOL CFlashPlayerApp::InitInstance()   
    2. {   
    3.     AfxEnableControlContainer();   
    4.   
    5. #ifdef _AFXDLL   
    6.     Enable3dControls();         // Call this when using MFC in a shared DLL   
    7. #else   
    8.     Enable3dControlsStatic();   // Call this when linking to MFC statically   
    9. #endif   
    10.   
    11. //…   
    12. }   

    对话框准备好了,缺省情况下,它总会自动带上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…,弹出以下界面:

    图9 ClassWizard窗口

    有点晕。先不管别的,因为我们要映射变量,我们就选择“Member Variables”标签页, 这儿可以看到当前对话框中的所有控件,包括我们的文本框和其它两个按钮;

    2. 找到我们的IDC_FLASH_FILE,双击之(或者点击“Add Variable…”按钮),就弹出了映射控件变量窗口:

    图10 添加控件值变量

    该界面分别要求输入变量名、类别和变量类型,不用争了,我们选择Value和CString,将IDC_FLASH_FILE映射成CString m_sFilePath。

    大功告成!可以同时观察VC程序代码中的变化:

    1. class CFlashPlayerDlg : public CDialog   
    2. {   
    3. // …   
    4. // Dialog Data   
    5.     //{{AFX_DATA(CFlashPlayerDlg)   
    6.     enum { IDD = IDD_FLASHPLAYER_DIALOG };   
    7.     CString m_sFilePath;   
    8.     //}}AFX_DATA   
    9. }   
    10.   
    11. CFlashPlayerDlg::CFlashPlayerDlg(CWnd* pParent /*=NULL*/)   
    12. : CDialog(CFlashPlayerDlg::IDD, pParent)   
    13. {   
    14.     //{{AFX_DATA_INIT(CFlashPlayerDlg)   
    15.     m_sFilePath = _T("");   
    16.     //}}AFX_DATA_INIT   
    17.     // …   
    18. }   
    19.   
    20. void CFlashPlayerDlg::DoDataExchange(CDataExchange* pDX)   
    21. {   
    22.     CDialog::DoDataExchange(pDX);   
    23.     //{{AFX_DATA_MAP(CFlashPlayerDlg)   
    24.     DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);   
    25.     //}}AFX_DATA_MAP   
    26. }   

    下面我们先试试这个CString m_sFilePath的使用,如:

    1. BOOL CFlashPlayerDlg::OnInitDialog()   
    2. {   
    3.     CDialog::OnInitDialog();   
    4.     m_sFilePath = "空即是色";   
    5.     // …   
    6. }  

    遗憾的是,以上的代码是没用的!与Visual Basic不同,在VC的世界里,映射的值变量与实际控件的内容并不保持同步,欲使用映射的值变量就必须额外地使用到UpdateData()函数,它的函数原型如下:

    1. CWnd::UpdateData   
    2. BOOL UpdateData( BOOL bSaveAndValidate = TRUE );  

    简单地说,UpdateData(TRUE)读取对话框中各控件的内容,并及时反映到其映射值中去;UpdateData(FALSE)则恰恰相反,它将当前映射值反映到控件中去,如:在文本框里面显示你刚刚设置的字符串“空即是色”。

    我们现在是要通过变量修改控件,因此,我们采用UpdateData(FALSE),以上的代码修改成:

    1. BOOL CFlashPlayerDlg::OnInitDialog()   
    2. {   
    3.     CDialog::OnInitDialog();   
    4.     m_sFilePath = "请点击“浏览”按钮选择文件!";   
    5.     UpdateData(FALSE);   
    6.     // …   
    7. }  

    现在的运行界面就可以看到m_sFilePath的内容了:

    图11 使用映射变量修改文本编辑框的内容

    UpdateData ()如何知道哪些控件与哪些变量映射,靠的是DoDataExchange(),读者没必要对DoDataExchange()了解更多,但注意不要随便手动修改DoDataExchange()中的代码。

    1.4.2 控件 -> 控件对象

    与值变量不同,如果映射变量是一个控件对象,那么就没有必要调用UpdateData ()来完成同步。将一个控件映射成控件对象也很简单,依2.4.1的步骤而行,同样弹出添加变量窗口:

    图12 添加控件对象变量

    注意在Category(类别)一栏选择Control,变量类型别无选择,选择CEdit,点击OK。这样我们的IDC_FLASH_FILE即有了2个映射变量:

    图13 同时为控件绑定值变量和对象变量

    同样地,以上的映射亦体现在代码里:

    1. void CFlashPlayerDlg::DoDataExchange(CDataExchange* pDX)   
    2. {   
    3.     CDialog::DoDataExchange(pDX);   
    4.     //{{AFX_DATA_MAP(CFlashPlayerDlg)   
    5.     DDX_Control(pDX, IDC_FLASH_FILE, m_FilePathEdit);   
    6.     DDX_Text(pDX, IDC_FLASH_FILE, m_sFilePath);   
    7.     //}}AFX_DATA_MAP   
    8. }   

    DDX_Control标明控件IDC_FLASH_FILE与m_FilePathEdit映射,接下来,我们就可以通过使用CEdit类来控制文本编辑框控件,如图所示:

    图14 使用CEdit变量修改控件内容

    这时候,使用如下代码同样可以达到设置编辑框内容的效果:

    1. m_FilePathEdit.SetWindowText("请点击“浏览”按钮选择文件!");  

    相比而言,使用控件对象,可以最大限度地控制控件;但是,谁都知道,使用一个对象的步骤比操纵一个变量要麻烦得多。

    删除控件变量并不需要任何技巧,在ClassWizard窗口选定该变量,点击“Delete Variable”即可。为了配合后续教程,我们先删掉这个CEdit m_FilePathEdit,在2.6节,我们将要把这个文本编辑框映射成我们自定义的类型。

    1.5 响应控件事件

    控件都是一个个的窗口,所以控件都有事件。最简单的,按钮被鼠标按下时,将产生BN_CLICKED事件。

    那好,就响应“浏览”按钮的BN_CLICKED事件:

    1. 弹出右键菜单(如图7所示),选择“Events…”,弹出如下窗口:

    图15 控件事件窗口

    窗口主要分成3部分:左侧为当前控件的所有消息列表,右上侧为已响应的消息,右下侧为当前窗口所有的控件列表(包括窗口本身)。注意到我们的“浏览”按钮现在还没有任何已响应的消息。

    2. 双击左侧的“BN_CLICKED”(或者点击右边的“Add Handler”按钮),即弹出如下窗口,提示为响应函数取个名字:

    图16 为事件响应函数命名

    响应函数的名字一般皆以On打头,缺省的名字OnBrowser就蛮好,点击“OK”。

    可以看到,现在我们的事件窗口已经包含了这个BN_CLICKED:

    图17 已添加事件响应

    3. 选择BN_CLICKED事件点击Edit Existing(也可以在上一步即点击Add and Edit),即可观察到代码中已增加以下内容:

    1. BEGIN_MESSAGE_MAP(CFlashPlayerDlg, CDialog)   
    2.     //{{AFX_MSG_MAP(CFlashPlayerDlg)   
    3.     ON_WM_SYSCOMMAND()   
    4.     ON_WM_PAINT()   
    5.     ON_WM_QUERYDRAGICON()   
    6.     ON_BN_CLICKED(ID_BROWSER, OnBrowser)   
    7.     //}}AFX_MSG_MAP   
    8. END_MESSAGE_MAP()   
    9.   
    10. void CFlashPlayerDlg::OnBrowser()    
    11. {   
    12.     // TODO: Add your control notification handler code here       
    13. }   

    4. 我们现在就可以修改这个OnBrowser()的代码,以实现我们需要的操作,既然我们希望它弹出一个选择文件的对话框,那么我们就这么写:

    1. void CFlashPlayerDlg::OnBrowser()    
    2. {   
    3.     //文件对话框   
    4.     CFileDialog FileDialog(true".swf""", OFN_EXPLORER,   
    5.         "Flash动画文件(*.swf)|*.swf|所有文件(*.*)|*.*||"this);   
    6.   
    7.     //显示对话框   
    8.     if(FileDialog.DoModal() == IDOK)   
    9.     {   
    10.         m_sFilePath = FileDialog.GetPathName();   
    11.         UpdateData(FALSE);   
    12.     }   
    13. }   

    呵呵,是不是又注意到UpdateData(FALSE)了?没错,将变量赋值了,就应该调用UpdateData(FALSE)将值反映出来。现在我们的运行界面可以选择文件了:

    图18 事件响应函数OnBrowser()的实现

    添加事件处理还有一种方法,就是使用我们前面熟悉到的ClassWizard窗口,打开“Message Maps(消息映射)”标签页,即可管理我们的控件消息:

    图19 使用ClassWizard窗口管理消息映射

    1.6 控件子类化

    尽管Windows系统提供了各种丰富的控件,但总会有美中不足的时候。你是否注意到了?我们现在的文本框远没有FlashPlayer成品中的好看。FlashPlayer中的文本框黑底绿字,那叫一个酷!

    那么我们就准备在原有文本编辑框的基础上再做一些定制,解决的办法是控件的子类化。

    子类化是应用于窗口的高级技术,当然就可以应用于控件。子类化其原理就在于它修改了窗口(控件)的类内存块,这样既有窗口(控件)就不知不觉地修改了自己的模样和行为。

    得益于控件的变量映射机制,在VC里,子类化控件并不是一件很难的事情。具体操作就是:为控件准备一个新类,例如CCoolEdit。一般这些类都从某个原有的MFC类(如:CEdit)继承而来,这样它就可以很方便地继承基类的模样和行为;接下来的工作,就是我们将控件映射成这个新的CCoolEdit,完全如同CEdit一样。

    就这么简单,我们仔细走走看:

    1. 准备子类;

    已经有很好的CEdit类,既然我们要改造它,那就直接继承它:

    图20 子类化CEdit

    注意Class type选择MFC Class,我们将这个新的子类命名为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 添加消息处理函数

    选择Add Windows Message Handler…,即弹出以下窗口:

    图23 响应控件的WM_CTLCOLOR消息

    复习2.5节的内容,双击WM_CTLCOLOR,添加事件响应函数CCoolEdit::CtlColor()。接下来,我们可以在CtlColor()里完成界面的定制:

    1. HBRUSH CCoolEdit::CtlColor(CDC* pDC, UINT nCtlColor)    
    2. {   
    3.     // TODO: Change any attributes of the DC here   
    4.     //设置前景色   
    5.     pDC->SetTextColor(RGB(0, 255, 0));   
    6.     //设置字体背景色   
    7.     pDC->SetBkColor(RGB(0, 0, 0));   
    8.        
    9.     //设置背景色   
    10.     return (HBRUSH)::GetStockObject(BLACK_BRUSH);   
    11.     // TODO: Return a non-NULL brush if the parent's handler should not be called   
    12. }   

    就这么多了,运行程序,以下是运行结果:

    图24 CCoolEdit的运行结果

    呵呵,怎么样?这个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菜单下启动ActiveX Control Test Container;

    2. 在ActiveX Control Test Container里打开菜单File/Register Controls…;

    3. 弹出窗口Register Controls显示系统中已注册的所有ActiveX控件,点击左下角的“Register…”按钮;

    4. 选择待注册的控件文件,如:“C:/WINNT/system32/Macromed/Flash/swflash.ocx”即为Macromedia Flash的ShockwaveFlash控件文件;

    5. 点击“打开”按钮,即完成以上控件的注册,我们可以在控件列表中发现它的名字为“ShockwaveFlash. ShockwaveFlash.1”;

    以上操作画面如图所示:

    图25 注册ActiveX控件

    还有一种简单一点的办法,使用regsvr32注册之即可,如图示出注册画面:

    图26 使用regsvr32注册ActiveX控件

    对于某些软件,安装时即完成对自带控件的注册。例如:Macromedia Flash安装之后,你的Internet浏览器就可以播放动画了,你也可以在控件列表里找到ShockwaveFlash控件。那么这些软件是如何完成控件的自注册的呢(这也是常见的问题之一)?一种途径是使用安装程序,它们可以自动完成ActiveX控件的注册;另一种方法是利用程序调用DllRegisterServer()即可:

    1. HMODULE hModule=LoadLibrary(sControlFilePath);   
    2. if(hModule)   
    3. {   
    4. FARPROC DLLRegisterServer = (FARPROC)GetProcAddress(hModule "DllRegisterServer");   
    5. if(DLLRegisterServer)   
    6. {   
    7. HRESULT regResult = DLLRegisterServer();   
    8. if(regResult != NOERROR)   
    9. MessageBox(NULL "注册ActiveX控件时发生错误!" "警告" MB_OK|MB_ICONINFORMATION);   
    10. }   
    11. FreeLibrary(hModule);   
    12. }  

    1.2 引入控件

    好了,目前为止,我们已经有Flash控件了,那么我们在程序中引入它:

    1. 在对话框设计界面空白处右键,弹出菜单,选择Insert ActiveX Control…,如下所示:

    图27 选择Insert ActiveX Control

    2. 在Insert ActiveX Control窗口中,在控件列表中选择Shockwave Flash Object,如图所示:

    图28 选择Shockwave Flash Object

    1. 好了,现在的Flash控件成功引入!我们继续调整Flash控件的大小和位置:

    图29 引入Flash控件

    引入ActiveX控件,还有一种途径,就是通过Project/Add To Project/Componets and Controls…,然后选择Registered ActiveX Controls。在此不再赘述。

    1.3 设置控件属性

    面对这个新鲜的玩意儿,我们该设置设置属性,让它干干活。

    界面确实变化了不少,Flash Properties标签页即列举了Flash控件的属性:

    图30 Flash控件的Flash Properties标签页

    All标签页则以值的方式列出了该控件的所有属性:

    图31 Flash控件的All标签页

    做过Flash的朋友可能对这些属性的含义要熟悉一点,例如:Quality用以设置动画的画面质量,Scale则指定动画的显示方式,Play和Loop决定动画是否一开始就播放以及是否循环播放,如此等等。

    我们现在让这个控件播放一则动画,操作太简单了,将Movie URL设置成动画文件路径即可:

    图32 设置Flash的Movie URL

    运行程序,乖乖,该来的都来了:

    图33 FlashPlayer运行界面

    1.4 映射控件变量

    小试牛刀,看来已初显成效,我们现在来更好地控制这个控件,第一步,映射变量:

    1. 将控件的ID设置成IDC_FLASH_SCREEN;

    2. 复习2.4节的内容,打开ClassWizard窗口;

    3. 选择IDC_FLASH_SCREEN,双击之,不好,好像不太一样:

    图34 提示窗口

    VC可以自动每一个ActiveX控件封装出一个类作为未来的控件变量的类型,如果你还希望映射控件变量,那么选择“确定”。

    4. 接下来的操作是为这个自动生成的类指定类名和文件名:

    图35 确认类名和文件名

    别找乐了,使用缺省的CShockwaveFlash就很好,我们继续。

    5. 接下来的画面比较熟悉,我们选择Control和CShockwaveFlash:

    图36 添加控件对象变量

    ActiveX控件没有值变量,只有一个控件对象变量,这个变量的类型就是前面准备好的CShockwaveFlash,没问题,我们将Flash控件取名为m_FlashScreen。

    1.5 响应控件事件

    ActiveX控件也具有自身的事件,例如我们的IDC_FLASH_SCREEN具有以下事件:

    图37 ActiveX控件事件

    事件的响应与标准控件一样,在此不再赘述。

    1.6 调用控件方法

    前面已经提及,不管是标准控件,还是ActiveX控件,都可以映射成对象变量。既然是对象,我们就可以调用成员函数(或曰方法,method)来完成特定的功能,下面我们结合FlashPlayer来学习CShockwaveFlash方法的调用。

    通过3.4,我们可以发现VC已经帮我们准备了两个文件shockwaveflash.cpp和shockwaveflash.h,以及一个类CShockwaveFlash:

    图38 CShockwaveFlash的类框架

    VC会自动提取控件的所有方法和属性,并封装成我们所熟悉的成员函数形式。CShockwaveFlash为我们准备了不少的函数,我们先用一个熟悉点的试试:

    1. void CShockwaveFlash::SetMovie(LPCTSTR lpszNewValue)   
    2. {   
    3.     static BYTE parms[] = VTS_BSTR;   
    4.     InvokeHelper(0x66, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,  lpszNewValue);   
    5. }   

    这个SetMovie()可以用来设置当前播放动画的URL,估计相当于属性窗口里面的Movie URL。我们使用这个SetMovie()结合“浏览”按钮来实现选择播放功能:

    1. void CFlashPlayerDlg::OnBrowser()    
    2. {   
    3.     CFileDialog FileDialog(true".swf""", OFN_EXPLORER,   
    4.         "Flash动画文件(*.swf)|*.swf|所有文件(*.*)|*.*||"this);   
    5.        
    6.     if(FileDialog.DoModal() == IDOK)   
    7.     {   
    8.         m_sFilePath = FileDialog.GetPathName();   
    9.         UpdateData(false);   
    10.   
    11.         m_FlashScreen.SetMovie(m_sFilePath);   
    12.     }   
    13. }   

    嗯,运行FlashPlayer,运行界面如下所示,它现在已支持文件选择的功能了:

    图39 支持点播的FlashPlayer

     

    注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1464.html

    1 常见控件推荐

    FlashPlayer程序至此打造完毕,以下向大家推荐一些比较有用的控件:

    1.1 MsChart控件

    控件名称:Microsoft Chart Control 6.0 (sp4)

    控件类:CMsChart

    控件简介:MsChart是微软制作的功能强大的图表工具,用它可以很方便的建立各种图表,包括各种二维、三维的饼图、折线图、直方图、折线图、面积图等。

    应用图例:

    图40 MsChart控件应用图例

    1.2 DataGrid控件

    控件名称:Microsoft DataGrid Control 6.0 (sp5)

    控件类:CDataGrid

    控件简介:DataGrid控件是由微软提供的数据表格控件,需要与ADODC控件配合使用。通过使用DataGrid控件,可以很方便地实现数据表记录的浏览、增加、删除和修改功能。

    应用图例:

    图41 DataGrid控件应用图例

    1.3 MsComm控件

    控件名称:Microsoft Communications Control version 6.0

    控件类:CMsComm

    控件简介:MSComm 控件提供了一系列标准通讯属性和方法,使用它可以建立起应用程序与串行端口的联接。

    应用图例:

    图42 MsComm控件应用图例

    以上画面来源于笔者自行制作的手机通讯软件FreePhone,其底层采用MsComm控件,感兴趣的读者可以参见http://bluejoe.yeah.net。

    1.4 Web浏览器控件

    控件名称:Web浏览器控件

    控件类:CWebBrowser2

    控件简介:Web浏览器相信大家再也熟悉不过了,IE浏览器就内嵌了一个Web浏览器控件,这也就是为什么腾讯浏览器与IE如此相似的原因。通过使用Web浏览器控件,可以很方便地实现网页页面的浏览和显示。

    应用图例:

    图43 Web浏览器控件应用图例

    1.5 ActiveMovie控件

    控件名称:ActiveMovie Control Object

    控件类:CActiveMovie3

    控件简介:ActiveMovie是Microsoft公司开发的视频播放控件。该控件内嵌了Microsoft MPEG音频解码器和Microsoft MPEG视频解码器,播放控制更加简捷方便。

    应用图例:

    图44 ActiveMovie控件应用图例

    2 结束语

    控件是好东西,有了它,绝对会节省你的不少时间和精力。如果你正在为某个复杂的实现而苦恼万分,那么笔者建议你先上网查查是否已经有相应的控件可供下载使用。一个专业的控件往往会比你考虑得要周密得多,也要方便得多。而你的任务就是如何使用它,如何去推广它;当然,如果你有好的代码,譬如是一个底层硬件通讯的工程类,我也希望你会将这些东西封装成控件,然后贡献出来,让大家一块共享你的成就和快乐!

    本文主要通过大量示例指引读者了解和使用Windows控件以及ActiveX控件。

    1 前言

    1.1 控件之于VC

    控件与Visual C++没有直接的关系,控件是Windows操作系统的界面元素,而VC只是一种开发语言。VC可以编写Windows程序,当然也可以编写Windows界面,包括最熟悉的对话框界面。

    对话框界面是初学者学习VC的一道门槛,学习复杂的文档/视对于初学者来说是很痛苦的事情。而对话框的优点就在于它的“所见即所得”,设计界面画得有多好看,程序运行界面就有多好看。而如何让你的对话框的界面更丰富一点,那就是控件的事情了。

    所以,你,责无旁贷的,要先学好控件的使用;而本次教程,正是指引你如何在VC里实现控件编程。

    控件是窗口,是个完成特定功能的小窗口。例如:最熟悉的列表框控件可以让你用来列出你所有女友的名字;

    控件放置在对话框里,对话框就成为控件的容器,或曰父窗口;而控件就成为对话框的元素,或曰子窗口。

    控件并不总是显示成一个窗口,它可以是隐藏着的,例如:你可以使用定时器控件来控制“神五”的发射,但没必要一定要在发射系统的主界面上土土地画上一只小闹钟。

    你用来选择女友名字的列表框是Windows系统标准控件,用来指示大爆竹升天的定时器也是。但Windows系统为你考虑的总会有限,那么就需要一些先行的人(第三方)为你准备一些他们出品的控件,这些符合Windows规范的控件即ActiveX控件,对于合法占有(但愿是真的合法占有)这些控件的你,就完全可以象使用Windows标准控件一样大大方方地使用它们。ActiveX控件的使用与标准控件一样简便快捷,你可以使用MsComm控件让你的电脑总是在深夜拨打我的电话,或者使用ActiveMovie控件反复播放你最钟爱的影片(譬如,“三个代表”的学习材料),如此这些,都是ActiveX控件的应用。

    同样的,你也可以使用Macromedia公司的Flash控件来播放所有有关Snoopy的Flash动画,而这,正是本文要为你讲述的。

    1.2 主要内容

    本教程指引你完成以下界面,它是一个轻型的Flash浏览器:

    图1 轻型的Flash浏览器FlashPlayer

    不是很酷,但至少还能说明一些问题。这个简单的界面包含以下4个控件:

    • 文本编辑框,用以显示用户选择的文件路径,如:“D:/movies/星语心愿.swf”;
    • “浏览”按钮,用以支持用户选择Flash文件;
    • “退出”按钮,用以结束本程序,相当于“安全门”;
    • Flash浏览窗口,用以显示Flash画面,是FlashPlayer的主会场;

    前3者是Windows标准控件,Flash浏览窗口则不同,它来源于Macromedia Flash,是一个ActiveX控件。

    通过本教程,笔者承诺你可以学习到以下内容(当然,你首先要熟悉Visual C++):

    • 控件的引入,即如何将一个控件加入到你的VC工程中来;
    • 控件属性的设置,即如何通过属性的修改来设计控件的运行界面;
    • 控件变量的映射,即如何象使用通常的一个变量一样操纵一个控件;
    • 控件事件的响应,即如何处理控件的事件;
    • 控件方法的调用,即如何调用控件的既有函数来操作它;

    仅此而已,你不可能再学习到其它的话题,你也不会接触到诸如ActiveX制作等方面的内容,那样只会冲淡本次教程的主题,让你的头更疼。

    +++++++++++++++++++++++++++++++++++++++++++
    如本文存在任何侵权部分,请及时告知,我会第一时间删除!
    转载本博客原创文章,请附上原文@cnblogs的网址!
    QQ: 5854165 我的开源项目 欢迎大家一起交流编程架构技术&大数据技术! +++++++++++++++++++++++++++++++++++++++++++
  • 相关阅读:
    第九次任务
    第八次任务
    第七次任务
    第六次任务
    第四天半任务
    第四天任务
    第三天任务
    第二天任务
    第一天任务
    第⑩天任务
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5116104.html
Copyright © 2020-2023  润新知