MyFrameWnd.cpp
上传用户:huashan618
上传日期:2013-03-26
资源大小:261k
文件大小:7k
源码类别:

浏览器

开发平台:

Visual C++

  1. // MyFrameWnd.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "PPExplorer.h"
  5. #include "MyFrameWnd.h"
  6. #include ".myframewnd.h"
  7. //#include "ppexplorerdlg.h"
  8. #include <commctrl.h>
  9. typedef UINT (CALLBACK* LPFNORGFAV)(HWND, LPTSTR);
  10. typedef BOOL (CALLBACK* LPFNADDFAV)(HWND, TCHAR*, UINT, TCHAR*, UINT, LPITEMIDLIST);
  11. #include <urlhist.h>
  12. #include <comdef.h>
  13. // CMyFrameWnd
  14. extern CString        g_statusinfo;
  15. extern CCustomTabCtrl g_explorer;
  16. IMPLEMENT_DYNCREATE(CMyFrameWnd, CMiniFrameWnd)
  17. CMyFrameWnd::CMyFrameWnd()
  18. {
  19. m_pAutoEnumString=NULL;
  20. }
  21. CMyFrameWnd::~CMyFrameWnd()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CMyFrameWnd, CMiniFrameWnd)
  25. ON_WM_CREATE()
  26. ON_WM_PAINT()
  27. ON_COMMAND(ID_TOOL_MOVIE,OnShowMoviePage)
  28. ON_COMMAND(ID_URL_PREV,OnWebBack)
  29. ON_COMMAND(ID_URL_NEXT,OnWebNext)
  30. ON_COMMAND(ID_URL_STOP,OnWebStop)
  31. ON_COMMAND(ID_URL_FRASH,OnWebStop)
  32. ON_COMMAND(ID_URL_HOME,OnWebHome)
  33. ON_CBN_EDITCHANGE(AFX_IDW_TOOLBAR + 1,OnAddressChange)
  34. ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress)
  35. ON_COMMAND(IDOK, OnNewAddressEnter)
  36. ON_WM_SIZE()
  37. END_MESSAGE_MAP()
  38. // CMyFrameWnd 消息处理程序
  39. int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  40. {
  41. if (CMiniFrameWnd::OnCreate(lpCreateStruct) == -1)
  42. return -1;
  43.   //  CImageList img;
  44. // CString str;
  45. if (!m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  46. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  47. !m_toolbar.LoadToolBar(IDR_TOLMENU))
  48. {
  49. return -1;      // 未能创建
  50. }
  51. if (!m_toolnav.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  52. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  53. !m_toolnav.LoadToolBar(IDR_TOLURLBAR))
  54. {
  55. return -1;      // 未能创建
  56. }
  57. if (!m_toolurl.Create(this))
  58. {
  59. TRACE0("Failed to create rebarn");
  60. return -1;      // fail to create
  61. }
  62. if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
  63. {
  64. TRACE0("Failed to create comboboxn");
  65. return -1;      // fail to create
  66. }
  67. m_wndAddress.LimitText(0);
  68. InitAddress();
  69. //m_toolurl.AddBar(&m_toolbar,NULL, NULL, RBBS_GRIPPERALWAYS|RBBS_FIXEDBMP);
  70. //m_toolurl.AddBar(&m_toolnav,NULL, NULL, RBBS_GRIPPERALWAYS|RBBS_FIXEDBMP);
  71. m_toolurl.AddBar(&m_wndAddress, _T("地址:"), NULL, RBBS_FIXEDBMP | RBBS_BREAK);
  72. m_toolbar.EnableDocking(CBRS_ALIGN_ANY);
  73. m_toolnav.EnableDocking(CBRS_ALIGN_ANY);
  74. m_toolurl.EnableDocking(CBRS_ALIGN_ANY);
  75. EnableDocking(CBRS_ALIGN_ANY);
  76. DockControlBar(&m_toolbar);
  77. DockControlBar(&m_toolnav);
  78. DockControlBar(&m_toolurl);
  79. return 0;
  80. }
  81. void CMyFrameWnd::OnPaint()
  82. {
  83. CPaintDC dc(this); // device context for painting
  84. //CRect rect;
  85. // GetClientRect(&rect);
  86. // dc.FillRect(&rect,&CBrush(RGB(192,255,218)));
  87. }
  88. //显示电影页面
  89. void CMyFrameWnd::OnShowMoviePage()
  90. {
  91. ::SendMessage(GetParent()->GetSafeHwnd(),WM_MENU_MESSAGE,ID_TOOL_MOVIE,0);
  92. }
  93. //处理页面控制栏的消息
  94. void CMyFrameWnd::OnWebBack()
  95. {
  96. if(g_explorer.m_oldwnd==NULL) return;
  97. ((CIEView*)g_explorer.m_oldwnd)->GoBack();
  98. return;
  99. }
  100. //下一页
  101. void CMyFrameWnd::OnWebNext()
  102. {
  103. if(g_explorer.m_oldwnd==NULL) return;
  104.     ((CIEView*)g_explorer.m_oldwnd)->GoForward();
  105. }
  106. //停止
  107. void CMyFrameWnd::OnWebStop()
  108. {
  109. if(g_explorer.m_oldwnd==NULL) return;
  110.     ((CIEView*)g_explorer.m_oldwnd)->Stop();
  111. }
  112. //刷新
  113. void CMyFrameWnd::OnWebFrash()
  114. {
  115. if(g_explorer.m_oldwnd==NULL) return;
  116.    ((CIEView*)g_explorer.m_oldwnd)->Refresh();
  117. }
  118. //主页
  119. void CMyFrameWnd::OnWebHome()
  120. {
  121. if(g_explorer.m_oldwnd==NULL) return;
  122. ((CIEView*)g_explorer.m_oldwnd)->GoHome();
  123. }
  124. void CMyFrameWnd::EnableGoBack(BOOL bEnable)
  125. {
  126. m_bEnableGoBack=bEnable;
  127. }
  128. void CMyFrameWnd::EnableGoForward(BOOL bEnable)
  129. {
  130. m_bEnableGoForward=bEnable;
  131. }
  132. //从注册表中获取历史数据
  133. BOOL CMyFrameWnd::AddHistory(LPCTSTR lpszURL, LPCTSTR lpszTitle)
  134. {
  135.   #if 0
  136. HRESULT hr;
  137. IUrlHistoryStg2 *puhs;
  138. _bstr_t bstrUrl(lpszURL);
  139. _bstr_t bstrTitle(lpszURL);
  140. hr = ::CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg, (LPVOID *)&puhs);
  141. if(SUCCEEDED(hr))
  142. {
  143. hr=puhs->AddUrl(bstrUrl,bstrTitle,NULL);
  144. ASSERT(hr==S_OK);
  145. puhs->Release();
  146. m_pAutoEnumString->AddRef();
  147. m_pAutoEnumString->AddString(lpszURL);
  148. m_pAutoEnumString->Release();
  149. }
  150.   #endif 
  151.   return TRUE;
  152. }
  153. BOOL CMyFrameWnd::InitAddress()
  154. {
  155. typedef HRESULT (CALLBACK* LPFNDLLFUNC1)(HWND ,DWORD);
  156. HINSTANCE hIns = LoadLibrary("shlwapi.dll");
  157. if(hIns != NULL)
  158. {
  159. LPFNDLLFUNC1 lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hIns, "SHAutoComplete");
  160. if(lpfnDllFunc1!=NULL)
  161. lpfnDllFunc1(m_wndAddress.GetEditCtrl()->m_hWnd, 0xe);
  162. FreeLibrary(hIns);
  163. }
  164. HRESULT hr;
  165. IUrlHistoryStg2 *puhs;
  166. IEnumSTATURL *pesu;
  167. STATURL su;
  168. ULONG celt;
  169. _bstr_t bstr;
  170. hr = ::CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg, (LPVOID *)&puhs);
  171. m_pAutoEnumString=new CAutoEnumString;
  172. m_pAutoEnumString->AddRef();
  173. if(SUCCEEDED(hr))
  174. {
  175. hr = puhs->EnumUrls(&pesu);
  176. if(SUCCEEDED(hr))
  177. {
  178. while(SUCCEEDED(pesu->Next(1, &su, &celt)) && celt > 0)
  179. {
  180. bstr = su.pwcsUrl;
  181. CString strAddress;
  182. strAddress=(LPCTSTR)(bstr);
  183. if(strAddress.Find("http://",0)==0)//有选择的添加
  184. {
  185. // m_wndAddress.AddString(bstr);
  186. if(strAddress.GetLength()<30)
  187. {
  188. COMBOBOXEXITEM item;
  189. item.mask = CBEIF_TEXT;
  190. item.iItem = -1; // insert at the end. So the order is keeped
  191. item.pszText = (LPTSTR)(LPCTSTR)bstr;
  192. m_wndAddress.InsertItem(&item);
  193. }
  194. }
  195. m_pAutoEnumString->AddString(bstr);
  196. }
  197. puhs->Release();
  198. }
  199. }
  200. //自动完成功能的添加
  201. m_pAutoEnumString->QueryInterface(IID_IEnumString,(LPVOID*)&m_pEnumSting);
  202. m_pAutoEnumString->Release();
  203. ::CoCreateInstance( CLSID_AutoComplete, NULL, 
  204. CLSCTX_INPROC_SERVER, IID_IAutoComplete, 
  205. (LPVOID *) &m_pAutoCmpAddress );
  206. HWND  hwnd= (HWND)m_wndAddress.SendMessage(CBEM_GETEDITCONTROL);
  207. if(hwnd)
  208. {
  209. m_pAutoCmpAddress->Init(hwnd,m_pEnumSting,NULL,NULL);
  210. }
  211. IAutoComplete2 *pac2;
  212. if (SUCCEEDED(m_pAutoCmpAddress->QueryInterface(IID_IAutoComplete2, (LPVOID*)&pac2)))
  213. {
  214. pac2->SetOptions(ACO_AUTOSUGGEST|ACO_AUTOAPPEND);
  215. pac2->Release();
  216. }
  217. return TRUE;
  218. }
  219. //当地址栏的数据发生变化时调用
  220. void CMyFrameWnd::OnAddressChange()
  221. {
  222. //AfxMessageBox(_T("the addresschange!"));
  223. }
  224. //在地址栏中输入了新的地址信息,按下回车键后响应
  225. void CMyFrameWnd::OnNewAddressEnter()
  226. {
  227. CString str;
  228. m_wndAddress.GetWindowText(str);
  229. if (str.GetLength() == 0)
  230. return;
  231. if(g_explorer.m_oldwnd)
  232. {
  233.       ((CIEView*)g_explorer.m_oldwnd)->ReadUrlDocument(str);
  234. }
  235. else
  236. {
  237. g_explorer.InsertItem(0,str,RUNTIME_CLASS(CIEView));
  238. g_explorer.SetCurSel(0);
  239. }
  240. }
  241. //在组合框中选择了一项地址后响应
  242. void CMyFrameWnd::OnNewAddress()
  243. {
  244. CString str;
  245. m_wndAddress.GetLBText(m_wndAddress.GetCurSel(), str);
  246. if (str.GetLength() == 0)
  247. return;
  248. if(g_explorer.m_oldwnd)
  249. {
  250.       ((CIEView*)g_explorer.m_oldwnd)->ReadUrlDocument(str);
  251. }
  252. else
  253. {
  254. g_explorer.InsertItem(0,str,RUNTIME_CLASS(CIEView));
  255. g_explorer.SetCurSel(0);
  256. }
  257. }
  258. // 设置地址框信息
  259. void CMyFrameWnd::SetAddressBarText(CString url)
  260. {
  261. m_wndAddress.SetWindowText(url);
  262. }
  263. // 当所浏览的网页发生改变时,重新显示标题
  264. void CMyFrameWnd::SetTabCtrlTitle(CString title)
  265. {
  266. g_explorer.SetItemText(g_explorer.GetCurSel(),title);
  267. }