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

Codejie's C++ Space

Using C++

LingosHook:IE來了~


    ‘店大欺人’這句話放在哪里都適用,瀏覽器市場亦是如此。IE當(dāng)?shù)溃渌鼮g覽器如若顯示跟其不一致,往往會(huì)被打上‘不標(biāo)準(zhǔn)’的烙記,也迫使HTML使用者不得不用IE來檢測是否符合‘標(biāo)準(zhǔn)’。真的很杯具,且不說IE自己定義了大量‘不標(biāo)準(zhǔn)’的Tag,誰又能確定IE對標(biāo)準(zhǔn)的執(zhí)行本身是否‘標(biāo)準(zhǔn)’呢?平常我用Google Chrome,但寫B(tài)log時(shí)還是需要切換到IE上,誰叫這些控件都是依據(jù)IE作為‘標(biāo)準(zhǔn)’的。這也是沒有辦法的事情,畢竟IE曾經(jīng)太強(qiáng)大了,致使現(xiàn)在依然余威不散啊。。。
    扯遠(yuǎn)了,我就來發(fā)發(fā)牢騷了,實(shí)際想說的是,為了讓LingosHook的HTML展示更接近Lingoes的顯示,這幾天不得不在嘗試讓LingosHook也支持適用IE來顯示結(jié)果,誰叫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()來顯示內(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的過程中,最讓我感慨的事就是--原來char到wchar_t、string到wstring是如此的繁瑣,陷阱重重。。。唉,一切都是charset引起的,要是當(dāng)年ASCII設(shè)計(jì)者們有點(diǎn)‘國際主義’精神,直接用定義出Unicode多好,哪有中間這么多charset的問題。。。(發(fā)牢騷而已,誰也不是先知。。。)

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

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

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

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

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

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

公告

Using C++

導(dǎo)航

統(tǒng)計(jì)

留言簿(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>
            久久成人精品无人区| 久久久久五月天| 欧美高清视频一区二区| 亚洲影院高清在线| 亚洲五月婷婷| 亚洲女性喷水在线观看一区| av成人手机在线| 亚洲天堂网站在线观看视频| 国产中文一区| 亚洲国产精品悠悠久久琪琪| 亚洲日本aⅴ片在线观看香蕉| 亚洲国产美女| 一区二区冒白浆视频| 亚洲视频在线观看网站| 亚洲尤物在线视频观看| 欧美一区二区黄色| 久久综合久久综合久久综合| 农夫在线精品视频免费观看| 亚洲黄一区二区三区| 亚洲国产欧美另类丝袜| 9久草视频在线视频精品| 午夜精品亚洲| 欧美va天堂在线| 欧美午夜在线| 1769国产精品| 午夜伦理片一区| 美女视频黄免费的久久| 亚洲精品在线观| 欧美在线日韩精品| 欧美国产成人精品| 国产视频在线观看一区二区三区| 亚洲国产成人午夜在线一区 | 欧美大片91| 国产精品极品美女粉嫩高清在线| 美女啪啪无遮挡免费久久网站| 欧美韩国日本综合| 国产热re99久久6国产精品| 亚洲精品一二三区| 久久免费精品日本久久中文字幕| 亚洲精品欧美极品| 久久精品亚洲一区二区| 欧美连裤袜在线视频| 国产一区二区你懂的| 一本久久a久久精品亚洲| 久久精品国产亚洲精品| 一本色道久久综合精品竹菊| 看片网站欧美日韩| 国产日韩精品入口| 亚洲视频自拍偷拍| 亚洲国产小视频| 久久久久久久综合狠狠综合| 国产精品久久一区主播| 国产精品99久久久久久白浆小说| 欧美电影资源| 久久网站免费| 激情综合五月天| 久久精品动漫| 亚洲欧美日韩区| 亚洲女性喷水在线观看一区| 欧美激情a∨在线视频播放| 精品动漫3d一区二区三区| 欧美一区二区视频在线观看| 在线视频中文亚洲| 欧美无乱码久久久免费午夜一区| 日韩视频免费观看| 亚洲在线视频观看| 一本久久综合| 欧美性一区二区| 亚洲欧美国内爽妇网| 亚洲午夜高清视频| 国产精品影片在线观看| 久久国产精品99久久久久久老狼| 亚洲一区中文字幕在线观看| 国产精品拍天天在线| 亚洲男人影院| 亚洲一区网站| 在线 亚洲欧美在线综合一区| 久久性天堂网| 免费日韩成人| 一区二区高清视频在线观看| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产精品五月天| 午夜精品免费| 久久久久一区二区| 日韩午夜在线观看视频| 亚洲一区二区三区激情| 精品1区2区| 99re热这里只有精品视频| 国产九区一区在线| 欧美国产成人在线| 欧美性天天影院| 免费亚洲一区二区| 欧美性一区二区| 美女免费视频一区| 国产精品国产三级国产专区53| 久久亚洲私人国产精品va| 欧美精品18+| 久久成人羞羞网站| 欧美乱人伦中文字幕在线| 欧美伊人久久| 欧美高清视频一二三区| 欧美诱惑福利视频| 欧美精品情趣视频| 久久久一区二区三区| 欧美精品免费观看二区| 欧美一区二区在线免费观看| 久久久久久穴| 亚洲欧美中文字幕| 久久精品一区二区| 欧美亚洲三级| 久热精品视频| 亚洲免费在线看| 欧美日本韩国一区二区三区| 欧美一区二区三区日韩| 老司机一区二区三区| 亚洲一区二区三区视频| 久久久精品tv| 久久久久中文| 欧美一级网站| 国产亚洲综合在线| 免费看精品久久片| 欧美日韩精品久久| 国产在线拍揄自揄视频不卡99| 中文av一区二区| 一区二区在线视频观看| 99国产精品久久久久老师| 一区在线视频| 亚洲一区二区三区在线| 国产综合视频| 欧美一区二区三区免费观看视频 | 亚洲人成艺术| 欧美一区1区三区3区公司| 伊人激情综合| 亚洲一区日韩在线| 亚洲九九精品| 欧美专区福利在线| 亚洲女人天堂成人av在线| 麻豆91精品| 亚洲国产岛国毛片在线| 国产亚洲精品综合一区91| 中文欧美日韩| 日韩亚洲欧美一区| 久久深夜福利免费观看| 欧美一区二区三区电影在线观看| 国产精品国产福利国产秒拍| 亚洲国产成人久久| 亚洲大胆女人| 久久精品成人| 久久不见久久见免费视频1| 久久综合伊人77777尤物| 欧美成人首页| 亚洲丰满少妇videoshd| 久久精品av麻豆的观看方式| 欧美在线三级| 国产老女人精品毛片久久| 亚洲品质自拍| 亚洲精品欧美日韩专区| 久久亚洲精品网站| 免费不卡在线视频| 在线观看亚洲一区| 亚洲一区久久久| 久久视频免费观看| 韩国视频理论视频久久| 性色av一区二区三区在线观看| 亚洲尤物影院| 国产精品久久久久999| 久久国产精品久久精品国产| 久久婷婷一区| 亚洲国产精品一区二区www| 久久夜色精品国产噜噜av| 欧美成人精品h版在线观看| 国产乱肥老妇国产一区二| 亚洲欧美日韩国产| 欧美一站二站| 1024亚洲| 欧美日韩妖精视频| 久久久久久亚洲精品不卡4k岛国| 欧美成人精品一区| 一区二区国产在线观看| 国产精品日韩| 久久精品夜色噜噜亚洲aⅴ| 欧美v日韩v国产v| 亚洲欧洲精品一区二区三区 | 亚洲曰本av电影| 国产三级欧美三级| 香蕉尹人综合在线观看| 美女国内精品自产拍在线播放| 亚洲欧洲精品一区| 国产精品视频区| 久久久久久久久久久成人| 亚洲激情在线激情| 美女爽到呻吟久久久久| 亚洲一区黄色| 伊人久久噜噜噜躁狠狠躁 | 欧美视频你懂的| 香蕉精品999视频一区二区| 一本色道久久综合亚洲精品不 | 国产综合一区二区| 欧美大片一区二区三区| 亚洲网站在线播放|