国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

創(chuàng)建適用于多種容器的控件

創(chuàng)建適用于多種容器的控件

更新時間:2019-05-30 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

即使是一個符合OLE標準的控件,在不同的ActiveX容器里其行為也會偶爾不同。不能成功地適應容器之間的差別將嚴重影響控件在某些容器內(nèi)的應用,甚至導致控件完全無法在個別容器使用。

   本文討論使用Visual C++創(chuàng)建控件時如何適應容器相關的需求,特別是為大范圍內(nèi)使用而開發(fā)ActiveX控件時必須執(zhí)行的策略。例如,如何解決諸如許可、線程、內(nèi)容檢驗、鍵盤事件響應等問題。

   一、關于ActiveX控件

   在具體討論容器之間的差別前(這種差別使得為多種容器開發(fā)ActiveX控件復雜化),有必要回顧一下何謂ActiveX控件以及它的創(chuàng)建過程。

   ActiveX控件可以看成是實現(xiàn)了標準OLE接口的COM對象。所有的控件都必須最終定位于某種容器,如Visual Basic、Visual C++、IE瀏覽器。容器使用標準的OLE接口和控件協(xié)商。例如,容器可以創(chuàng)建、定制、存儲控件以便以后使用。容器和ActiveX控件之間的所有交互都通過標準的OLE接口進行,由此,ActiveX控件追隨了“黑盒”這一思想。控件的用戶除了需要了解它的外部接口外,并不需要知道它的內(nèi)部工作過程。只要開發(fā)工具(容器)以及編程語言理解并使用標準的OLE接口,就可以在多種容器中使用ActiveX控件。當然,這僅僅是理論;在實踐中,沒有兩種容器是相同的,開發(fā)者必須把握它們之間的不同之處。

   創(chuàng)建ActiveX控件開始于選擇開發(fā)工具。可供選擇的工具很多,從VB到Delphi到VJ++。本文由VC++為出發(fā)點討論控件創(chuàng)建。使用VC++可以獲得更快的執(zhí)行速度和對創(chuàng)建過程更多的控制,以及最大范圍的平臺SDK和API支持。VC++提供了MFC ActiveX控件向導來簡化ActiveX控件的創(chuàng)建。這個向導引導您通過創(chuàng)建控件外殼的每一步。向導提出的第一個問題是是否需要許可。

   二、許可控件

   控件操作有兩個不同的環(huán)境:運行時和設計時。一個需要許可證的控件包含幾個接口用于設計時限制某些訪問。缺乏適當許可的用戶只能在運行環(huán)境下使用該控件,而不能在設計環(huán)境下使用它。如果打算在企業(yè)內(nèi)部、Internet、本地Intranet上使用控件,一般會避免使用許可證。然而,如果是出售商業(yè)產(chǎn)品或打算限制設計時訪問控件的能力,就應該利用許可所帶來的優(yōu)點。

   如果選擇許可某個控件,控件向導就自動加入了必要的接口并創(chuàng)建可定制的許可文件(LIC)。剩下必須做的工作只是修改主文檔(如myprojectCTL.CPP)中幾個變量。請修改許可文件的內(nèi)容使之符合許可證鍵:

   static const TCHAR BASED_CODE

   _szLicFileName[] = _T("control.lic");

   static const WCHAR BASED_CODE

   _szLicString[] ="My Unique Validation String";

   在許可文件可用之后,開發(fā)工具經(jīng)常在工程內(nèi)緩沖控件的許可證鍵。如果許可文件本身不再可用,應用程序就使用緩沖的許可證鍵驗證控件。在桌面環(huán)境下這是可行的,但在Internet(和Intranet)環(huán)境下并沒有內(nèi)建的機制以通過HTML安全地緩沖這個許可信息。

   有兩種方法解決這個問題。第一,可以使用Microsoft的一個叫LPK_Tool.exe的工具,它是Microsoft Internet Client SDK的一部份。LPK_Tool.exe能夠將許可文件轉換為可在HTML文檔內(nèi)引用的加密文件。IE能夠在實例化一個需要許可證的控件時從LPK文件提取許可信息:   

   第二個辦法需要定制控件的許可驗證例程。例如,它可以詢問容器自己正處于設計模式還是運行模式。控件所繼承的類(COleControl)包含成員函數(shù)AmbientUserMode,此函數(shù)在控件處于設計模式時返回TRUE。

   然而,并非所有容器響應此查詢(包括IE瀏覽器)。此時AmbientUserMode總是返回TRUE;換句話說,它總是假定控件是在設計模式下。如果容器錯誤地響應查詢,可以寫一個函數(shù)強制控件認為自己處于運行模式,這樣就可以避免這個限制了:

   BOOL CCtrl::OptimisticAmbientUserMode(){

   BOOL bUserMode;

   if (!GetAmbientProperty(

   DISPID_AMBIENT_USERMODE,

   VT_BOOL, &bUserMode))

   bUserMode = TRUE;

   //如果容器沒有回答則假定為運行模式

   return bUserMode;}

   三、線程模型和資源共享

   Microsoft的兩種線程模型,單線程和單元模型,同樣使得在多種容器內(nèi)使用控件復雜化。單線程控件在單一線程內(nèi)執(zhí)行所有對象;單元線程控件可在任何時候任何線程內(nèi)執(zhí)行一個對象。

   某些情況下可能需要將特定資源全局化以便控件的所有實例訪問。例如,如果控件的多個實例執(zhí)行許多數(shù)據(jù)庫操作,此時需要為所有實例創(chuàng)建單一的、共享的數(shù)據(jù)庫連接,而不是為每個實例單獨創(chuàng)建連接(其它的情況還包括只有一個可用資源的情形,例如設備上下文或端口)。

   在單元模型線程環(huán)境下共享資源時有一個重大問題需要解決。例如,兩個線程能夠同時嘗試使用同一個資源。這可能導致數(shù)據(jù)錯誤或其它非預期的結果。那么,容器如何才能知道控件是單元模型線程安全的?在類工廠(類對象)調(diào)用UpdateRegistry期間控件寫入數(shù)據(jù)到注冊表。當控件為線程安全時常量

   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(標記控件非單元模型安全)解決問題。但如果希望在盡可能多的容器內(nèi)支持該控件,就必須使控件支持單元模型線程。這是因為,一些開發(fā)環(huán)境容器如VJ++,需要控件支持單元模型線程。另外,單元模型線程能夠讓IE在創(chuàng)建新窗口時更高效地使用ActiveX控件。

   使用信號量避免兩個線程同時訪問臨界區(qū),可以解決在實例(和線程)之間共享數(shù)據(jù)(或唯一資源)所引起的問題。類似地,通過創(chuàng)建資源池可以避開受限資源問題。例如,可以讓控件從數(shù)據(jù)庫連接池選擇一個連接,從而在訪問數(shù)據(jù)庫時可以獲得可用連接且不影響其它線程。

   四、支持內(nèi)容檢驗

   許多可定制的控件允許用戶檢驗其內(nèi)容。這種檢驗一般在用戶結束編輯一個控件并移動焦點時執(zhí)行。在失去輸入焦點時Windows發(fā)送WM_KILLFOCUS消息給控件。一般地,控件應該提供一個機會給所有使用它的程序員響應這個重要事件。一些開發(fā)工具,如VB,能夠在控件獲得和失去焦點時自動提供事件;但也有的容器不能。因而,更為穩(wěn)妥的辦法是加入自己定制的事件,以確保總是給程序員機會回應此事件。

   在VC++中,可以使用ClassWizard為控件加入失去焦點時執(zhí)行檢驗的定制事件。按Ctrl+W啟動ClassWizard,然后單擊ActiveX Events屬性頁以及Add Event按鈕。接下來,輸入“ctlLostFocus”作為External name,Internal Name自動設為FireCtlLostFocus。由于該事件不需要參數(shù),因而忽略參數(shù)表并單擊OK按鈕。現(xiàn)在顯示Message Maps屬性頁,從可用消息列表中選擇WM_KILLFOCUS,單擊Add Function按鈕,此時ClassWizard為控件加入了消息處理函數(shù)。單擊Edit Code按鈕直接進入編輯:

   void CCtrl::OnKillFocus(CWnd*

   pNewWnd) {

   COleControl::OnKillFocus( _

   pNewWnd);

   FireCtlLostFocus();}

   不管是什么容器,可以通過上述步驟為控件加入檢驗功能。

   使用同樣的步驟可以加入WM_SETFOCUS消息的處理過程和FireCtlGotFocus事件。

   五、響應鍵盤和鼠標事件

   許多控件需要讓用戶利用箭頭鍵改變顯示,比如在文本之間移動作為插入點的閃爍線條,或是在容器內(nèi)移動以獲得更好的定位精度。然而,有時容器也利用相同的按鍵,如IE使用向下的箭頭鍵滾動HTML文檔,此時控件在獲得焦點時并不能夠響應箭頭鍵。

   通過覆蓋CWnd類的PreTranslateMessage函數(shù)可以重新收回由容器對象控制的箭頭鍵(以及其它鍵)的控制權。只要監(jiān)視WM_KEYDOWN消息并過濾出需要的事件,然后在需要響應某個按鍵的時候,調(diào)用OnKeyDown并返回True。

   如果是在MDI窗口內(nèi)使用ActiveX控件,而另一個窗口部分地隱藏該MDI窗口,可能會遇到另外一個問題:單擊ActiveX控件并不能使MDI窗口移到最前面(即激活)。這是由于MDI窗口不能得知用戶在ActiveX控件上的鼠標單擊事件,因而無法作出響應并把自己設為活動窗口。

   要是能夠讓父窗口(在這里是指MDI窗口)獲知ActiveX控件上的單擊事件,就可以解決這個問題。一個簡單的辦法是由控件發(fā)送WM_ PARENTNOTIFY消息給父窗口以通知該鼠標單擊事件。WM_ PARENTNOTIFY消息在控件被創(chuàng)建、破壞或用戶在控件上按鼠標鍵的時候發(fā)送。通過設置合適的擴展風格位,可以確保用戶按鼠標鍵時控件發(fā)送該消息。首先覆蓋控件的PreCreateWindow虛函數(shù)。傳遞給這個函數(shù)的參數(shù)CREATESTRUCT包含dwExStyle成員,使用該成員可以檢查或修改用于創(chuàng)建控件的擴展風格位:

   BOOL CCtrl::PreCreateWindow(CREATESTRUCT& cs){

   cs.dwExStyle &=

   ~WS_EX_NOPARENTNOTIFY;

   return

   COleControl::PreCreateWindow(cs);}

   這個修改導致用戶在控件上按鼠標鍵時控件的缺省鼠標處理過程發(fā)送WM_PARENTNOTIFY消息,父窗口可以利用這個機會激活自己。

   六、使用常量

   另一個有關容器的問題涉及到常量處理。OLE控件經(jīng)常有以枚舉量為值的屬性。例如一個叫ScrollBars的屬性使用下列枚舉量,必須在部件類庫定義:

   typedef enum {

   sbNone = 0,

   sbAutomatic = 1,

   sbAlwaysOn =2,} ctlScrollBarConstants;

   然而,并非所有的容器能夠讀取這些枚舉定義以用于開發(fā)環(huán)境(如VBScript)。作為一個控件開發(fā)者,可以提供一個附加的文件用于定義這些常量在不同開發(fā)環(huán)境下的值,或者提供另外的方法來獲得這些枚舉量。對于后者,具體實現(xiàn)時可在控件中加入對應于枚舉量的方法。

   例如,可以加入三個方法:sbNone、sbAutomatic、sbAlwaysOn,它們的返回值分別對應于枚舉量:

   short CCtrl::sbNone (){

   return 0;}

   short CCtrl::sbAutomatic (){

   return 1;}

   short CCtrl::sbAlwaysOn (){

   return 2;}

   在此基礎上就可以使用這些方法在任何開發(fā)環(huán)境(容器)設置ScrollBars的屬性了:

   ctl.ScrollBars = ctl.sbAutomatic 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        日韩视频在线你懂得| 不卡av电影在线播放| 国产乱一区二区| 欧美夫妻性生活| 国产真实乱偷精品视频免| 亚洲国产精品成人久久综合一区| 国产99一区视频免费| 一区二区三区在线观看视频| 在线观看日韩国产| 久久国内精品自在自线400部| 欧美xxxx老人做受| 91香蕉视频mp4| 久久精品国产一区二区三区免费看| 精品少妇一区二区三区日产乱码 | 日本韩国一区二区三区| 亚洲福利视频一区| 久久久久九九视频| 91久久国产最好的精华液| 日本免费在线视频不卡一不卡二 | 国产精品白丝在线| 欧美久久久久久蜜桃| 国产不卡视频在线播放| 亚洲伊人伊色伊影伊综合网| 久久先锋影音av| 欧美艳星brazzers| 国产成人免费视| 蜜桃精品视频在线观看| 亚洲欧洲制服丝袜| 久久久影院官网| 日韩欧美三级在线| 在线观看免费一区| 成人h动漫精品一区二| 激情综合网激情| 日韩精品福利网| 亚洲黄色小视频| 久久精子c满五个校花| 91精品在线免费| 在线观看91视频| 成人免费视频免费观看| 捆绑变态av一区二区三区| 亚洲国产一区二区a毛片| 亚洲欧洲性图库| 中文字幕精品综合| 国产欧美一区二区精品性色超碰| 欧美一区二区播放| 69成人精品免费视频| 在线观看三级视频欧美| 91精品办公室少妇高潮对白| 成人短视频下载| 成人黄色免费短视频| 国产成人一区在线| 精品一区二区国语对白| 久久国产福利国产秒拍| 日韩成人一区二区| 日日摸夜夜添夜夜添精品视频| 一区二区三区高清| 亚洲国产cao| 午夜国产精品一区| 偷拍日韩校园综合在线| 免费在线观看日韩欧美| 精品一区二区免费在线观看| 久久99国产精品久久| 久草精品在线观看| 国产成人在线观看免费网站| 东方aⅴ免费观看久久av| 成年人国产精品| 97久久超碰精品国产| 欧美性猛交xxxxxxxx| 日本韩国精品在线| 欧美日韩视频在线第一区| 欧美精品久久一区二区三区| 日韩欧美123| 中文在线一区二区| 亚洲欧美一区二区三区极速播放| 亚洲精选视频免费看| 天天影视涩香欲综合网| 精品在线亚洲视频| 99视频热这里只有精品免费| 在线免费不卡电影| 日韩一区二区三区视频在线观看 | 欧美日韩综合在线| 精品日韩一区二区三区免费视频| 国产精品污www在线观看| 亚洲高清中文字幕| 狠狠久久亚洲欧美| 91蜜桃视频在线| 欧美一区二区播放| 综合色天天鬼久久鬼色| 亚洲成人av一区二区三区| 国产高清精品网站| 欧美日韩你懂得| 国产精品久久久久久久久图文区 | 成人av网址在线| 欧美日韩在线免费视频| 国产午夜精品在线观看| 亚洲.国产.中文慕字在线| 国产成人午夜99999| 欧美日韩一区二区三区高清 | 欧美群妇大交群的观看方式| 国产亚洲精品aa午夜观看| 亚洲成人在线观看视频| 国产精品123区| 91精品国产综合久久婷婷香蕉| 日本一区二区久久| 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美激情艳妇裸体舞| 日韩电影一区二区三区| 色综合久久六月婷婷中文字幕| 欧美成va人片在线观看| 午夜国产精品影院在线观看| av在线播放一区二区三区| 精品国精品自拍自在线| 天堂久久一区二区三区| 欧美午夜理伦三级在线观看| 国产精品免费人成网站| 国产成人在线网站| 久久久久亚洲蜜桃| 精品中文字幕一区二区| 在线播放国产精品二区一二区四区| 国产精品久久毛片| 岛国精品一区二区| 国产免费观看久久| 国产精品一区二区在线观看不卡 | 国产.精品.日韩.另类.中文.在线.播放| 欧美午夜不卡在线观看免费| 亚洲少妇屁股交4| 成人毛片视频在线观看| 国产三级欧美三级| 国产成人在线视频网址| 久久久久国产精品麻豆ai换脸| 麻豆91免费看| 欧美xfplay| 国产精品69毛片高清亚洲| 久久免费的精品国产v∧| 国产精品综合av一区二区国产馆| 精品动漫一区二区三区在线观看| 麻豆精品一区二区三区| 久久色.com| 99久久精品久久久久久清纯| 自拍偷拍亚洲激情| 在线视频国产一区| 亚洲www啪成人一区二区麻豆| 91麻豆精品国产无毒不卡在线观看| 午夜精品成人在线视频| 欧美电影免费观看高清完整版| 美女视频黄 久久| 国产日韩欧美精品在线| 91日韩一区二区三区| 日韩在线一区二区| 精品国产乱码久久久久久图片| 国产精品自拍av| 亚洲黄色小说网站| 欧美一区二区三区四区五区| 韩国一区二区视频| 国产精品夫妻自拍| 欧美日韩一区高清| 九九视频精品免费| 亚洲欧洲99久久| 8x福利精品第一导航| 久久精品免费观看| 成人免费小视频| 欧美乱妇一区二区三区不卡视频| 激情综合一区二区三区| 亚洲欧美一区二区三区孕妇| 欧美精品第一页| 丁香一区二区三区| 视频一区中文字幕国产| 国产精品乱码人人做人人爱| 欧美日韩亚洲另类| 成人高清免费在线播放| 裸体健美xxxx欧美裸体表演| 亚洲品质自拍视频网站| 欧美va亚洲va| 欧美偷拍一区二区| 成人一二三区视频| 久久99精品久久久| 五月天丁香久久| 亚洲欧洲制服丝袜| 国产欧美精品区一区二区三区| 欧美精品v国产精品v日韩精品| 成人永久免费视频| 久久97超碰色| 五月激情六月综合| 亚洲免费观看高清完整| 国产日韩亚洲欧美综合| 日韩一区二区三区高清免费看看| 91小视频在线观看| 高清久久久久久| 国产麻豆成人精品| 日本中文在线一区| 亚洲午夜激情av| 一区二区免费视频| 国产精品天天看| 国产三级精品三级在线专区| 日韩欧美国产综合一区| 欧美在线免费观看亚洲| 91毛片在线观看| 不卡一区二区在线| 成+人+亚洲+综合天堂| 风间由美中文字幕在线看视频国产欧美|