• <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>

            Codejie's C++ Space

            Using C++

            LingosHook:IE來(lái)了~


                ‘店大欺人’這句話放在哪里都適用,瀏覽器市場(chǎng)亦是如此。IE當(dāng)?shù)溃渌鼮g覽器如若顯示跟其不一致,往往會(huì)被打上‘不標(biāo)準(zhǔn)’的烙記,也迫使HTML使用者不得不用IE來(lái)檢測(cè)是否符合‘標(biāo)準(zhǔn)’。真的很杯具,且不說IE自己定義了大量‘不標(biāo)準(zhǔn)’的Tag,誰(shuí)又能確定IE對(duì)標(biāo)準(zhǔn)的執(zhí)行本身是否‘標(biāo)準(zhǔn)’呢?平常我用Google Chrome,但寫B(tài)log時(shí)還是需要切換到IE上,誰(shuí)叫這些控件都是依據(jù)IE作為‘標(biāo)準(zhǔn)’的。這也是沒有辦法的事情,畢竟IE曾經(jīng)太強(qiáng)大了,致使現(xiàn)在依然余威不散啊。。。
                扯遠(yuǎn)了,我就來(lái)發(fā)發(fā)牢騷了,實(shí)際想說的是,為了讓LingosHook的HTML展示更接近Lingoes的顯示,這幾天不得不在嘗試讓LingosHook也支持適用IE來(lái)顯示結(jié)果,誰(shuí)叫Lingoes用IE呢。。
                下面輕松一下,做個(gè)GAME--看圖找不同。。





                是的,還是第二張圖的顯示比較好看~第一張圖是使用wxWidget自帶的wxHtmlWin控件顯示的,而第二張則是通過Activx調(diào)用IE控件顯示的。

                wxWidget下封裝IE控件,能直接找到的就是wxActivex (這個(gè)就是常說的wxIE)了,雖然控件本身老是老了點(diǎn),2005年發(fā)布的,但依然很好用--當(dāng)然了,為了在wxWidget2.8下編譯,為了支持中文顯示,還是需要做一些修改的。
                如何在wxWidget2.8下編譯,這個(gè)問題改改并不難,就不說了,就單說說這個(gè)中文顯示問題吧。wxActivex使用LoadString()來(lái)顯示內(nèi)存中的字符串,實(shí)現(xiàn)如下:

            bool  wxIEHtmlWin::LoadString(const wxString& html)
            {
                
            char *data = NULL;
                size_t len 
            = html.length();
            #ifdef UNICODE
                len 
            *= 2;
            #endif
                data 
            = (char *) malloc(len);
                memcpy(data, html.c_str(), len);

                
            return LoadStream(new wxOwnedMemInputStream(data, len));
            }
            ;

                如果變量html中的字符都是char類型也沒啥問題,memcpy一下就OK,但如果是wchar_t寬字節(jié)類型,就不能單單調(diào)用一下memcpy了,這個(gè)涉及到寬字節(jié)到多字節(jié)(WC->MB)的問題了。于是照著葫蘆畫瓢,添加了如下代碼,這個(gè)問題就過了。。。。

            class IStreamFromWString : public IStream
            {
            private:
                DECLARE_OLE_UNKNOWN(IStreamFromWString);

            public:
                IStreamFromWString(
            const wxString& str)
                    : _buffer(NULL), _sz(
            0), _pos(0)
                
            {
                    InitBuffer(str);
                }

                
            virtual ~IStreamFromWString()
                
            {
                    FreeBuffer();
                }

                
            // ISequentialStream
                HRESULT STDMETHODCALLTYPE Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead)
                
            {
                    
            if(_pos >= _sz)
                    
            {
                        (
            *pcbRead) = 0;
                        
            return S_OK;
                    }


                    
            if((_pos + cb) < _sz)
                    
            {
                        memcpy((
            void*)pv, (void*)(_buffer + _pos), cb);
                        (
            *pcbRead) = cb;
                        _pos 
            += cb;
                        
            return S_OK;
                    }

                    
            else
                    
            {
                        memcpy((
            void*)pv, (void*)(_buffer + _pos), _sz - _pos);
                        (
            *pcbRead) = (_sz - _pos);
                        _pos 
            = _sz;
                        
            return S_OK;
                    }

                }
            ;

                
            // IStream
                HRESULT STDMETHODCALLTYPE Write(const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten) {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR 
            *plibNewPosition) {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER libNewSize) 
            {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE CopyTo(IStream __RPC_FAR 
            *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER __RPC_FAR *pcbRead, ULARGE_INTEGER __RPC_FAR *pcbWritten) {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags) 
            {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE Revert(
            void{return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) 
            {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) 
            {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE Stat(STATSTG __RPC_FAR 
            *pstatstg, DWORD grfStatFlag) {return E_NOTIMPL;}
                HRESULT STDMETHODCALLTYPE Clone(IStream __RPC_FAR 
            *__RPC_FAR *ppstm) {return E_NOTIMPL;}
            private:
                
            void InitBuffer(const wxString& str)
                
            {
                    _sz 
            = wxConvUTF8.FromWChar(NULL, 0, str.c_str(), str.size());
                    _buffer 
            = new char[_sz];
                    wxConvUTF8.FromWChar(_buffer, _sz, str.c_str(), str.size());
                    
                    
            //int codepage = 54936;//CP_UTF8;

                    
            //int sz = WideCharToMultiByte(codepage, 0, html.c_str(), html.size(), NULL, 0, NULL, NULL);
                    
            //if(sz == -1)
                    
            //    return -1;
                    
            //char* buf = new char[sz + 1];
                    
            //sz = WideCharToMultiByte(codepage, 0, html.c_str(), html.size(), buf, sz, NULL, NULL);
                }

                
            void FreeBuffer()
                
            {
                    
            if(_buffer != NULL)
                        delete [] _buffer;
                }

            private:
                
            char * _buffer;
                size_t _sz;
                size_t _pos;
            }
            ;

            DEFINE_OLE_TABLE(IStreamFromWString)
                OLE_IINTERFACE(IUnknown)
                OLE_IINTERFACE(ISequentialStream)
                OLE_IINTERFACE(IStream)
            END_OLE_TABLE;

            bool wxIEHtmlWin::LoadWString(const wxString& html)
            {
                IDispatch 
            *pDisp = NULL;
                HRESULT hret 
            = m_webBrowser->get_Document(&pDisp);
                
            if (!pDisp)
                    
            return false;
                wxAutoOleInterface
            <IDispatch> disp(pDisp);
                
            // get IPersistStreamInit
                wxAutoOleInterface<IPersistStreamInit> pPersistStreamInit(IID_IPersistStreamInit, disp);

                
            if (pPersistStreamInit.Ok())
                
            {
                    HRESULT hr 
            = pPersistStreamInit->InitNew();

                    
            if (SUCCEEDED(hr))
                    
            {
                        CComPtr
            <IStream> is(new IStreamFromWString(html));
                        hr 
            = pPersistStreamInit->Load(is);
                    }


                    
            return SUCCEEDED(hr);
                }

                
            else
                    
            return false;
            }

                可以看出,也沒做什么,就是調(diào)用一下類似WideCharToMultiByte()就OK了。編碼LingosHook的過程中,最讓我感慨的事就是--原來(lái)char到wchar_t、string到wstring是如此的繁瑣,陷阱重重。。。唉,一切都是charset引起的,要是當(dāng)年ASCII設(shè)計(jì)者們有點(diǎn)‘國(guó)際主義’精神,直接用定義出Unicode多好,哪有中間這么多charset的問題。。。(發(fā)牢騷而已,誰(shuí)也不是先知。。。)

                另外定義了個(gè)宏__LH_USE_IE__,用于編譯期切換所使用的控件,不喜歡IE的,可以繼續(xù)使用wxHtmlWin,嘿嘿,要留好‘革命的火種’啊。。。

            #ifdef __LH_USE_WXIE__

            #include 
            "IEHtmlWin.h"

            class CLHHtmlWindow : public wxIEHtmlWin
            {
            public:
                CLHHtmlWindow(wxWindow 
            * parent, wxWindowID id = -1const wxPoint& pos = wxDefaultPosition,
                    
            const wxSize& size = wxDefaultSize, long style = 0const wxString& name = wxPanelNameStr)
                : wxIEHtmlWin(parent, id, pos, size, style, name)
                
            {
                }

                
            virtual ~CLHHtmlWindow() {}

            public:
                
            void LoadBlankPage() { wxIEHtmlWin::LoadWString(wxT("<HTML></HTML>")); }
                
            bool LoadString(const wxString& html) return wxIEHtmlWin::LoadWString(html); }
                
            void SetCharset(const wxString& charset) { wxIEHtmlWin::SetCharset(charset); }
            }
            ;

            #else

            #include 
            <wx/html/htmlwin.h>

            class CLHHtmlWindow : public wxHtmlWindow
            {
            public:
                CLHHtmlWindow(wxWindow 
            * parent, wxWindowID id = -1const wxPoint& pos = wxDefaultPosition,
                    
            const wxSize& size = wxDefaultSize, long style = 0const wxString& name = wxPanelNameStr)
                : wxHtmlWindow(parent, id, pos, size, style, name)
                
            {
                }

                
            virtual ~CLHHtmlWindow() {}

            public:
                
            void LoadBlankPage() { wxHtmlWindow::SetPage(wxT("<HTML></HTML>")); }
                
            bool LoadString(const wxString& html)
                

                    wxString str 
            = html;
                    str.Replace(_(
            "file:///"), _(""), true);
                    
            return wxHtmlWindow::SetPage(str); 
                }

                
            void SetCharset(const wxString& charset) {}
            }
            ;

            #endif


             

            posted on 2010-05-21 17:39 codejie 閱讀(934) 評(píng)論(4)  編輯 收藏 引用 所屬分類: C++輪子精神LingosHook

            評(píng)論

            # re: LingosHook:IE來(lái)了~ 2010-05-22 11:57 faerl

            http://aarddict.org/
            http://code.google.com/p/aarddict/
            Aard Dictionary
            我希望把LingosHook開發(fā)成一個(gè)支持自定義詞典功能的軟件,我不會(huì)編程只能提個(gè)建議了。Aard Dictionary這個(gè)詞典軟件不錯(cuò),使用Python腳本語(yǔ)言寫的,如果可以借鑒這個(gè)開源軟件整合到LingosHook,在加上屏幕取詞,ocr取詞就完美了。最近學(xué)英語(yǔ),看美劇,用lingoes詞典,有許多生詞要鞏固,無(wú)意中發(fā)現(xiàn)了你的軟件,對(duì)我很有用,持續(xù)關(guān)注你。lingoes很不方便,但是它的詞典好,常用朗文當(dāng)代英語(yǔ)詞典,柯林斯高階英語(yǔ)詞典,柯林斯高階英語(yǔ)詞典,這樣可以更明白理解一個(gè)單詞的含義  回復(fù)  更多評(píng)論   

            # re: LingosHook:IE來(lái)了~[未登錄] 2010-05-22 16:13 codejie

            @faerl
            感謝使用~
            這個(gè)‘支持自定義詞典’的需求有些難度的,不同的詞典有著不同的查詢或者顯示方式;LingosHook是通過抓取Lingoes顯示窗口中的HTML數(shù)據(jù)實(shí)現(xiàn)其詞典功能的,如果另有詞典也是通過這種方式顯示結(jié)果的,那么也許改改底層Hook部分代碼還有可能支持,否則整個(gè)機(jī)制都需要定制的了。所以,不好意思啊,至少我目前無(wú)法實(shí)現(xiàn)這個(gè)需求。  回復(fù)  更多評(píng)論   

            # re: LingosHook:IE來(lái)了~ 2010-07-30 22:43 ari

            wxIE有個(gè)灰邊顯示和3d border,以及滾動(dòng)條顯示。
            但這個(gè)應(yīng)該是可以去掉的。
            http://www.shnenglu.com/jerrychan/archive/2009/02/19/69928.html

            但我一直沒實(shí)驗(yàn)成功。
            你可以試試看看。
            如成功了,看給我郵件說一下。manari@163.com  回復(fù)  更多評(píng)論   

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产精品免费久久久久影院| 97久久精品人人澡人人爽| 国产精品青草久久久久婷婷| 久久精品国产乱子伦| 久久久久无码国产精品不卡| 久久国产成人午夜aⅴ影院| 91久久精品电影| 蜜桃麻豆www久久| www亚洲欲色成人久久精品| 一级做a爰片久久毛片16| 91久久精品国产免费直播| 国产91久久综合| 久久综合伊人77777麻豆| 久久天天日天天操综合伊人av | 久久精品成人| 久久99国产乱子伦精品免费| 久久婷婷五月综合97色一本一本 | 久久这里只有精品18| 一级做a爰片久久毛片看看| 久久受www免费人成_看片中文| 亚洲av伊人久久综合密臀性色 | 久久久国产乱子伦精品作者| 亚洲乱码中文字幕久久孕妇黑人| 久久综合给久久狠狠97色| 久久久精品人妻一区二区三区蜜桃| 国产精品无码久久久久久| 91精品国产综合久久婷婷| 91久久九九无码成人网站| 久久久精品视频免费观看| 久久午夜无码鲁丝片秋霞 | 久久久久久久免费视频| 偷偷做久久久久网站| 亚洲中文字幕无码久久2017| 久久er热视频在这里精品| 久久久网中文字幕| 久久亚洲精品人成综合网 | 久久SE精品一区二区| 99久久久精品免费观看国产| 久久久久亚洲av毛片大| 久久综合亚洲欧美成人| 久久久久噜噜噜亚洲熟女综合 |