⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcc7.htm

📁 SHELL排序算法与应用
💻 HTM
📖 第 1 页 / 共 2 页
字号:
        <p> <font color="#000000" class="a">   AfxOleRegisterControlClass( 
          </font></span></p>
        <p> <font color="#000000" class="a">   AfxGetInstanceHandle(), 
          </font></span></p>
        <p> <font color="#000000" class="a">   m_clsid, 
          m_lpszProgID, </font></span></p>
        <p> <font color="#000000" class="a">   IDS_MYCTL, 
          IDB_MYCTL, </font></span></p>
        <p> <font color="#000000" class="a">   afxRegApartmentThreading, 
          </font></span></p>
        <p> <font color="#000000" class="a">   _dwMyCtlOleMisc, 
          _tlid, </font></span></p>
        <p> <font color="#000000" class="a">   _wVerMajor, 
          _wVerMinor); </font></span></p>
        <p> <font color="#000000" class="a">   else </font></span></p>
        <p> <font color="#000000" class="a">   return </font></span></p>
        <p> <font color="#000000" class="a">   AfxOleUnregisterClass(m_clsid, 
          </font></span></p>
        <p> <font color="#000000" class="a">   m_lpszProgID);} 
          </font></span></p>
        <p> <font color="#000000" class="a">   看起来似乎能够通过将该值改为0(标记控件非单元模型安全)解决问题。但如果希望在尽可能多的容器内支持该控件,就必须使控件支持单元模型线程。这是因为,一些开发环境容器如VJ++,需要控件支持单元模型线程。另外,单元模型线程能够让IE在创建新窗口时更高效地使用ActiveX控件。 
          </font></span></p>
        <p> <font color="#000000" class="a">   使用信号量避免两个线程同时访问临界区,可以解决在实例(和线程)之间共享数据(或唯一资源)所引起的问题。类似地,通过创建资源池可以避开受限资源问题。例如,可以让控件从数据库连接池选择一个连接,从而在访问数据库时可以获得可用连接且不影响其它线程。 
          </font></span></p>
        <p> <font color="#000000" class="a">   四、支持内容检验 
          </font></span></p>
        <p> <font color="#000000" class="a">   许多可定制的控件允许用户检验其内容。这种检验一般在用户结束编辑一个控件并移动焦点时执行。在失去输入焦点时Windows发送WM_KILLFOCUS消息给控件。一般地,控件应该提供一个机会给所有使用它的程序员响应这个重要事件。一些开发工具,如VB,能够在控件获得和失去焦点时自动提供事件;但也有的容器不能。因而,更为稳妥的办法是加入自己定制的事件,以确保总是给程序员机会回应此事件。 
          </font></span></p>
        <p> <font color="#000000" class="a">   在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按钮直接进入编辑: </font></span></p>
        <p> <font color="#000000" class="a">   void CCtrl::OnKillFocus(CWnd* 
          </font></span></p>
        <p> <font color="#000000" class="a">   pNewWnd) 
          { </font></span></p>
        <p> <font color="#000000" class="a">   COleControl::OnKillFocus( 
          _ </font></span></p>
        <p> <font color="#000000" class="a">   pNewWnd); 
          </font></span></p>
        <p> <font color="#000000" class="a">   FireCtlLostFocus();} 
          </font></span></p>
        <p> <font color="#000000" class="a">   不管是什么容器,可以通过上述步骤为控件加入检验功能。 
          </font></span></p>
        <p> <font color="#000000" class="a">   使用同样的步骤可以加入WM_SETFOCUS消息的处理过程和FireCtlGotFocus事件。 
          </font></span></p>
        <p> <font color="#000000" class="a">   五、响应键盘和鼠标事件 
          </font></span></p>
        <p> <font color="#000000" class="a">   许多控件需要让用户利用箭头键改变显示,比如在文本之间移动作为插入点的闪烁线条,或是在容器内移动以获得更好的定位精度。然而,有时容器也利用相同的按键,如IE使用向下的箭头键滚动HTML文档,此时控件在获得焦点时并不能够响应箭头键。 
          </font></span></p>
        <p> <font color="#000000" class="a">   通过覆盖CWnd类的PreTranslateMessage函数可以重新收回由容器对象控制的箭头键(以及其它键)的控制权。只要监视WM_KEYDOWN消息并过滤出需要的事件,然后在需要响应某个按键的时候,调用OnKeyDown并返回True。 
          </font></span></p>
        <p> <font color="#000000" class="a">   如果是在MDI窗口内使用ActiveX控件,而另一个窗口部分地隐藏该MDI窗口,可能会遇到另外一个问题:单击ActiveX控件并不能使MDI窗口移到最前面(即激活)。这是由于MDI窗口不能得知用户在ActiveX控件上的鼠标单击事件,因而无法作出响应并把自己设为活动窗口。 
          </font></span></p>
        <p> <font color="#000000" class="a">   要是能够让父窗口(在这里是指MDI窗口)获知ActiveX控件上的单击事件,就可以解决这个问题。一个简单的办法是由控件发送WM_ 
          PARENTNOTIFY消息给父窗口以通知该鼠标单击事件。WM_ PARENTNOTIFY消息在控件被创建、破坏或用户在控件上按鼠标键的时候发送。通过设置合适的扩展风格位,可以确保用户按鼠标键时控件发送该消息。首先覆盖控件的PreCreateWindow虚函数。传递给这个函数的参数CREATESTRUCT包含dwExStyle成员,使用该成员可以检查或修改用于创建控件的扩展风格位: 
          </font></span></p>
        <p> <font color="#000000" class="a">   BOOL CCtrl::PreCreateWindow(CREATESTRUCT&amp; 
          cs){ </font></span></p>
        <p> <font color="#000000" class="a">   cs.dwExStyle 
          &amp;= </font></span></p>
        <p> <font color="#000000" class="a">   ~WS_EX_NOPARENTNOTIFY; 
          </font></span></p>
        <p> <font color="#000000" class="a">   return </font></span></p>
        <p> <font color="#000000" class="a">   COleControl::PreCreateWindow(cs);} 
          </font></span></p>
        <p> <font color="#000000" class="a">   这个修改导致用户在控件上按鼠标键时控件的缺省鼠标处理过程发送WM_PARENTNOTIFY消息,父窗口可以利用这个机会激活自己。 
          </font></span></p>
        <p> <font color="#000000" class="a">   六、使用常量 </font></span></p>
        <p> <font color="#000000" class="a">   另一个有关容器的问题涉及到常量处理。OLE控件经常有以枚举量为值的属性。例如一个叫ScrollBars的属性使用下列枚举量,必须在部件类库定义: 
          </font></span></p>
        <p> <font color="#000000" class="a">   typedef enum 
          { </font></span></p>
        <p> <font color="#000000" class="a">   sbNone = 
          0, </font></span></p>
        <p> <font color="#000000" class="a">   sbAutomatic 
          = 1, </font></span></p>
        <p> <font color="#000000" class="a">   sbAlwaysOn 
          =2,} ctlScrollBarConstants; </font></span></p>
        <p> <font color="#000000" class="a">   然而,并非所有的容器能够读取这些枚举定义以用于开发环境(如VBScript)。作为一个控件开发者,可以提供一个附加的文件用于定义这些常量在不同开发环境下的值,或者提供另外的方法来获得这些枚举量。对于后者,具体实现时可在控件中加入对应于枚举量的方法。 
          </font></span></p>
        <p> <font color="#000000" class="a">   例如,可以加入三个方法:sbNone、sbAutomatic、sbAlwaysOn,它们的返回值分别对应于枚举量: 
          </font></span></p>
        <p> <font color="#000000" class="a">   short CCtrl::sbNone 
          (){ </font></span></p>
        <p> <font color="#000000" class="a">   return 0;} 
          </font></span></p>
        <p> <font color="#000000" class="a">   short CCtrl::sbAutomatic 
          (){ </font></span></p>
        <p> <font color="#000000" class="a">   return 1;} 
          </font></span></p>
        <p> <font color="#000000" class="a">   short CCtrl::sbAlwaysOn 
          (){ </font></span></p>
        <p> <font color="#000000" class="a">   return 2;} 
          </font></span></p>
        <p> <font color="#000000" class="a">   在此基础上就可以使用这些方法在任何开发环境(容器)设置ScrollBars的属性了: 
          </font></span></p>
        <p> <font color="#000000" class="a">   ctl.ScrollBars 
          = ctl.sbAutomatic <br>
          (全文完)</font> </span>
         
      </td>
    </tr>
    </tbody> 
  </table>
</div>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -