青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 閱讀(954) 評論(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)

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久国产欧美日韩精品| 91久久精品网| 久久精品国产一区二区三| 亚洲调教视频在线观看| 亚洲激情一区二区三区| 久久福利毛片| 久久久久久久97| 久久亚洲精品一区二区| 狼人天天伊人久久| 欧美中文在线字幕| 欧美日韩在线一区二区| 欧美国产免费| 欧美日韩精品在线| 国产精品久久久久久久久动漫| 欧美日韩国产欧| 欧美性猛交xxxx乱大交退制版| 欧美午夜a级限制福利片| 国产精品黄视频| 韩日在线一区| 日韩一级精品| 久久久国产精品一区| 亚洲国产一区二区在线| 亚洲一区视频在线| 六月婷婷久久| 国产伦精品一区二区三区四区免费 | 国产精品区一区| 国产欧美日韩免费看aⅴ视频| 狠狠综合久久av一区二区小说| 亚洲欧洲精品一区二区精品久久久| 夜久久久久久| 久久亚洲一区| 亚洲最新中文字幕| 久久久不卡网国产精品一区| 欧美日韩大片一区二区三区| 国产一区二区三区无遮挡| 亚洲精品三级| 久久蜜桃香蕉精品一区二区三区| 欧美成人精品在线观看| 亚洲视频专区在线| 女人色偷偷aa久久天堂| 国产日韩在线一区| 亚洲少妇最新在线视频| 老司机午夜精品视频在线观看| 一区二区不卡在线视频 午夜欧美不卡在| 久久亚洲国产精品日日av夜夜| 亚洲黄色av| 久久久久久精| 国产亚洲一区在线| 亚洲天堂免费在线观看视频| 欧美91大片| 性欧美videos另类喷潮| 欧美午夜美女看片| 9人人澡人人爽人人精品| 欧美大片在线观看一区| 久久国产精品久久久久久| 国产精品人人做人人爽人人添| 亚洲视频在线观看免费| 亚洲人人精品| 欧美精品电影| 亚洲精品在线视频观看| 欧美黄色日本| 欧美96在线丨欧| 一区二区三区av| 永久免费毛片在线播放不卡| 欧美一区二区播放| 亚洲影视在线播放| 国产精品视频自拍| 性色av香蕉一区二区| 亚洲视频日本| 国产精品久久久久久久久久久久久久 | 午夜久久福利| 亚洲最新在线| 国产精品呻吟| 久久久国产精品一区二区三区| 欧美一区二区三区视频| 激情校园亚洲| 亚洲国产高清在线观看视频| 欧美激情亚洲| 亚洲天堂成人在线观看| 亚洲一区亚洲二区| 欧美激情精品久久久久久黑人| 玖玖在线精品| 9i看片成人免费高清| 在线亚洲一区| 狠狠色综合播放一区二区| 欧美激情精品久久久久久久变态| 欧美激情精品久久久久久久变态| av成人激情| 亚洲一区www| 韩国一区电影| 亚洲欧洲在线看| 国产精品久久久久久久久免费| 欧美一区二区三区久久精品茉莉花| 欧美亚洲一区二区在线| 亚洲高清一区二| 日韩一区二区免费看| 国产欧美一区二区精品性| 免费观看成人鲁鲁鲁鲁鲁视频 | 国产精品丝袜白浆摸在线| 久久精品国亚洲| 欧美激情一级片一区二区| 欧美视频在线观看一区二区| 久久久久久久久久久久久久一区| 欧美成人免费小视频| 欧美亚洲专区| 欧美成人一区二区三区在线观看| 亚洲欧美日韩国产| 欧美成年人视频网站| 欧美一区二区观看视频| 欧美高清在线一区| 久久国产高清| 欧美午夜精品一区| 欧美福利视频网站| 亚洲综合视频一区| 欧美高清在线视频| 久久国产一区二区三区| 一区二区三区精品视频在线观看| 亚洲精品乱码视频| 国产精品中文字幕欧美| 久久午夜精品| 性色av一区二区怡红| 久热成人在线视频| 久久成人在线| 国产精品系列在线播放| 日韩视频一区二区在线观看| 亚洲激情图片小说视频| 久久精品一区二区| 久久成人精品一区二区三区| 欧美日韩一区二区国产| 欧美粗暴jizz性欧美20| 激情综合网址| 久久xxxx精品视频| 欧美一区二区视频网站| 国产精品久久久久av| 在线性视频日韩欧美| 亚洲一区二区成人| 欧美日韩一区二区免费在线观看| 亚洲欧洲一二三| 亚洲狼人精品一区二区三区| 欧美成人一区二区| 亚洲国产视频一区| 99精品国产在热久久婷婷| 欧美激情四色| 夜夜嗨av一区二区三区四区| 亚洲午夜未删减在线观看| 欧美日韩国产精品一区二区亚洲| 亚洲精品日产精品乱码不卡| 亚洲私拍自拍| 国产精品腿扒开做爽爽爽挤奶网站| 中文精品视频| 久久成人羞羞网站| 亚洲第一视频网站| 欧美区国产区| 亚洲一区二区黄| 久久久久天天天天| 亚洲成色精品| 欧美日韩ab片| 亚洲欧美自拍偷拍| 久久亚洲综合网| 亚洲精品在线视频观看| 欧美私人网站| 久久电影一区| 亚洲精品国产无天堂网2021| 亚洲综合欧美日韩| 国内精品模特av私拍在线观看 | 亚洲女性裸体视频| 久久久久国内| 亚洲人人精品| 国产精品久久久久99| 久久精品国产综合精品| 亚洲国产精品久久人人爱蜜臀| 亚洲在线观看视频| 韩国三级电影久久久久久| 欧美激情视频一区二区三区在线播放| 一本色道**综合亚洲精品蜜桃冫 | 在线观看亚洲一区| 欧美精品午夜| 亚洲中字在线| 欧美激情视频在线播放| 亚洲欧美在线免费| 狠狠色狠色综合曰曰| 欧美性理论片在线观看片免费| 久久久久久久久久久久久久一区 | 精品不卡一区二区三区| 欧美激情亚洲精品| 久久精品国产亚洲一区二区| 一区二区三区回区在观看免费视频| 久久精品中文| 亚洲影院污污.| 一区久久精品| 国产日韩精品一区二区三区| 欧美欧美天天天天操| 久久精品噜噜噜成人av农村| 亚洲视频精选| 亚洲精品乱码久久久久久| 狂野欧美激情性xxxx| 欧美一区亚洲一区| 亚洲一区二区三区三| 洋洋av久久久久久久一区| 91久久久亚洲精品|