• <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來了~


                ‘店大欺人’這句話放在哪里都適用,瀏覽器市場亦是如此。IE當道,其它瀏覽器如若顯示跟其不一致,往往會被打上‘不標準’的烙記,也迫使HTML使用者不得不用IE來檢測是否符合‘標準’。真的很杯具,且不說IE自己定義了大量‘不標準’的Tag,誰又能確定IE對標準的執行本身是否‘標準’呢?平常我用Google Chrome,但寫Blog時還是需要切換到IE上,誰叫這些控件都是依據IE作為‘標準’的。這也是沒有辦法的事情,畢竟IE曾經太強大了,致使現在依然余威不散啊。。。
                扯遠了,我就來發發牢騷了,實際想說的是,為了讓LingosHook的HTML展示更接近Lingoes的顯示,這幾天不得不在嘗試讓LingosHook也支持適用IE來顯示結果,誰叫Lingoes用IE呢。。
                下面輕松一下,做個GAME--看圖找不同。。





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

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

            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寬字節類型,就不能單單調用一下memcpy了,這個涉及到寬字節到多字節(WC->MB)的問題了。于是照著葫蘆畫瓢,添加了如下代碼,這個問題就過了。。。。

            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;
            }

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

                另外定義了個宏__LH_USE_IE__,用于編譯期切換所使用的控件,不喜歡IE的,可以繼續使用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 閱讀(940) 評論(4)  編輯 收藏 引用 所屬分類: C++輪子精神LingosHook

            評論

            # re: LingosHook:IE來了~ 2010-05-22 11:57 faerl

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

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

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

            # re: LingosHook:IE來了~ 2010-07-30 22:43 ari

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

            但我一直沒實驗成功。
            你可以試試看看。
            如成功了,看給我郵件說一下。manari@163.com  回復  更多評論   

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            青青草原综合久久| 性欧美丰满熟妇XXXX性久久久| 久久99国产精品久久99果冻传媒| 国产亚洲精品久久久久秋霞 | 青青草国产成人久久91网| segui久久国产精品| 亚洲国产成人久久综合区| 亚洲va久久久噜噜噜久久狠狠 | 久久久久人妻精品一区三寸蜜桃 | 精品久久久久久久无码| 日本免费久久久久久久网站| 欧美一级久久久久久久大片| 久久人人爽人人爽人人片AV东京热| 少妇高潮惨叫久久久久久| 草草久久久无码国产专区| 99久久国产亚洲综合精品| 99久久这里只有精品| 亚洲乱码日产精品a级毛片久久 | 伊人精品久久久久7777| 久久精品国产亚洲AV嫖农村妇女 | 久久99精品国产麻豆宅宅| 伊人久久精品影院| 久久香蕉综合色一综合色88| 久久国产免费直播| 久久久免费观成人影院| 亚洲精品国产成人99久久| 东方aⅴ免费观看久久av| 久久国产精品免费| 青青草国产精品久久久久| 久久久久久人妻无码| 亚洲伊人久久大香线蕉综合图片| 久久久青草青青国产亚洲免观| 97超级碰碰碰碰久久久久| 欧美熟妇另类久久久久久不卡| 亚洲日本va午夜中文字幕久久| 久久九九久精品国产| 久久久久久伊人高潮影院| 怡红院日本一道日本久久| 久久亚洲私人国产精品vA| 久久久久久无码国产精品中文字幕| 久久大香香蕉国产|