设置WebBrower的显示方式

原创 2011年01月10日 23:03:00
设置WebBrower的显示方式

更新日期:2011-1-10
代码下载:demo.zip (请不要使用下载工具,否则可能出错)
程序下载:WebBrowserViewMode-exe.zip

测试环境:VC6.0+WinXP
图片预览:



━━━━━━━━━━━━━━━━━━━━━━━━

当我想使用WebBrower控件来做一个小资源管理器时,发现显示模式一直是图标方式。
不能改变,通过不断的尝试。终于发现了一种可行的方案。

(1)要修改显示方式,我们可以用SetWindowLong来修改样式。
    这里最主要介绍用发送消息的方法来改变显示方式。

  首先需要手动定义5种显示方式:
    #define VIEWMODE_ICON        0x7029
    #define VIEWMODE_LIST        0x702B
    #define VIEWMODE_DETAILS    0x702C
    #define VIEWMODE_THUMBNAIL    0x702D
    #define VIEWMODE_TILE        0x702E

  之后如下调用即可:
      ::SendMessage(m_WebBrowser.m_hWnd,WM_COMMAND, VIEWMODE_ICON,NULL );

(2)每当我们双击文件夹打开时,发现视图又会恢复到平铺方式。
    所有在这里我们需要安装一个钩子,捕获创建视图WM_CREATE的消息,
    然后在接受到刷新    浏览器窗口背景时的消息(WM_ERASEBKGND)
    时发送消息改变文件夹的显示方式。(如果在捕获WM_CREATE时就发送消息
    改变显示模式,那会失败);

(3)下载示例程序:(请不要使用下载工具,否则可能出错)
http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/WebBrowerViewMode.zip

希望有所帮助,阿弥陀佛!


主要代码
━━━━━━━━━━━━━━━━━━━━━━━━


/****************************************************************************
寻找指定类名的子窗口句柄 方法一
****************************************************************************/
static
HWND FindWithClassName(HWND ParentWnd,TCHAR* FindClassName)
{
    HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);

    for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
    {
        TCHAR ClassName[100]={0};
        ::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));

        if (_tcscmp(ClassName,FindClassName)==0)
            return hChild;
       
        HWND FindWnd=FindWithClassName(hChild,FindClassName);
        if (FindWnd)
            return FindWnd;
    }
    return NULL;
}

#define VIEWMODE_ICON        0x7029
#define VIEWMODE_LIST        0x702B
#define VIEWMODE_DETAILS    0x702C
#define VIEWMODE_THUMBNAIL    0x702D
#define VIEWMODE_TILE        0x702E


CWebBrowser2* g_pWebBrowser;
HWND g_AddressEdit=NULL;
INT  g_ViewMode=VIEWMODE_DETAILS;

HHOOK g_hWndProc=NULL;

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode <0)
        return CallNextHookEx(g_hWndProc,nCode,wParam,lParam);
   
    static    HWND FolderViewWnd=NULL;
    static    bool IsSetViewMode=false;

    UINT  message=((CWPSTRUCT *)lParam)->message;
   
    switch(message)
    {
    case WM_CREATE:
        {
            HWND hWnd=((CWPSTRUCT *)lParam)->hwnd;
            TCHAR WindowText[30];
            ::GetWindowText(hWnd,WindowText,sizeof(WindowText)/sizeof(TCHAR));
            if (_tcscmp(WindowText,_T("FolderView"))==0)
            {
                FolderViewWnd=hWnd;
                IsSetViewMode=false;
            }
        }
        break;
    case WM_ERASEBKGND:
        {
            HWND hWnd=((CWPSTRUCT *)lParam)->hwnd;
            if ( hWnd == FolderViewWnd && IsSetViewMode==false )
            {
                IsSetViewMode=true;
                ::SendMessage(::GetParent(hWnd),WM_COMMAND,g_ViewMode,NULL );

                CString path=g_pWebBrowser->GetLocationURL();
                ::SetWindowText(g_AddressEdit,path);
            }
        }
        break;
    }
    return CallNextHookEx(g_hWndProc, nCode, wParam, lParam);
}


bool SetWndProcHook()
{
    g_hWndProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, NULL,GetCurrentThreadId() );
    if ( g_hWndProc )
        return true;
    else
        return false;
}

bool UnWndProcHook()
{
    if ( UnhookWindowsHookEx(g_hWndProc) )
        return true;
    else
        return false;
}


BOOL CWebBrowserDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
   
    g_pWebBrowser=&m_WebBrowser;
    g_AddressEdit=::GetDlgItem(m_hWnd,IDC_EDIT1);

    //安装钩子
    SetWndProcHook();

    m_WebBrowser.Navigate("c://",NULL,NULL,NULL,NULL);
   
    return TRUE;  // return TRUE  unless you set the focus to a control
}


void CWebBrowserDlg::OnBack()
{
    m_WebBrowser.GoBack();   
}

void CWebBrowserDlg::OnRadio1()
{
    HWND hWnd=FindWithClassName(m_hWnd,_T("SysListView32"));   

    LONG lStyle;
    lStyle=GetWindowLong(hWnd, GWL_STYLE); //获取当前窗口style
    lStyle &= ~LVS_TYPEMASK; //清除显示方式位
    lStyle |=LVS_ICON  ; //设置style
    SetWindowLong(hWnd, GWL_STYLE, lStyle); //设置style
}

void CWebBrowserDlg::OnRadio2()
{
    HWND hWnd=FindWithClassName(m_hWnd,_T("SysListView32"));   
    LONG lStyle;
    lStyle=GetWindowLong(hWnd, GWL_STYLE); //获取当前窗口style
    lStyle &= ~LVS_TYPEMASK; //清除显示方式位
    lStyle |=LVS_LIST  ; //设置style
    SetWindowLong(hWnd, GWL_STYLE, lStyle); //设置style
}

void CWebBrowserDlg::OnRadio3()
{
    HWND hWnd=FindWithClassName(m_hWnd,_T("SysListView32"));   
    LONG lStyle;
    lStyle=GetWindowLong(hWnd, GWL_STYLE); //获取当前窗口style
    lStyle &= ~LVS_TYPEMASK; //清除显示方式位
    lStyle |=LVS_SMALLICON  ; //设置style
    SetWindowLong(hWnd, GWL_STYLE, lStyle); //设置style
}

void CWebBrowserDlg::OnRadio4()
{
    HWND hWnd=FindWithClassName(m_hWnd,_T("SysListView32"));   

    LONG lStyle;
    lStyle=GetWindowLong(hWnd, GWL_STYLE); //获取当前窗口style
    lStyle &= ~LVS_TYPEMASK; //清除显示方式位
    lStyle |=LVS_REPORT  ; //设置style
    SetWindowLong(hWnd, GWL_STYLE, lStyle); //设置style
}


void CWebBrowserDlg::OnRadio5()
{
    ::SendMessage(m_WebBrowser.m_hWnd,WM_COMMAND, VIEWMODE_TILE,NULL );
    g_ViewMode=VIEWMODE_TILE;
}

void CWebBrowserDlg::OnRadio6()
{
    ::SendMessage(m_WebBrowser.m_hWnd,WM_COMMAND, VIEWMODE_LIST,NULL );
    g_ViewMode=VIEWMODE_LIST;
}

void CWebBrowserDlg::OnRadio7()
{
//    ::SendMessage( ::GetWindow( ::GetWindow(m_WebBrowser.m_hWnd,GW_CHILD) ,GW_CHILD )  ,WM_COMMAND, VIEWMODE_ICON,NULL );
//    ::SendMessage(::GetWindow(m_WebBrowser.m_hWnd,GW_CHILD),WM_COMMAND, VIEWMODE_ICON,NULL );
    ::SendMessage(m_WebBrowser.m_hWnd,WM_COMMAND, VIEWMODE_ICON,NULL );
}

void CWebBrowserDlg::OnRadio8()
{
    ::SendMessage(m_WebBrowser.m_hWnd,WM_COMMAND, VIEWMODE_DETAILS,NULL );
    g_ViewMode=VIEWMODE_DETAILS;
}

void CWebBrowserDlg::OnRadio9()
{
    ::SendMessage(m_WebBrowser.m_hWnd,WM_COMMAND, VIEWMODE_THUMBNAIL,NULL );
    g_ViewMode=VIEWMODE_THUMBNAIL;
}


BOOL CWebBrowserDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message==WM_KEYDOWN)
    {
        if (::GetFocus()==::GetDlgItem(m_hWnd,IDC_EDIT1))
        {
            if (pMsg->wParam==VK_RETURN)
            {
                TCHAR WindowText[200];
                ::GetWindowText(g_AddressEdit,WindowText,sizeof(WindowText)/sizeof(TCHAR));
                m_WebBrowser.Navigate(WindowText,NULL,NULL,NULL,NULL);
                return 1;
            }
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

推荐:
━━━━━━━━━━━━━━━━━━━━━━━━

谈老师的BLOG (佛教大德)
狮姐的博客(狮子窝,学佛与灵魂之探究)
大方广(学习传统文化)
慈善点击(轻松一点,行善积德,何乐不为)
电影《地球公民》(揭示不为人知的一面)  
心向光明 远离邪淫(现世警钟,不可不看)
戒淫(上篇)(正淫节欲,戒除邪淫)
戒淫(中篇)(纵欲之乐,忧患随之)
公民教育——命由我造

 

 

c# 使用webbrower做界面

直接使用webbrower,会发现其对js支持不友善,会弹出一些警告框,然后停止运行js,导致页面无法渲染成功. 在此要自己封装一次webbrower,对于这些js警告进行静默化 需要添加引用 Mic...
  • sc6231565
  • sc6231565
  • 2016年06月15日 17:13
  • 760

JSTL中日期转换 JSP 页面显示日期格式设置

转载http://blog.csdn.net/shenhonglei1234/article/details/7412020 在页面引入:然后在你想要显示的地方设置: 这样就可以显示pattern里...
  • smile_life_
  • smile_life_
  • 2016年10月22日 23:42
  • 240

设置列表的显示方式

sharepoint中通过SPList的Hidden 和OnQuickLaunch属性设置列表的显示方式。代码如下:SPSite site = SPContext.Current.Site;SPWeb...
  • maseccc
  • maseccc
  • 2008年12月31日 11:03
  • 523

c#设置本地图片为背景并图片设置显示方式

button2.BackgroundImage = Image.FromFile("c:\\pic\\" + filePath);//在所需控件中显示图片 button2.BackgroundIma...
  • u010614385
  • u010614385
  • 2013年06月08日 16:54
  • 571

webbrower

Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(string ur...
  • xiaruilin
  • xiaruilin
  • 2012年12月05日 19:04
  • 395

01-Myeclipse中的目录显示方式

之前我是非常的清楚,myeclipse中的目录结构分为扁平的
  • u010653050
  • u010653050
  • 2014年05月24日 17:49
  • 887

Imageloder设置显示方式

public class ListBaseAdapter extends BaseAdapter { Context context; List list; //2.设置显示...
  • wanglinuo521
  • wanglinuo521
  • 2017年12月07日 18:49
  • 7

android imageview 显示方式设置

注意   请查看本文后期更新完整版:   http://www.cnblogs.com/over140/archive/2011/06/08/2075054.html   ...
  • u012437660
  • u012437660
  • 2015年10月29日 11:10
  • 1312

Eclipse设置:设置大括号显示方式

  • qq_31892305
  • qq_31892305
  • 2017年07月07日 11:50
  • 63

C# webbrowser全掌握(二)

一、C#如何用Webbrowser获取网页的全部源代码(含框架 、不含框架) 二、C# webbrowser如何遍历网页元素 三、C# webbrowser模拟填表 四、webbrowser执行JS函...
  • xtfnpgy
  • xtfnpgy
  • 2014年10月19日 20:20
  • 2302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设置WebBrower的显示方式
举报原因:
原因补充:

(最多只允许输入30个字)