更新日期: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); } |