友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

C语言实例教程(PDF格式)-第47部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


                      前位置由nPos参数指定  



通常,SB_THUMBTRACK滚动条代码由应用程序使用,以便在滚动条被 

拖动时给以反馈。如果应用程序滚动了由滚动条控制的内容,它必须 

使用SetScrollPos来重置滚动条的位置。  



传递给函数OnHScroll的参数反映了当收到消息时由框架获得的值, 

如果在重载版本的函数中调用了基类的实现,该实现将使用最初由消 

息传递的参数,而不是向函数提供的参数。  



消息WM_VSCROLL的处理函数OnVScroll与OnHScroll类似,我们这里就 

不再重复讲述了。下面我们来看一个例子:  



1。  创建一个名为ScrollDemo的基于对话框的MFC工程,按图设置对话 

框的各控件。其中水平滚动条控件的ID为IDC_SCROLL,编辑框控件的 

ID为IDC_CURPOS。  



                                   



            图6。 58 示例程序ScrollDemo的主对话框的设计  



2。   使用ClassWizard为编辑框控件IDC_CURPOS映射类型为int的成员 

变量m_iCurPos,并设置其最大值为100,最小值为…100。  



3。  使用ClassWizard在类CScrollDemoDlg中为消息WM_HSCROLL添加处 

理函数OnHScroll,其代码如下:  


…………………………………………………………Page 391……………………………………………………………

void CScrollDemoDlg::OnHScroll(UINT nSBCode; UINT nPos; CScrollBar* pScrollBar)   



{  



// 获得原有的滚动条位置  



int iPos=pScrollBar…》GetScrollPos();  



// 根据不同的拖动方式设置新的滚动条位置  



switch (nSBCode)  



{  



// 向右滚动一行  



case SB_LINERIGHT:  



iPos+=1;  



break;  



// 向左滚动一行  



case SB_LINELEFT:  



iPos…=1;  



break;  



// 向右滚动一页  



case SB_PAGERIGHT:  



iPos+=10;  



break;  



// 向左滚动一页  



case SB_PAGELEFT:  



iPos…=10;  



break;  



// 直接拖动滚动块  



case SB_THUMBTRACK:  



iPos=nPos;  


…………………………………………………………Page 392……………………………………………………………

break;  



default:  



break;  



}  



// 滚动条的最大位置不超过 100; 最小位置不小于 …100  



if (iPos100) iPos=100;  



// 必须手动的更新滚动条的当前位置  



pScrollBar…》SetScrollPos(iPos);  



// 在编辑框中显示滚动条的当前位置  



SetDlgItemInt(IDC_CURPOS; iPos);  



CDialog::OnHScroll(nSBCode; nPos; pScrollBar);  



}  



上面的代码暗示了一点,这就是在被拖动时,滚动条不会 自动更新其 

位置,我们必须自己在程序中做到这一点,即通过分析不同的滚动方 

式来改变并设置新的滚动条位置,上面的代码演示了这一过程。  



编译上面的程序代码,我们发现滚动条不能正常工作 !这是因为在默 

认情况下,滚动条的滚动范围为从0到0。这时,我们根本不可能对滚 

动条进行有意义的操作。因此,我们需要将下面的代码添加到 

OnInitDialog成员函数:  



CScrollBar *pScroll=(CScrollBar*)GetDlgItem(IDC_SCROLL);  



pScroll…》SetScrollRange(…100; 100);  



pScroll…》SetScrollPos(0);  



SetDlgItemInt(IDC_CURPOS; 0);  



上面的代码设定了滚动条的滚动范围和默认的滚动条位置,然后,将 

当前滚动条位置显示在编辑控件IDC_CURPOS中。  



4。   最后我们来实现一个功能,这就是我们希望当编辑控件中的文本 

发生改变时,滚动条上的滑块的位置也相应的变化。要实现这一点, 


…………………………………………………………Page 393……………………………………………………………

使用ClassWizard为控件IDC_CURPOS的通知消息EN_CHANGE添加消息处 

理函数OnChangeCurPos。  



void CScrollDemoDlg::OnChangeCurPos()   



{  



CString str;  



GetDlgItemText(IDC_CURPOS; str);  



str。TrimLeft();  



str。TrimRight();  



int iPos=0;  



if (str!=〃…〃 && str!=〃〃)  



{  



if (!UpdateData())  



{  



return;  



}  



iPos=m_iCurPos;  



}  



CScrollBar *pScroll=(CScrollBar*)GetDlgItem(IDC_SCROLL);  



pScroll…》SetScrollPos(iPos);  



}  



由于需要检验用户输入数据的有效性,上面的代码比较长。首先,如 

果用户只输入一个负号 “? ”或刚将原有的数据删除,此时不应该报 

错。这里我们可以将滚动条的位置设置为0。由于用户可能在所输入 

的数据之前或之后插入一些空格,这种情况下我们也不应该报错,因 

此,我们使用了一些额外的代码来避免了这种情况。最后,我们使用 

了UpdateData函数来使用控件IDC_CURPOS的值更新成员变量 

m_iCurPos,这样的目的是便于使用MFC提供的对话框数据检验机制。 

但有个不好的地方是,如果用户输入的数据有错,出现的报错消息是 

英文的。如果我们需要的是一个完全中文化的软件,这不能不算是一 


…………………………………………………………Page 394……………………………………………………………

个瑕疵,这时,我们应该编写自己的数据检验代码。但是在本示例程 

序中,并不需要这样要求,这里使用MFC的对话框数据检验机制是很 

有效的。回到程序代码中去,如果用户在编辑控件中输入的值有效的 

话,使用这个值去更新滚动条的当前位置,这是通过类CScrollBar的 

成员函数SetScrollPos来实现的。  



其它的一些控件,如CSliderCtrl类所封装的滑块控件等,与滚动条 

控件的使用有很大的共通之处,读者完全可以根据本章中所讲述的内 

容通过举一反三来用于其它的场合。  



 l 注意:  



 l 由于篇幅有限,在本章中我们不打算介绍更多的Windows控件。事 

   实上,Windows控件的使用的有规律可寻的。只需要弄清楚几种控 

  件的用法,以及MFC在处理控件时的机制,就很容易借助Visual  

  C++所提供的丰富的联机文档来学 习其它控件的使用。本章中所介 

   绍的控件,还只是所有控件中很小的一个部分,而且,即使是对 

  所介绍的几种控件的讲述也不是面面俱到的。我们的目的不再于 

  详尽的罗列各种控件的使用方法,而在于起到一种 “抛砖 引玉” 

   的作用。  


…………………………………………………………Page 395……………………………………………………………

         第七章 使用ActiveX控件  



Windows本身已经提供了很多的控件,我们已经在本书前面的章节中 

对这些控件作了一些介绍。但是,应用程序用户的需求是各种各样 

的,而且,程序员本身的创造力也不应该因此而受到制约。然而,经 

历过的人都会深深的体会到,仅仅凭借自己的力量,要想完成一个完 

善的功能强大的应用程序并非易事——不是不可以,只是非常之的艰 

难。绝大多数的优秀的应用程序,都凝结了很多优秀的程序员的天才 

的创造力和辛勤的劳动。因此,在很多时候,我们不得不对 自己能不 

能够使用Visual  C++写出一个既有强大的实用功能,又具有美观的用 

户界面的应用程序表示怀疑。很不幸,坦率的说,要自己从底层写 

起,一个这样的应用程序常常会埋葬无数的时间。但是,当我们从一 

个更大的范围来观察这一情况的时候,我们发现,事实上,就很多编 

程课题而言,无数的程序员在做的仅仅是一些重复的劳动。大量优秀 

的人才浪费在为同一个 目的编写功能相同的软件上。这启发了我们, 

如果能够制定一套规则,程序员们在此规则的基础上开发各种各样的 

功能组件,这些功能组件可以方便的用于多个应用程序。ActiveX技 

术就是这样的一种技术。基于ActiveX技术的为数众多的软件组件都 

提供了满足某个规范的一系列编程接口,应用程序可以通过该编程接 

口使用由软件组件提供的各种功能,而无需知道这些功能在具体的软 

件组件里是如何实现的。这种方式也是我们早在本书一开始的时候所 

提到的面向对象的程序设计的一个主要特点。  



ActiveX技术本身是一种非常复杂的技术,尽管有很多的书籍在讲述 

这一内容时故意淡化这一点。要想通过很短的篇幅以很通俗的语言阐 

明这个技术本身几乎是一件不可能的事。从本书的写作意图和篇幅来 

考虑,我们不打算深入的讨论ActiveX本身和如何创建基于ActiveX技 

术的各种软件组件,而把关心的焦点放到如何应用ActiveX控件本身 

上。  



本章的焦点放到两个问题上:  



 l 什么是ActiveX控件  



 l 如何在应用程序中使用ActiveX控件  



           第一节 什么是ActiveX控件  



什么是ActiveX控件?这个问题本身也并不容易说得清楚。在下面的 

内容中,我们将侧重的于控件使用者,而不是控件开发者的角度来说 

明这个问题。  


…………………………………………………………Page 396……………………………………………………………

ActiveX控件过去被称作OLE控件,其开发基于通常对象模型 (mon  

Object  Model,),它可以嵌入对话框或其它的ActiveX控件容 

器,如Internet Explorer和Visual Basic应用程序中使用。ActiveX 

控件取代了过去的16位的Visual Basic控件 (VBX)。  



更专业一点说,ActiveX控件是这样的一个基于的对象:它可以自 

己的窗口内绘制自身,可以用户的如单击鼠标或按下键盘之类的操作 

事件,此外是最重要的一点,使用ActiveX控件的应用程序可以通过 

该控件所包括的一系列的属性和方法(合起来称作接口)来操作该控件 

的行为。  



不要为ActiveX控件本身这个名词所误导,ActiveX控件并不仅仅限用 

于与用户的可视交互,它还可以用于其它用途,如访问数据库、监视 

数据等。ActiveX控件所能提供的功能要远远超过自定义控件的能 

力。这些能力包括很多新鲜而有趣的特性,比如将控件本身所提供的 

菜单嵌入到容器的菜单中等。  



ActiveX控件一般以。OCX文件的形式提供,并在系统中进行注册。  



对于ActiveX控件这一复杂的课题,我们现在只打算给一个最简单的 

概念。下一步我们将通过一个示例来说明ActiveX控件在编程中的使 

用。事实上,使用实例来说话往往对初学者往往要更具效果。  



      第二节 使用ActiveXMovie控件的视频播放器  



在下面的过程中,我们将通过使用ActiveMovie控件创建一个视频播 

放器,该播放器支持多种文件格式。按下面的步骤来创建示例程序 

VideoPlayer:  



1。   使用AppWizard创建一个基于对话框的MFC工程。所有步骤均使用 

AppWizard给出的默认设置。在这种情况下,应用程序自动提供了对 

ActiveX控件的支持。紧接着删除应用应用程序主对话框中的所有控 

件,包括 “确定”和 “取消”按钮。  



2。  在主对话框中单击鼠标右键,选择Insert  ActiveX  Control命 

令。随后弹出如图7。1所示的对话框。  


…………………………………………………………Page 397……………………………………………………………

                                         



                图7。 1 向对话框中插入ActiveX控件  



3。  在图7。1的列表框中选择ActiveMovieControl  Object,并单击OK 

按钮。  



  l 注意:  



  l 如果在你在如 图7。1所示的列表框中找不到项 

   ActiveMovieControl,则说明你的计算机系统中没有安装 

   ActiveMovie控件,或者ActiveMovie控件没有在你的系统中进行 

   正确的注册。这时,你需要安装ActiveMovie控件才可以继续创建 

   示例程序VideoPlayer 。可以有多个途径得到ActiveMovie控件。 

   你可以从Internet Explorer 4。0软件包中获得该控件,也可以从 

   Microsoft获得该控件的单独发布版本。  



4。   这时,回到应用程序VideoPlayer的主对话框,右击新添加的控 

件,选择ClassWizard为新添加的控件映射一个成员变量 (下面的步骤 

将说明这个成员变量的类型)。  



5。   在添加成员变量映射的过程中,ClassWizard将会弹出如图7。2所 

示的对话框,以询问是否为ActiveMovieControl   Object创建一个类 

以封装对该控件提供的接口的调用。在该对话框中单击确定。  



                                          



        图7。 2 询问是否创建一个C++类以封装ActiveMovieControl对象  


…………………………………………………………Page 398……………………………………………………………

                                       



            图7。 3 为ActiveMovie控件创建新类CActiveMovie  



在如图7。3所示的对话框中为ActiveMovieControl创建新的类 

CActiveMovie。  



上面的步骤也可以使用其它的途径来完成。首先,在Project菜单的 

Add To Project子菜单下选择ponents and Controls命令。该命 

令打开如图7。4所示的对话框,在该对话框中双击Registered  

ActiveX  Controls,并从中选择ActiveMovieControl  Object。单击 

Insert按钮,也弹出如图7。3所示的对话框。按第五步中所讲述的内 

容完成类CActiveMovie。这时,在Controls工具箱中将会多一个按钮 

  ,单击该按钮,即可像添加一般的标准控件那样添加ActiveMovie 

控件。  



相比较而言,后一种方法要更为直观一些。但两种方法的最后结果都 

是一致的,具体到每一个编程者来说,选择哪一种完成是任意的。但 

很明显,如果需要一次向对话本事             添加多于一个的同一ActiveX控 

件,使用后面的方法要省事得多。  


…………………………………………………………Page 399……………………………………………………………

                                                                    



          图7。 4 从ponents and Controls Gallery中向工程添加ActiveX控件  



在完成这一步骤之后,为新添加的Active
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!