• <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 閱讀(934) 評論(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://www.shnenglu.com/jerrychan/archive/2009/02/19/69928.html

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

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            国产高潮国产高潮久久久91 | 日韩欧美亚洲国产精品字幕久久久 | 99久久国产综合精品麻豆| 久久精品中文无码资源站| 欧美久久综合性欧美| 久久综合久久综合亚洲| 99久久777色| 热久久视久久精品18| 伊人久久大香线焦综合四虎| 久久精品无码一区二区三区日韩| 久久精品日日躁夜夜躁欧美| 国产99久久精品一区二区| 午夜视频久久久久一区| 久久亚洲高清观看| 亚洲国产另类久久久精品| 久久精品中文字幕一区| 欧美噜噜久久久XXX| 一本久久免费视频| 99久久精品久久久久久清纯| 久久久精品人妻一区二区三区四 | 久久久久久亚洲精品无码| 久久久一本精品99久久精品66| 久久久久人妻一区精品| 狠狠色婷婷综合天天久久丁香| 久久WWW免费人成一看片| 久久久国产精品| 99久久精品免费观看国产| 久久99国产精品久久99| 日韩久久久久久中文人妻| 亚洲一级Av无码毛片久久精品| 精品多毛少妇人妻AV免费久久| 国产精品一区二区久久精品| 亚洲精品乱码久久久久久蜜桃图片| 久久亚洲精品无码观看不卡| 精品久久久久一区二区三区| 色综合久久精品中文字幕首页| 国产一区二区三区久久| 久久se精品一区精品二区| 久久免费精品一区二区| 国产成人精品久久一区二区三区av| 91精品国产91久久久久久|