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

 

 

相关文章推荐

设置文件和文件夹的显示方式

  • 2011年04月02日 00:27
  • 2KB
  • 下载

如何设置eclipse左边显示包结构及包的显示方式

图一设置eclipse左边显示包结构(有时候打开eclipse它莫名其妙左边就没有显示包结构,比如我就遇到了这种情况,解决完这个顺便讲讲如何设置包的显示方式) E...

超大图像显示方式

  • 2017年11月17日 10:44
  • 230KB
  • 下载

Android Toast 五种显示方式

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net       ...
  • luckkof
  • luckkof
  • 2013年06月25日 11:06
  • 1023

PB中实现图片的多种显示方式

  • 2009年10月27日 10:07
  • 194KB
  • 下载

sql 不同日期显示方式

  • 2012年05月21日 15:17
  • 3KB
  • 下载

RecyclerView三种显示方式的下拉刷新和上拉加载更多

有关RecyclerView的类似SwipeRefreshLayout的上拉加载更多,我写了一篇博客http://blog.csdn.net/cj_286/article/details/527670...
  • cj_286
  • cj_286
  • 2017年01月06日 09:50
  • 1190

sql 日期格式的显示方式

  • 2012年04月21日 12:24
  • 2KB
  • 下载

Java Swing的显示方式

  • 2009年03月23日 12:57
  • 126KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设置WebBrower的显示方式
举报原因:
原因补充:

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