Home mail me! Syndicate this site using RSS

Archive for December, 2007


去掉CWebBorwser2控件的滚动条

重载XDocHostUIHandler::GetHostInfo方法即可

相关代码如下:

HRESULT FAR EXPORT CMyControlSite::XDocHostUIHandler::GetHostInfo(DOCHOSTUIINFO* pInfo)
{
    METHOD_PROLOGUE(CMyControlSite, DocHostUIHandler)
    //pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
    pInfo->dwFlags = DOCHOSTUIFLAG_DIALOG;		// 禁止选择
    pInfo->dwFlags |= DOCHOSTUIFLAG_SCROLL_NO;	// 去掉滚动条
    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
    return S_OK;
}

该方法中,可延伸的内容也非常,比如设置默认的CSS,设置浏览器默认的属性等。
DOCHOSTUIFLAG_DIALOG = 0×00000001,
DOCHOSTUIFLAG_DISABLE_HELP_MENU = 0×00000002,
DOCHOSTUIFLAG_NO3DBORDER = 0×00000004,
DOCHOSTUIFLAG_SCROLL_NO = 0×00000008,
DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE = 0×00000010,
DOCHOSTUIFLAG_OPENNEWWIN = 0×00000020,
DOCHOSTUIFLAG_DISABLE_OFFSCREEN = 0×00000040,
DOCHOSTUIFLAG_FLAT_SCROLLBAR = 0×00000080,
DOCHOSTUIFLAG_DIV_BLOCKDEFAULT = 0×00000100,
DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY = 0×00000200,
DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY = 0×00000400,
DOCHOSTUIFLAG_CODEPAGELINKEDFONTS = 0×00000800,
DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 = 0×00001000,
DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 = 0×00002000,
DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE = 0×00004000,
DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION = 0×00010000,
DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION = 0×00020000,
DOCHOSTUIFLAG_THEME = 0×00040000,
DOCHOSTUIFLAG_NOTHEME = 0×00080000,
DOCHOSTUIFLAG_NOPICS = 0×00100000,
DOCHOSTUIFLAG_NO3DOUTERBORDER = 0×00200000

Disable URLDownloadToFile cache

VC++提供了URLDownloadToFile和URLDownloadToCacheFile两个方法用来实现文件的下载,省去了自己写SOCKET。

默认情况下,这两个方法都会从缓存里找,若存在缓存,则会直接从缓存取,而不再下载(IE就是这么实现的),这样大大增加了下载出错的几率。

下面提供两种方法来禁止缓存,而每次都从服务器端下载
方法一:
该方法最简单,在调用URLDownloadToFile之间调用DeleteUrlCacheEntry即可。
DeleteUrlCacheEntry()方法在Wininet.h头文件里定义。

DeleteUrlCacheEntry(remote_file);
HRESULT hr = URLDownloadToFile(NULL, local_file, remote_file, 0, 0);

方法二:
这种方法适合需实现自定义下载进度的,原理就是实现一个IBindStatusCallback接口的GetBindInfo方法,加入BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE属性即可。相关代码如下:

STDMETHODIMP CBindStatusCallback::GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindInfo)
{
    if (!pgrfBINDF || !pbindInfo || pgrfBINDF == NULL) {
        return E_POINTER;
    }
 
    // force redownload
    *pgrfBINDF |= BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE;
 
    if (pbindInfo->cbSize<sizeof(BINDINFO)) {
        return E_INVALIDARG;
    }
 
    if (pbindInfo->dwBindVerb!=BINDVERB_POST && pbindInfo->dwBindVerb!=BINDVERB_GET) {
        return E_UNEXPECTED;
    }
    return E_NOTIMPL;
}