UIFrameWnd.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:15k
源码类别:

图形图象

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // You may use this source code, compile or redistribute it as part of your application 
  5. // for free. You cannot redistribute it as a part of a software development 
  6. // library without the agreement of the author. If the sources are 
  7. // distributed along with the application, you should leave the original 
  8. // copyright notes in the source code without any changes.
  9. // This code can be used WITHOUT ANY WARRANTIES at your own risk.
  10. // 
  11. // For the latest updates to this code, check this site:
  12. // http://www.masmex.com 
  13. // after Sept 2000
  14. // 
  15. // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
  16. //*******************************************************************************
  17. #include "stdafx.h"
  18. #include "UIFrameWnd.h"
  19. #include "UIApp.h"
  20. #include "UIres.h"
  21. #include "UIMessages.h"
  22. #include "WindowPlacement.h"
  23. #include "IEShellTreeView.h"
  24. #include "IEShellListView.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. static UINT nMsgMouseWheel =
  31.    (((::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion()) == 4)) ||
  32.  (!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion()) == 3)))
  33.  ? ::RegisterWindowMessage(MSH_MOUSEWHEEL) : 0;
  34. LPCTSTR CUIFrameWnd::szMainFrame = _T("MainFrame");
  35. IMPLEMENT_DYNAMIC(CUIFrameWnd, CFrameWnd)
  36. CUIFrameWnd::CUIFrameWnd() : m_IDToolbar(0),m_pwndCoolBar(NULL)
  37. {
  38. m_bReportCtrl = false;
  39. }
  40. CUIFrameWnd::~CUIFrameWnd()
  41. {
  42. delete m_pwndCoolBar;
  43. }
  44. void CUIFrameWnd::RestoreWindow(UINT nCmdShow) 
  45. {
  46. // Load window placement from profile
  47. CWindowPlacement wp;
  48. if (!wp.Restore(CUIFrameWnd::szMainFrame, this))
  49. {
  50. ShowWindow(nCmdShow);
  51. }
  52. }
  53. CUIStatusBar &CUIFrameWnd::GetStatusBar()
  54. {
  55. return m_wndStatusBar;
  56. }
  57. CReallyCoolBar &CUIFrameWnd::GetCoolBar()
  58. {
  59. ASSERT(m_pwndCoolBar);
  60. return *m_pwndCoolBar;
  61. }
  62. void CUIFrameWnd::CreateCoolBar()
  63. {
  64. if (m_pwndCoolBar == NULL)
  65. m_pwndCoolBar = new CReallyCoolBar;
  66. }
  67. CCoolMenuManager &CUIFrameWnd::GetMenuManager()
  68. {
  69. return m_menuManager;
  70. }
  71. BEGIN_MESSAGE_MAP(CUIFrameWnd, CFrameWnd)
  72. //{{AFX_MSG_MAP(CUIFrameWnd)
  73. ON_WM_INITMENUPOPUP()
  74. ON_WM_MENUSELECT()
  75. ON_WM_CREATE()
  76. ON_WM_CLOSE()
  77. ON_WM_MOUSEWHEEL()
  78. //}}AFX_MSG_MAP
  79. ON_REGISTERED_MESSAGE(nMsgMouseWheel, OnRegisteredMouseWheel)
  80. ON_MESSAGE(WM_APP_CB_IE_SET_EDIT_TEXT,OnCBIESetEditText)
  81. ON_MESSAGE(WM_APP_CB_IE_POPULATE,OnCBIEPopulate)
  82. ON_MESSAGE(WM_APP_CB_IE_SEL_CHANGE,OnCBIESelChange)
  83. ON_MESSAGE(WM_APP_CB_IE_HIT_ENTER,OnCBIEHitEnter)
  84. END_MESSAGE_MAP()
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CUIFrameWnd message handlers
  87. BOOL CUIFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
  88. {
  89. // TODO: Modify the Window class or styles here by modifying
  90. //  the CREATESTRUCT cs
  91. CWinApp *pApp = AfxGetApp();
  92. if (pApp->IsKindOf(RUNTIME_CLASS(CUIApp)))
  93. {
  94. if (((CUIApp*)pApp)->IsMyClassRegistered())
  95. {
  96. cs.lpszClass = ((CUIApp*)pApp)->GetMyClass();
  97. TRACE(_T("Setting to window class %s in CUIFrameWndn"),cs.lpszClass);
  98. }
  99. }
  100. if (cs.lpszClass == NULL)
  101. {
  102. cs.lpszClass = AfxRegisterWndClass(
  103.   CS_DBLCLKS,                       
  104.   NULL,                             
  105.   NULL,                             
  106.   NULL); 
  107. ASSERT(cs.lpszClass);
  108. }
  109. CWindowPlacement wp;
  110. if (wp.GetProfileWP(szMainFrame)) 
  111. {
  112. CRect rc(wp.rcNormalPosition);
  113. cs.x = rc.left;
  114. cs.y = rc.top;
  115. cs.cx = rc.Width();
  116. cs.cy = rc.Height();
  117. }
  118. return CFrameWnd::PreCreateWindow(cs);
  119. }
  120. void CUIFrameWnd::OnClose() 
  121. {
  122. // TODO: Add your message handler code here and/or call default
  123. CWindowPlacement wp;
  124. wp.Save(szMainFrame,this);
  125. CFrameWnd::OnClose();
  126. }
  127. void CUIFrameWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
  128. {
  129. CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
  130. // store width of first pane and its style
  131. if (GetStatusBar().m_nStatusPane1Width == -1 && GetStatusBar().m_bMenuSelect)
  132. {
  133. UINT nStatusPane1Style;
  134. GetStatusBar().GetPaneInfo(0, GetStatusBar().m_nStatusPane1ID, 
  135. nStatusPane1Style, GetStatusBar().m_nStatusPane1Width);
  136. GetStatusBar().SetPaneInfo(0, GetStatusBar().m_nStatusPane1ID, 
  137. SBPS_NOBORDERS|SBPS_STRETCH, 16384);
  138. }
  139. }
  140. int CUIFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  141. {
  142. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  143. return -1;
  144. // if not tool bar set no point in continuing
  145. ASSERT(m_IDToolbar > 0);
  146. if (m_IDToolbar == 0)
  147. return 0;
  148. if (!GetStatusBar().Create(this))
  149. {
  150. TRACE0("Failed to create status barn");
  151. return -1;      // fail to create
  152. }
  153. GetStatusBar().AddPane(ID_SEPARATOR,TRUE);
  154. GetStatusBar().SetPanes(FALSE);
  155. CreateCoolBar();
  156. ASSERT(m_pwndCoolBar);
  157. if (m_pwndCoolBar == NULL)
  158. return -1;
  159. CReallyCoolBar& cb = GetCoolBar();
  160. ASSERT(m_IDToolbar > 0);
  161. cb.SetToolBarID(m_IDToolbar);
  162. VERIFY(cb.Create(this,
  163. WS_CHILD|WS_VISIBLE|WS_BORDER|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
  164. RBS_TOOLTIPS|RBS_BANDBORDERS|RBS_VARHEIGHT));
  165. cb.SetColors(GetSysColor(COLOR_BTNTEXT),GetSysColor(COLOR_3DFACE));
  166. // install/load cool menus
  167. GetMenuManager().Install(this);
  168. GetMenuManager().LoadToolbar(m_IDToolbar);
  169. if (cb.IsKindOf(RUNTIME_CLASS(CWebBrowserCoolBar)))
  170. GetMenuManager().LoadToolbar(IDB_HOTTOOLBAR);
  171. if (m_bReportCtrl)
  172. {
  173. if (!m_wndFieldChooser.Create(this, IDD_FIELDCHOOSER,
  174. CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE, ID_VIEW_FIELDCHOOSER))
  175. return -1; // fail to create
  176. EnableDocking(CBRS_ALIGN_ANY);
  177. m_wndFieldChooser.EnableDocking(0);
  178. m_wndFieldChooser.SetWindowText(_T("Field Chooser"));
  179. FloatControlBar(&m_wndFieldChooser, CPoint(100, GetSystemMetrics(SM_CYSCREEN) / 3));
  180. ShowControlBar(&m_wndFieldChooser, FALSE, FALSE);
  181. }
  182. return 0;
  183. }
  184. void CUIFrameWnd::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
  185. {
  186.    CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
  187. // Restore first pane of the statusbar?
  188. if (nFlags == 0xFFFF && hSysMenu == 0 && GetStatusBar().m_nStatusPane1Width != -1)
  189. {
  190. GetStatusBar().m_bMenuSelect = FALSE;
  191. GetStatusBar().SetPaneInfo(0, GetStatusBar().m_nStatusPane1ID, GetStatusBar().m_nStatusPane1Style, GetStatusBar().m_nStatusPane1Width);
  192. GetStatusBar().m_nStatusPane1Width = -1;   // Set it to illegal value
  193. }
  194. else 
  195. {
  196. GetStatusBar().m_bMenuSelect = TRUE;
  197. }
  198. }
  199. void CUIFrameWnd::GetMessageString( UINT nID, CString& rMessage ) const
  200. {
  201. CFrameWnd::GetMessageString(nID,rMessage);
  202. CUIFrameWnd *pThis = const_cast<CUIFrameWnd*>(this);
  203. if (pThis->GetStatusBar().IsPanes())
  204. pThis->GetStatusBar().SetPaneText(0,rMessage);
  205. }
  206. BOOL CUIFrameWnd::PreTranslateMessage(MSG* pMsg)
  207. {
  208. return m_pwndCoolBar && m_pwndCoolBar->m_wndMenuBar.TranslateFrameMessage(pMsg) ?
  209. TRUE : CFrameWnd::PreTranslateMessage(pMsg);
  210. }
  211. ////////////////////////////////////////////////////////////////
  212. // CReallyCoolBar
  213. //
  214. IMPLEMENT_DYNAMIC(CReallyCoolBar, CCoolBar)
  215. IMPLEMENT_DYNAMIC(CWebBrowserCoolBar, CCoolBar)
  216. ////////////////
  217. // This is the virtual function you have to override to add bands
  218. //
  219. BOOL CReallyCoolBar::OnCreateBands()
  220. {
  221. //////////////////
  222. // Create menu bar
  223. CMenuBar& mb = m_wndMenuBar;
  224. VERIFY(mb.Create(this, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
  225. CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC|CBRS_FLYBY|CBRS_ORIENT_HORZ));
  226. mb.ModifyStyle(0, TBSTYLE_TRANSPARENT);
  227. // Load doc or main menu. Only required since this app flips
  228. // between coolbar/toolbars.
  229. CFrameWnd *pParent = GetParentFrame();
  230. CFrameWnd* pFrame = pParent->GetActiveFrame();
  231. ASSERT(m_IDToolbar > 0);
  232. mb.LoadMenu(m_IDToolbar);
  233. CRect rc;
  234. mb.GetItemRect(0, &rc);
  235. CSize szMenu = mb.CalcDynamicLayout(-1, LM_HORZ); // get min horz size
  236. // create menu bar band.
  237. CSize szMin;
  238. szMin = CSize( szMenu.cx, rc.Height());
  239. if (!InsertBand(&mb, szMin, 0x7ff))
  240. return FALSE;
  241. //////////////////
  242. // Create tool bar
  243. CFlatToolBar& tb = m_wndToolBar;
  244. VERIFY(tb.Create(this,
  245. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
  246. CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC|CBRS_FLYBY|CBRS_ORIENT_HORZ));
  247. VERIFY(tb.LoadToolBar(m_IDToolbar)); 
  248. // use transparent so coolbar bitmap will show through
  249. tb.ModifyStyle(0, TBSTYLE_TRANSPARENT);
  250. // Get minimum size of toolbar, which is basically size of one button
  251. CSize szHorz = tb.CalcDynamicLayout(-1, LM_HORZ); // get min horz size
  252. tb.GetItemRect(0, &rc);
  253. szMin = rc.Size(); // CSize( szHorz.cx, rc.Height()); 
  254. // create toolbar band. Use largest size possible
  255. if (!InsertBand(&tb, szMin, 0x7fff, NULL, -1, TRUE))
  256. return FALSE;
  257. return TRUE; // OK
  258. }
  259. void CReallyCoolBar::SetToolBarID(UINT IDToolbar)
  260. {
  261. m_IDToolbar = IDToolbar;
  262. }
  263. BOOL CWebBrowserCoolBar::OnCreateBands()
  264. {
  265. CReallyCoolBar::OnCreateBands();
  266. CFlatToolBar& bb = m_wndBrowserBar;
  267. VERIFY(bb.Create(this,
  268. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
  269. CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC|CBRS_FLYBY|CBRS_ORIENT_HORZ));
  270. CImageList img;
  271. CString str;
  272. // bb.GetToolBarCtrl().SetButtonWidth(50, 150);
  273. bb.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
  274. img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));
  275. bb.GetToolBarCtrl().SetHotImageList(&img);
  276. img.Detach();
  277. img.Create(IDB_COLDTOOLBAR, 22, 0, RGB(255, 0, 255));
  278. bb.GetToolBarCtrl().SetImageList(&img);
  279. img.Detach();
  280. bb.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
  281. bb.SetButtons(NULL, 7);
  282. // use transparent so coolbar bitmap will show through
  283. bb.ModifyStyle(0, TBSTYLE_TRANSPARENT);
  284. // set up each toolbar button
  285. /* str.LoadString(IDS_BROWSER_GO_BACK);
  286. bb.SetButtonText(0, str);
  287. str.LoadString(IDS_BROWSER_GO_FORWARD);
  288. bb.SetButtonText(1, str);
  289. str.LoadString(IDS_BROWSER_STOP);
  290. bb.SetButtonText(2, str);
  291. str.LoadString(IDS_BROWSER_REFRESH);
  292. bb.SetButtonText(3, str);
  293. str.LoadString(IDS_BROWSER_GO_HOME);
  294. bb.SetButtonText(4, str);
  295. str.LoadString(IDS_BROWSER_SEARCH);
  296. bb.SetButtonText(5, str);
  297. str.LoadString(IDS_BROWSER_FAVORITES);
  298. bb.SetButtonText(6, str);
  299. */
  300. bb.SetButtonInfo(0, ID_BROWSER_GO_BACK, TBSTYLE_BUTTON, 0);
  301. bb.SetButtonInfo(1, ID_BROWSER_GO_FORWARD, TBSTYLE_BUTTON, 1);
  302. bb.SetButtonInfo(2, ID_BROWSER_STOP, TBSTYLE_BUTTON, 2);
  303. bb.SetButtonInfo(3, ID_BROWSER_REFRESH, TBSTYLE_BUTTON, 3);
  304. bb.SetButtonInfo(4, ID_BROWSER_GO_HOME, TBSTYLE_BUTTON, 4);
  305. bb.SetButtonInfo(5, ID_BROWSER_SEARCH, TBSTYLE_BUTTON, 5);
  306. bb.SetButtonInfo(6, ID_BROWSER_FAVORITES, TBSTYLE_BUTTON, 6);
  307. CRect rectToolBar;
  308. CRect rc;
  309. // set up toolbar button sizes
  310. bb.GetItemRect(0, &rectToolBar);
  311. // bb.SetSizes(rectToolBar.Size(), CSize(30,20));
  312. // Get minimum size of toolbar, which is basically size of one button
  313. CSize szHorz = bb.CalcDynamicLayout(-1, LM_HORZ); // get min horz size
  314. bb.GetItemRect(0, &rc);
  315. CSize szMin = rc.Size(); // CSize( szHorz.cx, rc.Height()); 
  316. // create toolbar band. Use largest size possible
  317. if (!InsertBand(&bb, szMin, 0x7fff, NULL, -1, TRUE))
  318. return FALSE;
  319. //////////////////
  320. // Create combo box and fill with data
  321. CRect rcCombo(0,0,600,200);
  322. m_wndCombo.Create(WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWN|
  323. WS_CLIPCHILDREN|WS_CLIPSIBLINGS, rcCombo, this, IDC_CB_IE_ADDRESS);
  324. m_wndCombo.SetFont(GetFont());
  325. CSize szMinCombo = m_wndBrowserBar.CalcDynamicLayout(-1, LM_HORZDOCK);       // get min horz size
  326. if (!InsertBand(&m_wndCombo, szMinCombo, 0x7fff, _T("Address")))
  327. return FALSE;
  328. return TRUE;
  329. }
  330. // changed from MFC to use WindowFromPoint instead of GetFocus
  331. LRESULT CUIFrameWnd::OnRegisteredMouseWheel(WPARAM wParam, LPARAM lParam)
  332. {
  333. // convert from MSH_MOUSEWHEEL to WM_MOUSEWHEEL
  334. TRACE(_T("CUFrameWnd registered mouse wheel messagen"));
  335. // return CFrameWnd::OnRegisteredMouseWheel(wParam,lParam);
  336. WORD keyState = 0;
  337. keyState |= (::GetKeyState(VK_CONTROL) < 0) ? MK_CONTROL : 0;
  338. keyState |= (::GetKeyState(VK_SHIFT) < 0) ? MK_SHIFT : 0;
  339. LRESULT lResult;
  340. CPoint point;
  341. ::GetCursorPos(&point);
  342. HWND hwFocus = ::WindowFromPoint(point);
  343. // HWND hwFocus = ::GetFocus();
  344. const HWND hwDesktop = ::GetDesktopWindow();
  345. if (hwFocus == NULL)
  346. lResult = SendMessage(WM_MOUSEWHEEL, (wParam << 16) | keyState, lParam);
  347. else
  348. {
  349. do {
  350. lParam = ::SendMessage(hwFocus, WM_MOUSEWHEEL,
  351. (wParam << 16) | keyState, lParam);
  352. hwFocus = ::GetParent(hwFocus);
  353. }
  354. while (lParam == 0 && hwFocus != NULL && hwFocus != hwDesktop);
  355. }
  356. return lResult;
  357. }
  358. BOOL CUIFrameWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
  359. {
  360. CFrameWnd::OnMouseWheel(nFlags,zDelta,pt); 
  361. // TODO: Add your message handler code here and/or call default
  362. TRACE(_T("CUIFrameWnd mouse wheel messagen"));
  363. return TRUE;
  364. }
  365. LRESULT CUIFrameWnd::OnCBIEPopulate(WPARAM wParam,LPARAM lParam)
  366. {
  367. TRACE(_T("Received ComboBox populate message in CUIFrameWndn"));
  368. if (m_pwndCoolBar && m_pwndCoolBar->IsKindOf(RUNTIME_CLASS(CWebBrowserCoolBar)))
  369. {
  370. TRACE(_T("Sending to ShellComboBox...n"));
  371. ((CWebBrowserCoolBar*)m_pwndCoolBar)->GetComboBox().SendMessage(WM_APP_CB_IE_POPULATE,wParam,lParam);
  372. }
  373. return 1L;
  374. }
  375. LRESULT CUIFrameWnd::OnCBIEHitEnter(WPARAM wParam,LPARAM lParam)
  376. {
  377. if (lParam == NULL)
  378. return 0L;
  379. if (m_pwndCoolBar && m_pwndCoolBar->IsKindOf(RUNTIME_CLASS(CWebBrowserCoolBar)))
  380. {
  381. CWinApp *pApp = AfxGetApp();
  382. CUIApp *pUIApp=NULL;
  383. if (pApp->IsKindOf(RUNTIME_CLASS(CUIApp)))
  384. pUIApp = (CUIApp*)pApp;
  385. if (pUIApp)
  386. {
  387. CView *pView = NULL;
  388. pView = pUIApp->GetView(RUNTIME_CLASS(CIEShellTreeView));
  389. if (pView)
  390. {
  391. LRESULT lResult = 0;
  392. if (wParam == 0)
  393. lResult = ((CIEShellTreeView*)pView)->GetShellTreeCtrl().SendMessage(WM_APP_CB_IE_HIT_ENTER,wParam,lParam);
  394. if (lResult == 0)
  395. {
  396. pView = pUIApp->GetView(RUNTIME_CLASS(CIEShellListView));
  397. if (pView)
  398. pView->SendMessage(WM_APP_CB_IE_HIT_ENTER,wParam,lParam);
  399. }
  400. }
  401. }
  402. }
  403. return 1L;
  404. }
  405. LRESULT CUIFrameWnd::OnCBIESelChange(WPARAM wParam,LPARAM lParam)
  406. {
  407. if (m_pwndCoolBar && m_pwndCoolBar->IsKindOf(RUNTIME_CLASS(CWebBrowserCoolBar)))
  408. {
  409. CWinApp *pApp = AfxGetApp();
  410. CUIApp *pUIApp=NULL;
  411. if (pApp->IsKindOf(RUNTIME_CLASS(CUIApp)))
  412. pUIApp = (CUIApp*)pApp;
  413. if (pUIApp)
  414. {
  415. CView *pView = NULL;
  416. if (wParam)
  417. {
  418. pView = pUIApp->GetView(RUNTIME_CLASS(CIEShellTreeView));
  419. if (pView)
  420. ((CIEShellTreeView*)pView)->GetShellTreeCtrl().SendMessage(WM_APP_CB_IE_SEL_CHANGE,wParam,lParam);
  421. }
  422. else
  423. {
  424. pView = pUIApp->GetView(RUNTIME_CLASS(CIEShellListView));
  425. if (pView)
  426. pView->SendMessage(WM_APP_CB_IE_SEL_CHANGE,wParam,lParam);
  427. }
  428. }
  429. }
  430. return 1L;
  431. }
  432. LRESULT CUIFrameWnd::OnCBIESetEditText(WPARAM wParam,LPARAM lParam)
  433. {
  434. if (m_pwndCoolBar && m_pwndCoolBar->IsKindOf(RUNTIME_CLASS(CWebBrowserCoolBar)))
  435. {
  436. if (wParam)
  437. ((CWebBrowserCoolBar*)m_pwndCoolBar)->GetComboBox().GetEditCtrl()->SetWindowText((LPCTSTR)wParam);
  438. }
  439. return 1L;
  440. }
  441. ////////////////////////////////////////////////////////////////
  442. // CToolBarComboBox
  443. //
  444. BEGIN_MESSAGE_MAP(CToolBarComboBox, CIEShellComboBox)
  445. END_MESSAGE_MAP()
  446. //////////////////