日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

VC使用ActiveX控件常见问题

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC使用ActiveX控件常见问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://lingchuangsong.blog.163.com/blog/static/126932322008631104133309/

?

一方面,它表示將你聯系到Microsoft、Internet和業界的新技術的小型快速的可重用組件。它與開發語言無關,任何支持 ActiveX控件的軟件開發平臺(如VB、VC++、Access、VFP、Delphi、PowerBuilder等)上,都可以使用ActiveX控件,程序員可以像使用Windows標準控件一樣使用不同廠商開發的ActiveX控件。這樣就實現了軟件開發的工業化,大大地提高了軟件的生產效率。   

  另一方面,它代表Internet與應用程序的一種集成策略。用戶可以從Internet上下載ActiveX控件,也可以通過網絡在本地機上調用遠程機上的ActiveX控件,還可以將ActiveX控件加入到Internet主頁上。   

  既然ActiveX控件對程序員是如此地重要,那么如何用好ActiveX控件也就成為軟件開發者所關心的問題。本文以VC++5.0為開發工具,以一個項目名為Test的應用程序為例,就筆者在控件使用中遇到的一些問題加以討論。  

  要想在應用程序中使用ActiveX控件,必須使你的應用程序成為ActiveX控件包容器。ActiveX 控件包容器就是完全支持ActiveX控件,并能把控件組合進自己的窗口或對話框的父應用程序。利用MFC的AppWizard,你可以很方便地創建你的包容器程序。事實上,在用AppWizard創建新的應用程序時,你的應用程序就被缺省設置為控件包容器,即在第3步選中支持ActiveX Controls的復選框。如果你在創建過程中沒有選擇這項技術支持,以后也可以手動地加入這項支持。  

  步驟如下:  

  1. 在項目的應用類的.cpp文件(本例中為test.cpp)的Initinstance函數中加入對函數AfxEnableControlContainer()的調用,如下所示:  

   BOOL CTestApp::InitInstance()

   {   

   AfxEnableControlContainer();

   ...

   }  

  在使用一個已注冊的ActiveX控件之前,必須先用組件廊將該控件添加到應用程序中,步驟如下:

  1.從Project菜單選擇Add To Project下的Components and Controls。  

  2.在彈出的對話框中雙擊Registered ActiveX Control子目錄,打開此目錄。  

  3.選擇你需要的控件,點擊Insert按鈕,彈出Confirm Classes對話框。 

  4.在列出的類名中選擇需要的類(缺省為全選中,最好接受缺省設置),點擊OK,關閉Confirm Classes對話框。  

  5.點擊Close關閉組件廊,該控件的圖標即加入到對話框編輯器的控件面板上。  

  這樣,我們就可以在對話框中像使用Windows標準控件那樣使用該控件了。但在某些應用中,你可能需要在非對話框容器(如應用程序的窗口)中嵌入ActiveX控件。這時沒有對話框編輯器,我們應怎樣在非對話框容器中使用ActiveX控件呢?  

  當組件廊將ActiveX控件添加到你的應用程序后,組件廊會創建一些包裹類(即在Confirm Classes對話框中列出的那些類)。其中有一個類的基類是CWnd,該類是控件的包裹類,它被用作控件與控件包容器之間的接口,有兩個公有的Create成員函數: 

  virtual BOOL Create(LPCTSTR lpszClassName, 

  LPCTSTR lpszWindowName, DWORD dwStyle, 

   const RECT& rect, CWnd* pParentWnd, UINT nID, 

   CCreateContext* pContext = NULL)

  和BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,

   const RECT& rect, CWnd* pParentWnd, UINT nID,

   CFile* pPersist = NULL, BOOL bStorage = FALSE,

   BSTR bstrLicKey = NULL) 

  我們就可以使用該控件的包裹類的Create函數在非對話框容器中動態地創建此控件的實例。

  步驟如下:(本例中欲加入的控件名為MSFlexGrid ,CMSFlexGrid是控件的包裹類,msflexgrid.h是包裹類的頭文件) 

  1.在視類頭文件(本例中為TestView.h)中的類定義前加上

  #include “msflexgrid.h”

 2. 在TestView.h中CTestView類定義的protected部分加上控件包裹類類型的成員變量聲明:

   class CTestView : public CView

   {

   ...

   protected:

   CMSFlexGrid m_fgrid;

   ...

   }; 

  3. 用ClassWizard為類CTestView 添加消息WM_CREATE的處理函數CTestView::OnCreate,在此函數中,調用控件類CMSFlexGrid的Create函數: 

   int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

   {

   if (CView::OnCreate(lpCreateStruct) == -1)

   return -1;

   // ****** Add your code below this line ********** //

   m_fgrid.Create(NULL, WS_VISIBLE,

   CRect(50,50,100,100), this, 0); //用this指針作為指向父窗口的指針    m_fgrid.SetCols(2);

   m_fgrid.SetRows(10);

   m_fgrid.SetTextMatrix(0,0,"序號");

   m_fgrid.SetTextMatrix(0,1,"姓名");

   // ****** Add your code above this line ********** //

   return 0;

   }

  4.重新鏈接工程,運行。可以看到當應用程序的視窗生成時,控件也動態地生成了。

  

  5.如果你以后還想改變控件的位置和大小,可以繼承CWnd::MoveWindow()函數。例如,若想使控件充滿整個窗口,并在父窗口移動和縮放時也隨之移動和縮放,可以添加消息WM_SIZE的處理函數OnSize,并加入如下代碼:

  void CTestView::OnSize(UINT nType, int cx, int cy)

   {

   CView::OnSize(nType, cx, cy);

   // TODO: Add your message handler code here

   m_fgrid.MoveWindow(0,0,cx,cy);

   }  

     通常情況下,我們可以用兩種方法來存取對話框中的控件:1、將控件與對話框的成員變量相關聯,通過對話框數據交換DDX來實現控件和對應的成員變量之間的數據交換(詳情請參閱VC聯機幫助ActiveX Control Containers: Connecting an ActiveX Control to a Member Variable);2、調用函數CWnd::GetDlgItem來取得指向控件的指針。

  有些ActiveX控件沒有用戶界面,在運行時不可見。如果你在對話框中加入了運行時不可見的ActiveX控件,并想用CWnd::GetDlgItem來存取此控件,此控件將不能正常工作。要得到代表此控件的對象指針,可采取以下兩種方法之一: 

  1. 在ClassWizard的成員變量標簽中,選擇此控件的ID,點擊Add Variable,然后輸入一個成員變量名,在Category中選擇”Control”,在Variable type中選擇控件類。 

  2. 聲明一個此控件類型的局部變量,并將它作為一個對話框項。加入類似如下所列的代碼(其中CmyCtrl是控件類,IDMYCTRL1是控件ID): 

   CMyCtrl myCtrl;

   myCtrl.SubclassDlgItem(IDC_MYCTRL1, this);

   // ... 使用控件myCtrl ...

   myCtrl.UnsubclassWindow(); 

  下面舉一個例子加以說明。本例將在對話框中加入一個運行時不可見的計時控件Timer Object。該控件在一個的預定的時間間隔過去之后引發 Timer 事件,該時間間隔儲存于該控件的 Interval 屬性中,它以千分之一秒為單位指定時間的長度。本例用一個成員變量m_num來計數,每隔Interval時間遞增1,當m_num計到10時,重置為0,并將時間間隔m_Interval增加200毫秒,并分別在兩個靜態框中顯示當前的m_num和m_Interval。

  步驟如下: 

  1.用組件廊將Timer控件加入到項目Test中。 

  2.在項目中插入一個新的對話框,類名為CTestDlg。 

  3.在對話框模板中加入控件Timer Object(包裹類為CIeTimer),如圖2的右下角。打開屬性對話框,設置ID為IDC_TIMER1。再切換至All屬性頁,設置Interval為200。 

  4.在對話框模板中添加靜態控件,Caption為“The current interval is:”。 

  5.添加一個不帶Caption的靜態控件,打開屬性對話框,設置ID為IDC_STATIC1。再切換至Extended Styles屬性頁,選中Static edge復選框。 

  6.按下Ctrl鍵的同時雙擊靜態控件IDC_STATIC1,彈出Add Member Variable對話框,第一項中填寫變量名m_text1,Category項中選擇Control,Variable type項中選擇CStatic。 

  7.添加靜態控件“The current number is:”。 

  8.重復步驟5到步驟6,添加一個不帶Caption的靜態控件(ID為IDC_STATIC2),變量名為m_text2。

  

  9.運行ClassWizard并選擇Message Map屬性頁,在Class name 中選擇CTestDlg,Object IDs中選擇IDC_TIMER1,在Messages中選擇Timer,點擊Add Function…按鈕,加入OnTimerTimer1()處理函數。

  若采用第一種方法,則按前面所述方法用ClassWizard給此控件類添加一個成員變量m_timer,并在OnTimerTimer1函數中添加如下代碼: 

  void CTestDlg::OnTimerTimer1()

  {

   // TODO: Add your control notification handler code here

   char buf[10];

   m_num++;

   if(m_num>=10)

   {

   m_num=0;

   m_interval+=200;

   m_timer.SetInterval(m_interval);

   }

   _itoa(m_interval,buf,10);

   m_text1.SetWindowText (buf);

   _itoa(m_num,buf,10);

   m_text2.SetWindowText (buf);

  } 

   若采用第二種方法,不需要添加此控件類的成員變量,只需將加灰顯示的語句用下列語句代替即可: 

   CIeTimer m_timer;

   m_timer.SubclassDlgItem(IDC_TIMER1,this);

   m_timer.SetInterval(m_interval);

   m_timer.UnsubclassWindow();  

  

  運行之后可以看到計數的步調越來越慢了(時間間隔越來越大了)

  ActiveX控件大大地簡化了開發者的工作,靈活地使用控件能使開發者高效地開發出各種軟件。以上是筆者在使用控件的過程中總結出的一些實踐經驗,希望對大家有所幫助。

總結

以上是生活随笔為你收集整理的VC使用ActiveX控件常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:VC使用ActiveX控件常见问题