在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

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

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

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

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

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

   一、關(guān)于ActiveX控件

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

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

   創(chuàng)建ActiveX控件開始于選擇開發(fā)工具。可供選擇的工具很多,從VB到Delphi到VJ++。本文由VC++為出發(fā)點(diǎn)討論控件創(chuàng)建。使用VC++可以獲得更快的執(zhí)行速度和對(duì)創(chuàng)建過程更多的控制,以及最大范圍的平臺(tái)SDK和API支持。VC++提供了MFC ActiveX控件向?qū)砗?jiǎn)化ActiveX控件的創(chuàng)建。這個(gè)向?qū)б龑?dǎo)您通過創(chuàng)建控件外殼的每一步。向?qū)岢龅牡谝粋(gè)問題是是否需要許可。

   二、許可控件

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

   如果選擇許可某個(gè)控件,控件向?qū)Ь妥詣?dòng)加入了必要的接口并創(chuàng)建可定制的許可文件(LIC)。剩下必須做的工作只是修改主文檔(如myprojectCTL.CPP)中幾個(gè)變量。請(qǐng)修改許可文件的內(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)緩沖控件的許可證鍵。如果許可文件本身不再可用,應(yīng)用程序就使用緩沖的許可證鍵驗(yàn)證控件。在桌面環(huán)境下這是可行的,但在Internet(和Intranet)環(huán)境下并沒有內(nèi)建的機(jī)制以通過HTML安全地緩沖這個(gè)許可信息。

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

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

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

   BOOL CCtrl::OptimisticAmbientUserMode(){

   BOOL bUserMode;

   if (!GetAmbientProperty(

   DISPID_AMBIENT_USERMODE,

   VT_BOOL, &bUserMode))

   bUserMode = TRUE;

   //如果容器沒有回答則假定為運(yùn)行模式

   return bUserMode;}

   三、線程模型和資源共享

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

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

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

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

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

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

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

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

   void CCtrl::OnKillFocus(CWnd*

   pNewWnd) {

   COleControl::OnKillFocus( _

   pNewWnd);

   FireCtlLostFocus();}

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

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

   五、響應(yīng)鍵盤和鼠標(biāo)事件

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

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

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

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

   BOOL CCtrl::PreCreateWindow(CREATESTRUCT& cs){

   cs.dwExStyle &=

   ~WS_EX_NOPARENTNOTIFY;

   return

   COleControl::PreCreateWindow(cs);}

   這個(gè)修改導(dǎo)致用戶在控件上按鼠標(biāo)鍵時(shí)控件的缺省鼠標(biāo)處理過程發(fā)送WM_PARENTNOTIFY消息,父窗口可以利用這個(gè)機(jī)會(huì)激活自己。

   六、使用常量

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

   typedef enum {

   sbNone = 0,

   sbAutomatic = 1,

   sbAlwaysOn =2,} ctlScrollBarConstants;

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

   例如,可以加入三個(gè)方法:sbNone、sbAutomatic、sbAlwaysOn,它們的返回值分別對(duì)應(yīng)于枚舉量:

   short CCtrl::sbNone (){

   return 0;}

   short CCtrl::sbAutomatic (){

   return 1;}

   short CCtrl::sbAlwaysOn (){

   return 2;}

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

   ctl.ScrollBars = ctl.sbAutomatic 

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 97在线国产视频| 久久人人爽av| 久久av高潮av| 欧在线一二三四区| 天堂av2020| 国产成人在线免费看| 国产精品亚洲天堂| 熟女人妇 成熟妇女系列视频| 秋霞在线一区二区| 亚洲欧美视频二区| 浮妇高潮喷白浆视频| 天天爽夜夜爽一区二区三区| 国产一区二区三区在线免费| 99re精彩视频| 国产精品亚洲a| 久久精品国产sm调教网站演员| 午夜免费视频网站| www欧美激情| 欧美午夜aaaaaa免费视频| 成年人在线看片| 久久久噜噜噜www成人网| 91网站在线观看免费| a级片一区二区| 亚洲精品在线网址| 秋霞在线一区二区| 337p亚洲精品色噜噜狠狠p| 污视频在线观看免费网站| 欧美成人手机在线视频| 午夜av中文字幕| 色天使在线观看| 在线观看视频在线观看| 中文字幕剧情在线观看| 男人j进女人j| 国产av熟女一区二区三区 | 亚洲美女爱爱视频| 国产传媒久久久| 99999精品视频| 看欧美ab黄色大片视频免费| 无需播放器的av| 久久久成人精品一区二区三区| www.18av.com| 无码精品国产一区二区三区免费| 午夜激情在线观看视频| wwwwwxxxx日本| 欧美日韩在线免费观看视频| 中文精品无码中文字幕无码专区 | 成人高清dvd| 久久综合色视频| 亚洲AV无码成人精品一区| 男人的天堂狠狠干| 国产色视频在线播放| 欧美乱做爰xxxⅹ久久久| 99草草国产熟女视频在线| 日本xxxx黄色| 日韩av综合在线观看| 污污网站在线观看视频| 人妻久久久一区二区三区| 成人亚洲精品777777大片| 992tv快乐视频| 91亚洲精品久久久蜜桃借种| 欧美极品欧美精品欧美| 日本高清免费在线视频| 日韩欧美xxxx| 亚洲熟妇av日韩熟妇在线| 中文字幕第一页亚洲| 波多野结衣天堂| 国产91xxx| 国产91在线亚洲| 国产成人精品免费看在线播放 | 男女激烈动态图| xx欧美撒尿嘘撒尿xx| 黄色一级片在线看| 亚洲精品国产suv一区88| 黄色手机在线视频| 精品久久一二三| 波多野结衣与黑人| 一级黄色片国产| 老太脱裤让老头玩ⅹxxxx| a级片一区二区| 91麻豆天美传媒在线| 手机版av在线| 中文字幕天天干| 国产精品久久a| 美女喷白浆视频| 三上悠亚av一区二区三区| 亚洲精品中文字幕无码蜜桃| 久久精品免费一区二区| 国产 日韩 亚洲 欧美| 女人色极品影院| 国产自产在线视频| 免费av观看网址| 国产日韩欧美大片| 韩国无码av片在线观看网站| 国产91沈先生在线播放| 草b视频在线观看| 男人日女人下面视频| 国产人妻人伦精品| 欧美精品卡一卡二| 国产精品国产亚洲精品看不卡| 大陆av在线播放| 日韩免费毛片视频| 九色porny自拍| 天天干天天曰天天操| www.日本三级| 色婷婷综合久久久久中文字幕| 97视频在线免费播放| 怡红院亚洲色图| 国产xxxx振车| 少妇性l交大片| 午夜影院免费版| 中文字幕第21页| 无码人妻精品一区二区三区在线| 亚洲免费黄色录像| 免费日韩中文字幕| 日韩网站在线免费观看| 午夜福利123| 色一情一区二区| 人人干人人视频| 人妻精品无码一区二区三区| 日韩国产小视频| 国产一级免费大片| 亚洲欧美偷拍另类| 无码人妻精品一区二区三区在线| 国产精品免费看久久久无码| 亚洲美女性囗交| 男人添女人下面免费视频| 欧美极品欧美精品欧美图片| 久久艹国产精品| 成年人看的毛片| 91动漫在线看| 成年人视频网站免费| 日韩不卡视频一区二区| 亚洲精品偷拍视频| 善良的小姨在线| 青青草免费在线视频观看| 麻豆中文字幕在线观看| 国产一区二区在线观看免费视频| 天天干天天干天天干天天干天天干| 日韩欧美在线播放视频| 国产成人a亚洲精v品无码| 草草久久久无码国产专区| 大陆极品少妇内射aaaaa| 欧美丰满熟妇bbbbbb百度| 97成人在线观看视频| 青青青国产在线视频| 午夜免费福利在线| 国产精品视频中文字幕| www.亚洲一区二区| 国产在线xxxx| 欧美老熟妇喷水| 奇米视频7777| 黄色一级大片免费| 精品少妇一区二区三区在线| 少妇性l交大片| 精品国产一区二区三区在线| 日韩精品一区二区免费| 久久久久狠狠高潮亚洲精品| 91精品999| 日本福利视频一区| 亚洲老女人av| 大陆极品少妇内射aaaaaa| av7777777| 污视频网址在线观看| av动漫在线播放| 色婷婷狠狠18| 成人在线观看你懂的| 中文字幕一区久久| 夜夜添无码一区二区三区| 美女在线视频一区二区| 欧美无砖专区免费| 免费一区二区三区在线观看| 日韩一级免费看| 欧美性受xxxx黒人xyx性爽| koreanbj精品视频一区| 自拍一级黄色片| 又色又爽又高潮免费视频国产| 小说区视频区图片区| 精品久久久久久无码国产| 高清无码一区二区在线观看吞精| 五月天婷婷激情视频| av女优在线播放| 7777在线视频| 五月天激情视频在线观看| 丰满爆乳一区二区三区| 亚洲天堂第一区| 亚洲在线观看网站| 亚洲天堂av线| 久久久精品在线视频| www在线观看免费| 日韩成人手机在线| 水蜜桃在线免费观看| 日日噜噜夜夜狠狠| 熟女少妇精品一区二区| 黄色一级片在线看| 中文字幕人妻熟女人妻洋洋| 中国一级大黄大黄大色毛片| 久久久国产精华液999999| 黄色片一级视频| 国产精品动漫网站| 茄子视频成人免费观看|