网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
创建适用于多种容器的控件
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
己处于运行模式,这样就可以避免这个限制了:

   BOOL CCtrl::OptimisticAmbientUserMode(){

   BOOL bUserMode;

   if (!GetAmbientProperty(

   DISPID_AMBIENT_USERMODE,

   VT_BOOL, &bUserMode))

   bUserMode = TRUE;

   //如果容器没有回答则假定为运行模式

   return bUserMode;}

   三、线程模型和资源共享

   Microsoft的两种线程模型,单线程和单元模型,同样使得在多种容器内使用控件复杂化。单线程控件在单一线程内执行所有对象;单元线程控件可在任何时候任何线程内执行一个对象。

   某些情况下可能需要将特定资源全局化以便控件的所有实例访问。例如,如果控件的多个实例执行许多数据库操作,此时需要为所有实例创建单一的、共享的数据库连接,而不是为每个实例单独创建连接(其它的情况还包括只有一个可用资源的情形,例如设备上下文或端口)。

   在单元模型线程环境下共享资源时有一个重大问题需要解决。例如,两个线程能够同时尝试使用同一个资源。这可能导致数据错误或其它非预期的结果。那么,容器如何才能知道控件是单元模型线程安全的?在类工厂(类对象)调用UpdateRegistry期间控件写入数据到注册表。当控件为线程安全时常量

   afxRegApartmentThreading通知容器:

   BOOL CCtrl::C3CtrlFactory::UpdateRegistry(

   BOOL bRegister){

   if (bRegister)

   return

   AfxOleRegisterControlClass(

   AfxGetInstanceHandle(),

   m_clsid, m_lpszProgID,

   IDS_MYCTL, IDB_MYCTL,

   afxRegApartmentThreading,

   _dwMyCtlOleMisc, _tlid,

   _wVerMajor, _wVerMinor);

   else

   return

   AfxOleUnregisterClass(m_clsid,

   m_lpszProgID);}

   看起来似乎能够通过将该值改为0(标记控件非单元模型安全)解决问题。但如果希望在尽可能多的容器内支持该控件,就必须使控件支持单元模型线程。这是因为,一些开发环境容器如VJ++,需要控件支持单元模型线程。另外,单元模型线程能够让IE在创建新窗口时更高效地使用ActiveX控件。

   使用信号量避免两个线程同时访问临界区,可以解决在实例(和线程)之间共享数据(或唯一资源)所引起的问题。类似地,通过创建资源池可以避开受限资源问题。例如,可以让控件从数据库连接池选择一个连接,从而在访问数据库时可以获得可用连接且不影响其它线程。

   四、支持内容检验

   许多可定制的控件允许用户检验其内容。这种检验一般在用户结束编辑一个控件并移动焦点时执行。在失去输入焦点时Windows发送WM_KILLFOCUS消息给控件。一般地,控件应该提供一个机会给所有使用它的程序员响应这个重要事件。一些开发工具,如VB,能够在控件获得和失去焦点时自动提供事件;但也有的容器不能。因而,更为稳妥的办法是加入自己定制的事件,以确保总是给程序员机会回应此事件。

   在VC++中,可以使用ClassWizard为控件加入失去焦点时执行检验的定制事件。按Ctrl+W启动ClassWizard,然后单击ActiveX Events属性页以及Add Event按钮。接下来,输入“ctlLostFocus”作为External name,Internal Name自动设为FireCtlLostFocus。由于该事件不需要参数,因而忽略参数表并单击OK按钮。现在显示Message Maps属性页,从可用消息列表中选择WM_KILLFOCUS,单击Add Function按钮,此时ClassWizard为控件加入了消息处理函数。单击Edit Code按钮直接进入编辑:

   void CCtrl::OnKillFocus(CWnd*

   pNewWnd) {

   COleControl::OnKillFocus( _

   pNewWnd);

   FireCtlLostFocus();}

   不管是什么容器,可以通过上述步骤为控件加入检验功能。

   使用同样的步骤可以加入WM_SETFOCUS消息的
  • 下一篇资讯: VC++之Static Box控件
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号