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

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://www.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久久精品色噜噜导演| 亚洲精品久久7777| 夜夜嗨一区二区三区| 欧美xxxx在线观看| 一本久久a久久精品亚洲| 亚洲欧洲日韩综合二区| 欧美日韩亚洲在线| 欧美一区二区三区男人的天堂| 久久精品道一区二区三区| 午夜伦理片一区| 欧美国产一区二区三区激情无套| 国产精品美女www爽爽爽视频| 一区二区在线视频播放| 免费观看在线综合| 欧美日韩国产综合久久| 午夜精品久久久久久久99热浪潮| 亚洲高清二区| 欧美日韩在线一区二区三区| 午夜精品国产更新| 午夜一区不卡| 国产精品美女久久久| 久久精品国产亚洲一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆| 香蕉尹人综合在线观看| 在线精品高清中文字幕| 夜夜嗨av一区二区三区四季av| 免费不卡视频| 亚洲欧美网站| 欧美大片免费久久精品三p| 亚洲在线国产日韩欧美| 久久综合电影| 欧美亚洲综合在线| 欧美精品九九99久久| 久久九九精品| 欧美性猛交视频| 在线亚洲自拍| 可以看av的网站久久看| 一区二区三区在线视频免费观看 | 久久亚洲综合| 国产资源精品在线观看| 亚洲国产精品一区二区www| 性欧美超级视频| 欧美国产精品劲爆| 久久婷婷丁香| 国产精品初高中精品久久| 欧美黑人国产人伦爽爽爽| 久久久国产亚洲精品| 亚洲午夜久久久久久久久电影院| 亚洲日本一区二区三区| 欧美刺激午夜性久久久久久久| 亚洲电影天堂av| 性欧美暴力猛交69hd| 亚洲影院在线| 午夜精品网站| 午夜欧美精品| 国产精品成人观看视频免费| 欧美影院成年免费版| 欧美日韩美女在线| 亚洲黄色视屏| 日韩午夜中文字幕| 免费观看欧美在线视频的网站| 亚洲精品极品| 免费在线观看精品| 亚洲第一二三四五区| 亚洲高清自拍| 欧美国产极速在线| 亚洲激情不卡| 亚洲视频1区| 国产精品成人一区二区三区夜夜夜 | 国产一区二区三区在线观看免费视频 | 午夜电影亚洲| 国产精品久久久99| 亚洲欧美一级二级三级| 久久国产精品99精品国产| 国产日韩欧美一区二区三区在线观看| 鲁大师影院一区二区三区| 国产一区二区视频在线观看 | 在线视频精品一区| 欧美精品一区二区三区视频| 亚洲精品视频中文字幕| 亚洲男人的天堂在线aⅴ视频| 久久精品夜色噜噜亚洲a∨| 亚洲免费成人av| 欧美日本高清| 亚洲综合色丁香婷婷六月图片| 亚洲国产日韩一区| 欧美日韩1234| 亚洲在线一区| 一区二区三区四区五区视频| 欧美在线精品免播放器视频| 久久婷婷丁香| 在线亚洲高清视频| 国产伦精品一区二区| 玖玖国产精品视频| 亚洲私拍自拍| 美日韩精品视频免费看| 一区二区三区免费网站| 国产偷自视频区视频一区二区| 亚洲性视频网站| 欧美在线观看视频| 91久久午夜| 久久www免费人成看片高清| 亚洲成人在线网| 国产精品国产三级国产普通话99 | 亚洲性人人天天夜夜摸| 亚洲欧美日韩人成在线播放| 韩日午夜在线资源一区二区| 欧美高清视频www夜色资源网| 欧美jjzz| 在线日韩日本国产亚洲| 欧美日韩在线播放| 久久久一本精品99久久精品66| 久久精品国产精品亚洲| 亚洲美女在线看| 黄色亚洲精品| 国产精品人人做人人爽 | 一本到12不卡视频在线dvd| 国产欧美日韩精品在线| 欧美日韩国产色视频| 久久三级福利| 欧美一区二区免费| 久久理论片午夜琪琪电影网| 国产日韩欧美一二三区| 欧美日韩亚洲网| 毛片av中文字幕一区二区| 欧美亚洲一级| 亚洲专区一二三| 在线一区亚洲| 日韩亚洲一区二区| 亚洲影院色无极综合| 国产精品性做久久久久久| 欧美精品自拍偷拍动漫精品| 乱码第一页成人| 日韩视频精品在线| 亚洲欧美日韩精品在线| 亚洲美女91| 亚洲精品你懂的| 亚洲国产天堂网精品网站| 在线电影一区| 欧美日韩91| 欧美精品激情blacked18| 中文在线资源观看网站视频免费不卡| 亚洲天天影视| 中文精品99久久国产香蕉| 日韩一本二本av| 一区电影在线观看| 亚洲一区二区毛片| 亚洲欧美中文日韩在线| 亚洲欧美日韩一区| 欧美在线观看视频| 久久精品卡一| 欧美ed2k| 欧美一级二区| 久久成年人视频| 亚洲麻豆av| 国内激情久久| 亚洲高清不卡一区| 99av国产精品欲麻豆| 亚洲无人区一区| 午夜亚洲伦理| 老牛国产精品一区的观看方式| 中文国产成人精品久久一| 午夜精品久久久久| 久久九九精品| 亚洲激情综合| 亚洲自拍另类| 久久久国际精品| 欧美另类videos死尸| 最新中文字幕亚洲| 一区二区三区av| 欧美成人第一页| 亚洲激情网站| 亚洲一品av免费观看| 久久狠狠久久综合桃花| 欧美好吊妞视频| 国产精品一区二区a| 亚洲国产精品成人久久综合一区 | 久久av在线看| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲无线视频| 久久人人看视频| 国产精品伦一区| 欧美午夜久久| 在线不卡欧美| 午夜亚洲性色福利视频| 欧美成人免费va影院高清| 亚洲一本大道在线| 欧美成人午夜激情在线| 看欧美日韩国产| 国产欧美激情| 夜夜嗨av一区二区三区网页 | 可以看av的网站久久看| 久久精品国产精品亚洲精品| 欧美紧缚bdsm在线视频| 狠狠久久亚洲欧美| 亚洲欧美日韩国产综合在线| 亚洲国产美女精品久久久久∴| 亚洲国产精品美女| 久久精品二区| 国产免费成人在线视频|