• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            萬星星@豌豆莢 歡迎加入我們
            一個吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0
            自從去年年底一次棘手的界面,開始研究用web做界面到現在大約1年,這一年間不是局限在實現層面,也并非一直研究這一個問題,有很多問題其實不是問題,只是自己沒有想清楚或者思想沒放開。對于一個界面開發人員,想必拉的對話框不少于100個,膩味不必說,光是對話框大小改變導致控件跟著變化都需要一番功夫,加上界面美觀,界面的風格統一,界面的靈活多變......,頭痛。在對話框里面加載位圖,加載gif,超鏈接......,啊,沒法控制了吧!在考慮遠點,現在.net3.0技術已經完全打破應用和桌面的界限,我們的界面html資源完全可以放在一個web站點上,這樣界面是完全動態的。

            其間寫過2篇這方面的文章,基于vc6實現,繞彎很大。在vc7.1、vc8里面要簡單很多,主要是把幾個以前為公開的類公開了,最重要的是在CWnd里面加入了一個虛函數CreateControlSite使得有機會改變控件站點以修改控件行為。在mfc類層次上,CHTMLView和CDHtmlDialog為開發者提供了創建webgui的一系列基礎設施,包括事件機制、窗口行為、以及對html文檔操縱接口。我們在此基礎上實現webgui很簡單,然而仍然困惑我很久,經理也催過我幾次我一直未肯決定最終方案。在我腦袋里一直琢磨是要應用程序完全操縱html文檔,還是html訪問應用獲取信息,其實就是它們之間的通信模式。一直到昨天我才定下方案,應用通過IWebBrowser2接口操縱html元素,html通過vbscript、javascript腳本響應本身事件,訪問應用。主要是考慮通信自然暢通,而以前我一味想通過應用指令完全控制html元素,導致去解析html文檔,費力不討好。下面開始我的想法:

            寫一個dll,封裝CDHtmlDialog,提供一個類似html容器的對話框,功能就是加載html網頁,以及創建與html呼應的com組件。它本身不包含與應用功能有關代碼,應用有關的部分是html頁面和對于的com功能組件。這里需要對CDHtmlDialog進行了適當的改造以適合自己的目標:

            首先從CDHtmlDialog派生一個類CHTMLContainerDlg,默認情況下會生成一個網頁資源,這個網頁是這個對話框創建時加載的,我們需要的其實是一個容器而不是一個具體的對話框,所以刪除網頁資源,修改對話框頭文件:
            enum?{?IDD?=?IDD_HTMLCONTAINERDLG,?IDH?=?0?};
            這里把IDH修改為0,因為我們刪除了網頁資源。然而在對話框創建后會加載該資源,在CDHtmlDialog的OnInitDialog函數里面我們可以看到:
            if?(m_nHtmlResID)
            ????????LoadFromResource(m_nHtmlResID);
            ????else?if?(m_szHtmlResID)
            ????????LoadFromResource(m_szHtmlResID);
            ????else?if?(m_strCurrentUrl)
            ????????Navigate(m_strCurrentUrl);
            結果就是對話框一出現就會出現加載一個無效地址的頁面,出現無法打開鏈接的頁面,為了避免這個問題,需要重載OnInitDialog函數。其實就是拷貝mfc代碼然后去掉上面那段代碼就ok,強制不加載頁面。那么為了加載指定頁面,需要一個函數:
            void?CHTMLContainerDlg::SetHtmlAndCom(CString?strURL,?CString?strProg)
            {
            ????HRESULT????????hr????????=?NOERROR;
            ????m_strURL?=?strURL;
            ????hr?=?m_spComDisp.CoCreateInstance(strProg);
            ????if(FAILED(hr))
            ????{
            ????????TRACE(_T("Some?error?when?create?com?object\n"));
            ????}
            ????SetExternalDispatch(m_spComDisp);
            }
            指定html的url和對應功能組件的progid,這樣在網頁里面可以通過腳本window.external訪問該com組件。
            這樣就可以加載html網頁,但是html頁面里面的元素風格卻是2k風格(至少在ie7以下版本是如此),這個怕是沒起到一點美觀作用,為之我考慮了半天,問過做web的人是否有辦法,最終還是靈感光臨,誤撞上了。重載GetHostInfo函數:
            STDMETHODIMP?CHTMLContainerDlg::GetHostInfo(DOCHOSTUIINFO*?pInfo)
            {
            ????pInfo->dwFlags?=?DOCHOSTUIFLAG_THEME;
            ????return?S_OK;
            }
            這個多得不說,^_^。
            下面就可以演示了,在vs2005里面找個向導來show一下:
            CHTMLContainerDlg????dlg;
            ????TCHAR????????????????szPath[MAX_PATH]?
            =?{?0?};
            ????CString????????????????strPath;
            ????GetCurrentDirectory(MAX_PATH,?szPath);
            ????strPath?
            =?szPath;
            ????strPath?
            +=?_T("\\Default.htm");
            ????dlg.SetHtmlAndCom(strPath,?_T(
            "TestWebCom.WebComCtrl"));
            ????dlg.DoModal();


            對話框標題其實可以通過解析html文檔獲取title標題設置,目前還未處理。下面看看html與應用交互的組件。
            生成一個atl工程,TestWebCom,添加一個com組件WebComCtrl,添加方法處理上面那個帶...的按鈕(文件夾瀏覽按鈕):
            STDMETHODIMP?CWebComCtrl::ShowFolderBrowser(void)
            {
            ????AFX_MANAGE_STATE(AfxGetStaticModuleState());

            ????
            //?TODO:?在此添加實現代碼
            ????AfxMessageBox(_T("In?Com,?you?can?show?folder?select?dialog"));
            ????
            return?S_OK;
            }

            這里不作具體處理,只是象征性彈出一個對話框。好了,上面我們在對話框里面已經設置了com組件的progid,這里可以把html和組件關聯上了,通過腳本可以訪問com組件方法:
            <BUTTON?CLASS="buttonClass3Custom"?ID="BrowseBtn"?TYPE="BUTTON"?TITLE="瀏覽頭文件。"?onClick="OnBrowseHeaderFile();"></BUTTON>
            腳本如下:
            function?OnBrowseHeaderFile()
            {
            ????window.external.ShowFolderBrowser();
            }
            下面運行試一試,按下選擇文件夾按鈕會出現如下詢問組件是否安全的對話框:

            這個很惱人,用戶可沒有耐心忍受每次多彈出這個對話框詢問組件是否安全。我開始打算將組件實現安全接口解決掉此問題,不過不知道緣何,沒有成功,網上搜索一下好像說在ie7里面無效,沒辦法還是看mfc源碼來解決問題。
            CDHtmlDialog類獲取external代碼如下:
            STDMETHODIMP?CDHtmlDialog::GetExternal(IDispatch?**ppDispatch)
            {
            ????
            if(ppDispatch?==?NULL)
            ????????
            return?E_POINTER;
            ????????
            ????
            *ppDispatch?=?NULL;
            ????
            if?(m_spExternalDisp.p?&&?CanAccessExternal())
            ????
            {
            ????????m_spExternalDisp.p
            ->AddRef();
            ????????
            *ppDispatch?=?m_spExternalDisp.p;
            ????????
            return?S_OK;
            ????}

            ????
            return?E_NOTIMPL;
            }
            看到CanAccessExternal函數,肯定就是驗證安全性的代碼,找到函數聲明,幸好是虛函數,重載直接返回TRUE:
            BOOL?CHTMLContainerDlg::CanAccessExternal()
            {
            ????
            //?we?trust?all?com?object?(haha,?you?can?make?virus)
            ????return?TRUE;
            }
            有興趣的朋友可以看下內部實現。
            這下就好了,按下網頁選擇文件夾按鈕,彈出對話框:

            一套流程完備,方案個人覺得不錯,各司其職,通信自然暢通,一個html配對一個com功能組件,功能組件化不僅使代碼封裝性好,而且可以用于多種語言。

            由于此技術不用于公司開發,今整理提供下載
            posted on 2006-12-15 21:11 萬連文 閱讀(26023) 評論(40)  編輯 收藏 引用 所屬分類: MFC

            FeedBack:
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2006-12-19 22:40 | noname
            的確不錯. 用 html 做界面在開發效率, 擴展性等方面都很好. 正巧這兩天需要做一個程序. 界面要求比較靈活. 就試試萬兄的 idea 了.

            用 WTL 做了一個 demo. 因為是第一次做這樣的應用, 先不考慮代碼復用了. 所以沒有做成 DLL. 連頁面的 ExternalDispatch 都是在程序內部實現的.
            既然萬兄沒有給出源碼, 我把代碼放上來. 算是狗尾續貂把. :)

            http://nicoster.googlepages.com/wtlhtml.rar

            lieph $(at) 163 $(dot) com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2006-12-20 14:10 | cooelaf
            看了萬兄的blog,很贊嘆萬兄在這方面的造詣。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2006-12-25 10:51 | shaolong
            萬哥,可否把你說的這個例子代碼公開一下呢?我剛入門做嵌入html的vc項目,也是CDHTMLDialog派生的類,但不知該如何實現函數接口的對應,時間很緊,郁悶的很,謝謝了!  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2006-12-25 11:04 | 萬連文
            郵件給我,我發你。
              回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2006-12-26 23:59 | xhl
            我在VC6下曾做過WEBGUI,對你的想法很感興趣,想知道如何用com封裝功能,已經在html中怎樣調用com組件。
            能把你的示例代碼發一份給我嗎?
            我的郵箱hongziyue@sina.com
            多謝!  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2006-12-27 00:01 | xhl
            我在VC6下曾做過WEBGUI,對你的想法很感興趣,想知道如何用com封裝功能,以及在html中怎樣調用com組件。
            能把你的示例代碼發一份給我嗎?
            我的郵箱hongziyue@sina.com
            多謝!  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-01-28 14:04 | xie
            我是個初學者也想要一份多謝了  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-02-25 17:55 | kukustream
            很感興趣,可否將示例的源碼發給我一份,謝謝! kukuStream@hotmail.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-03-05 17:24 | xq
            萬前輩,我早就想想學學這種技術,苦于資料難找,今得遇高人。
            給我一份,萬分感謝。waterdo@gmail.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-03-05 22:47 | 萬連文
            看有如此多人索要代碼,實感意外。由于當時調試代碼比較凌亂外加當初是為公司開發,代碼沒有公開。現在看來公司不會采用了,可能思考方式不同。最近在搞畢業開題,過1周后我將整理代碼并公布于本頁下載。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-03-10 13:08 | 萬連文
            下載文件已經提供,vs2005環境,關于其他環境本人不打算移植。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-08-15 18:44 | lanse
            我想要一份
            lanse8482@sina.com.cn
              回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-09-05 11:35 | 我也想要一份,拜托啦
            我也想要一份,拜托啦
            haiminger@163.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-09-05 14:10 | 萬連文
            唉,真不知該如何說了,下載就在下面,不過字有些小罷了。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-10-13 08:52 | yefeng
            我也想要一份,拜托啦 !
            yefeng654321@126.com
              回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-12-03 16:12 | Ason Jia
            最近我也在弄這個,但是我有遇見一個問題,因為中間的html大小(不是文件大小,是html的寬度和高度)是會變的,所以我有想動態從html獲取大小,具體做法是,html中有一個變量來保存html大小,當html被加載的時候,就由js動態算出大小,然后我們的dialog去獲取這個大小(使用IWebBrowser2直接去查詢html中此值),然后動態調整dialog的大小以適應html的大小,但是問題也就出在這兒:html在加載的時候,經常會因為一些原因使得DOM中這個element沒有創建出來,或者此element有創建出來,但是大小卻沒有計算出來(也就是此節點有,但是value是“0”),汗~~~~~這個問題我想了很久都解決不了
            不知道作者可否提供一些幫助,再次非常感謝~~~  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-12-04 10:10 | 萬連文
            我的想法:
            html被加載的時候,最好不要去使用html的東西,這個時候dom文檔還沒有加載完全。你需要在OnDocumentCompleted事件的時候去調用腳本,然后去修改對話框大小。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-12-04 15:04 | Ason Jia
            我也想過OnDocumentCompleted消息被觸發的時候去獲取,但是測試的時候發現,這個消息函數被觸發了,但是html還是沒有準確的計算出大小。
            那你提到的在這個函數里面調用JS的方法算出大小,這個我沒去試過,其實我是不知道,汗~~~對COM不太熟悉。
            但是這樣看來,好像是可行的。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-12-04 15:14 | 萬連文
            我想你可能錯誤的認識了這個東西。html是沒有辦法計算大小的,它的layout依賴于web控件的大小。采取這種方法做界面,最好針對一類html頁面大小固定的功能使用一個對話框類,這樣設置對話框固定大小即可以,且對于一類對話框,功能處理也比較類似。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2007-12-05 17:38 | Ason Jia
            目前我也是比較傾向這種思路,無奈老板說,俺們的產品要做n國語言,因為語言的不同,還是你提到的控件的不同,直接造成html大小的變化,暈~~~
            不過在C中調用js方法,我已經弄出來了,無奈只能在這個方向先做一番苦功先了
            汗~~
            實在不行,那我就只能寫死了~
            謝謝老萬同學的幫忙和指點,呵呵。。。。再次感謝~
              回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2008-06-19 06:39 | arthurlee
            一開始以為需要自己實現active scriping的接口,看了這篇文章才知道方法如此簡單。
            十分感謝!  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2008-10-13 17:58 | 阿里
            實際上這并未提供active scriping的接口,而僅僅是對WebBrowser控件的額外控制,如果不用MFC可能需要用到接口IDocHostUIHandler,IDocHostUIHandler2和IDocHostShowUI。

            實現自己的Active Scripting,需要用IActiveScriptSite  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)[未登錄]
            2008-11-06 12:01 | yy
            您好 我也想要一份代碼看看,謝謝!
            yangyong_v@163.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2008-11-10 10:28 | 萬連文
            來自原子時代--您的email有問題???
            很抱歉這么晚回復你,因為最近病了。首先,我對一個女孩子從事C++開發表達敬佩。說到界面開發,絕對不會是一個簡單的任務,甚至連一本真正的好的技術書籍都沒有。CDHtmlDialog是vs2003以后的sdk添加進去的,不過這個用的人也不多,但是簡單很多。我一般使用的是atl里面提供的一個窗口類ATLAXWIN_CLASS來實現的,這個在vc6里面也有。根據我的經驗,能使用html+css+JS來實現界面編程的人技術都不一般,至少對com有一些了解。對于您目前的情況,如果使用vc6開發可以考慮ATLAXWIN_CLASS這個類進行編程,依賴atl庫,跟mfc無關。具體的例子我手頭沒有,可以查閱www.codeproject.com
            www.codeguru.com等技術網站。如果你自己嘗試之后還是無法得到結果,請與我聯系,我會做一個demo。因為這段時間確實病的不輕,本想順手做一個給你,但是一看電腦腦袋暈。不好意思。

            總是發不出去,再試試.  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)[未登錄]
            2009-02-23 16:34 | 小四
            lz你好,我是謝老師同門師兄,最近也用類似的界面解決方案。
            有空加我msn聊聊 cugdj@hotmail.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2009-10-27 18:07 |
            你好,我想學習一下html內嵌到vc中使用,能給我發份代碼嗎?zxx8224@163.com 非常感謝  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2009-10-28 09:02 | WXX
            下載就在最后面2個字,不明白為什么那么多人看不見。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2009-12-30 09:45 | Eleanor
            你好,我最近才開始弄html嵌入mfc對話框,我想問一下我只想得到網頁的某些按鈕的鏈接地址,調用我的程序去ping它,返回一個ping通時間給網頁。我查了下網上說用IHTMLElement里的put_onclick,可是這些接口我不熟,我發現vc2005里的mshtml.h中定義了好幾個IHTMLDocument和IHTMLElement接口方便的話加下我msn:lizzywater@hotmail.com指導一下,謝謝  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2010-04-18 14:08 | jjqcat
            很感興趣,可否將示例的源碼發給我一份,謝謝!
            jjqcat@gmail.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2010-08-26 10:19 | yyk
            很好。你的想法不錯。take a look!!  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2011-01-28 12:07 | 無未
            最近也在考慮這個東西 不過令我很為難的是在vc6.0下 加之對com不是很了解…… 努力 關注……  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2011-07-25 19:14 | tammy
            我的怎么在DEBUG文件夾下打不開應用程序呢.  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2011-07-26 10:19 | tammy
            急....  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2011-07-26 10:19 | tammy
            程序運行起來了.但點擊瀏覽按鈕時..報錯說當前頁的腳本運行錯誤  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2011-07-26 10:23 | 萬連文
            @tammy
            應該是沒有注冊com組件。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2012-09-22 15:25 | 蘆葦
            前輩 我是剛開始學習這方面內容的新手,您有木有這方面的資料、書籍推薦呢,跪求拜謝。聯系方式:1071932819@qq.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2013-01-30 18:02 | 云憐秀年
            下載不到,打不開@noname
              回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2013-01-30 18:03 | 云憐秀年
            我想要一份源碼
            O(∩_∩)O謝謝
            wywangyun1124@163.com  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2015-03-11 10:53 | 冷風X
            820225092@qq.com ,求一源碼學習一下。。  回復  更多評論
              
            # re: 用MFC實現WebGUI--(CDHtmlDialog)
            2016-07-18 15:37 | 王同林
            前輩好,代碼下載之后怎么用啊?我生成的exe打開是空白的頁面,菜單新建不知道建的啥,打開一個html頁面也沒有反應,我的環境是vs2010  回復  更多評論
              
            簡歷下載
            聯系我

            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            2021精品国产综合久久| 国产一级做a爰片久久毛片| 久久精品国产99国产精偷| 亚洲色大成网站WWW久久九九| 久久人做人爽一区二区三区| 久久亚洲春色中文字幕久久久| 国产精品激情综合久久| 久久人人爽人人爽人人片AV麻烦| 欧美黑人又粗又大久久久| 亚洲国产精品久久久久婷婷老年| 久久亚洲天堂| 国产美女久久久| 精品国产乱码久久久久软件| 日本久久久精品中文字幕| 亚洲精品无码久久久久去q| 精品国产热久久久福利| 日韩精品久久无码中文字幕| 久久99精品国产麻豆蜜芽| 91精品国产91久久综合| 亚洲中文字幕久久精品无码喷水| 久久综合九色综合欧美狠狠| 婷婷久久综合九色综合九七| 亚洲一级Av无码毛片久久精品| 久久66热人妻偷产精品9| 欧美日韩中文字幕久久久不卡| 99久久777色| 婷婷久久香蕉五月综合加勒比| 香蕉aa三级久久毛片| 99久久精品费精品国产| 久久亚洲春色中文字幕久久久| 久久人妻无码中文字幕| 久久精品无码av| 一本伊大人香蕉久久网手机| 久久精品国产99久久久| 久久精品人人做人人爽97 | 伊人色综合久久天天网| 99久久成人18免费网站| 99久久精品国产麻豆| AV狠狠色丁香婷婷综合久久 | 国产精品欧美久久久久无广告| 精品久久久久久无码专区不卡|