gusucode.com > VC_C++源码,界面编程,网页爬虫源码程序 > VC_C++源码,界面编程,网页爬虫源码程序/code/webpageloader_SourceCode/MainFrm.cpp

    // MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "WebPageLoader.h"

#include "MainFrm.h"
#include "Doc.h"

#include "SessionView.h"
#include "LogView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define TIMER_ID 11


/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   //{{AFX_MSG_MAP(CMainFrame)
   ON_WM_CREATE()
   ON_WM_CLOSE()
   ON_WM_TIMER()
	ON_COMMAND(ID_TOOL_WEBPAGEMAKE, OnToolWebpagemake)
	ON_UPDATE_COMMAND_UI(ID_TOOL_WEBPAGEMAKE, OnUpdateToolWebpagemake)
	//}}AFX_MSG_MAP
   // Global help commands
   ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_LOG, ID_VIEW_FILES, OnUpdateViewStyles)
   ON_COMMAND_RANGE(ID_VIEW_LOG, ID_VIEW_FILES, OnViewStyle)
   //
   ON_COMMAND(ID_HELP, CFrameWnd::OnHelp)
   ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp)
   ON_COMMAND(ID_DEFAULT_HELP, CFrameWnd::OnHelpFinder)
   ON_MESSAGE(WM_POWERBROADCAST, OnPowerBroadcast) 
   // Custom
   ON_MESSAGE(WM_SCHEDULE, OnSchedule) 
   ON_MESSAGE(WM_CREATEITEMS, OnCreateItems) 
   ON_MESSAGE(WM_CREATENODES, OnCreateNodes) 
   ON_MESSAGE(WM_REFRESHITEMS, OnRefreshItems) 
   ON_MESSAGE(WM_REFRESHNODES, OnRefreshNodes) 
END_MESSAGE_MAP()

static LPCTSTR szSection = _T("Settings");

static UINT indicators[] =
{
   ID_SEPARATOR,           // status line indicator
   ID_SEPARATOR,
   ID_SEPARATOR,
   ID_SEPARATOR,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1;
   
   if (!m_wndToolBar.CreateEx(this) ||
      !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
   {
      TRACE0("Failed to create toolbar\n");
      return -1;      // fail to create
   }

   if (!m_wndReBar.Create(this) ||
      !m_wndReBar.AddBar(&m_wndToolBar) )
   {
      TRACE0("Failed to create rebar\n");
      return -1;      // fail to create
   }

   if (!m_wndStatusBar.Create(this) ||
      !m_wndStatusBar.SetIndicators(indicators,
        sizeof(indicators)/sizeof(UINT)))
   {
      TRACE0("Failed to create status bar\n");
      return -1;      // fail to create
   }
   UINT id;
   UINT style;
   int xsize;
   m_wndStatusBar.GetPaneInfo(1,id,style,xsize);
   m_wndStatusBar.SetPaneInfo(1,id,SBPS_NOBORDERS,10);
   m_wndStatusBar.GetPaneInfo(2,id,style,xsize);
   m_wndStatusBar.SetPaneInfo(2,id,style,218);
   m_wndStatusBar.SetPaneInfo(3,id,SBPS_NOBORDERS,10);

   m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
      CBRS_TOOLTIPS | CBRS_FLYBY);

   CRect rc( 0,0, 50,20 );
   m_wndClipboard.CreateEx(0,
         AfxRegisterWndClass(
            0,
            ::LoadCursor(NULL, IDC_ARROW),
            (HBRUSH)(COLOR_WINDOW + 1)),
         _T("WebPageLoader Clipboard listener"),
         WS_POPUP,
         rc,
         this,
         0);

   // Resize window
   CWinApp *app = AfxGetApp();
   int x,y,width,height;
   CString s;
   s = app->GetProfileString(szSection, _T("Window"), _T("30,30,600,300"));
   ::sscanf( s, _T("%d,%d,%d,%d"), &x, &y, &width, &height );
   SetWindowPos(NULL, x,y,width,height, 0);

   SetTimer(TIMER_ID, 5000, NULL);

    return 0;
}

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
   CCreateContext* pContext)
{
   // create splitter window
   if (!m_wndSplitter.CreateStatic(this, 2, 1))
      return FALSE;

   CWinApp *app = AfxGetApp();
   int split_cy = app->GetProfileInt(szSection, _T("SplitterHeight"), 100);

   if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSessionView), CSize(100, split_cy), pContext) ||
      !m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CLogView), CSize(100, 100), pContext))
   {
      m_wndSplitter.DestroyWindow();
      return FALSE;
   }

   return TRUE;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
   if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE;
   cs.style &= (~FWS_ADDTOTITLE);
   return TRUE;
}


void CMainFrame::OnClose() 
{
   CDoc *pDoc = (CDoc *)GetActiveDocument();

   if( pDoc->m_ThreadManager.HasRunningThreads() ) {
      if( IDNO == AfxMessageBox(IDS_STILL_RUNNING, MB_YESNO | MB_ICONQUESTION) ) return;
   }
   pDoc->m_ThreadManager.Close();

   // Write window position and size
   if( !IsIconic() ) {
      CWinApp *app = AfxGetApp();
      CString s;
      CRect rc;
      GetWindowRect(&rc);
      s.Format(_T("%d,%d,%d,%d"), rc.left,rc.top,rc.Width(),rc.Height());
      app->WriteProfileString(szSection, _T("Window"), s);
   }
   
   CFrameWnd::OnClose();
}


/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
   CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
   CFrameWnd::Dump(dc);
}

#endif //_DEBUG


/////////////////////////////////////////////////////////////////////////////
// Helpers

CSessionView* CMainFrame::GetTopPane()
{
   CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
   CSessionView* pView = DYNAMIC_DOWNCAST(CSessionView, pWnd);
   return pView;
}

CLogView* CMainFrame::GetBottomPane()
{
   CWnd* pWnd = m_wndSplitter.GetPane(1, 0);
   CLogView* pView = DYNAMIC_DOWNCAST(CLogView, pWnd);
   return pView;
}


/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

LRESULT CMainFrame::OnPowerBroadcast(WPARAM wParam, LPARAM lParam)
{
   if( wParam == PBT_APMQUERYSUSPEND ) {
      CDoc *pDoc = (CDoc *)GetActiveDocument();
      if( pDoc->m_ThreadManager.m_nActiveThreads>0 ) return BROADCAST_QUERY_DENY;
   }
   return CMainFrame::Default();
} 

LRESULT CMainFrame::OnSchedule(WPARAM wParam, LPARAM lParam)
{
   OnTimer(TIMER_ID);
   return 0;
} 

void CMainFrame::OnTimer(UINT nIDEvent) 
{
   if( nIDEvent==TIMER_ID ) {
      CDoc *pDoc = (CDoc *)GetActiveDocument();
      ASSERT_KINDOF(CDoc,pDoc);
      pDoc->ThreadSchedule();

      // The file download status needs regular updates.
      // (It shows how many bytes downloaded)
      if( GetBottomPane()->m_dwStyle == ID_VIEW_STATUS ) {
         GetBottomPane()->RefreshItems();
      };
   };

   CFrameWnd::OnTimer(nIDEvent);
}

LRESULT CMainFrame::OnCreateItems(WPARAM wParam, LPARAM lParam)
{
   // Remove queued messages
   MSG msg = { 0 }; 
   while( ::PeekMessage(&msg, m_hWnd, WM_CREATEITEMS, WM_CREATEITEMS, PM_REMOVE) ) /* */;
   // Update
   GetTopPane()->CreateItems();
   return (LRESULT)0;
} 

LRESULT CMainFrame::OnCreateNodes(WPARAM wParam, LPARAM lParam)
{
   // Remove queued messages
   MSG msg = { 0 }; 
   while( ::PeekMessage(&msg, m_hWnd, WM_CREATENODES, WM_CREATENODES, PM_REMOVE) ) /* */;
   // Update
   GetBottomPane()->CreateItems();
   return (LRESULT)0;
};

LRESULT CMainFrame::OnRefreshItems(WPARAM wParam, LPARAM lParam)
{
   // Remove queued messages
   MSG msg = { 0 }; 
   while( ::PeekMessage(&msg, m_hWnd, WM_REFRESHITEMS, WM_REFRESHITEMS, PM_REMOVE) ) /* */;
   // Update
   GetTopPane()->RefreshItems();  
   return (LRESULT)0;
} 

LRESULT CMainFrame::OnRefreshNodes(WPARAM wParam, LPARAM lParam)
{
   // Remove queued messages
   BOOL bRefresh = (GetTopPane()->GetSelectedSessionID()==(LONG)wParam);
   MSG msg = { 0 }; 
   while( ::PeekMessage(&msg, m_hWnd, WM_REFRESHITEMS, WM_REFRESHITEMS, PM_REMOVE) ) bRefresh |= (GetTopPane()->GetSelectedSessionID()==(LONG)msg.wParam);
   // wParam must be the SessionID of the currently selected
   // Session or if we saw multiple refresh we just update stuff!
   if( bRefresh ) GetBottomPane()->RefreshItems();
   return (LRESULT)0;
};

void CMainFrame::OnUpdateViewStyles(CCmdUI* pCmdUI)
{
   CLogView *pView = GetBottomPane();
   if( pView == NULL )
      pCmdUI->Enable(FALSE);
   else {
      pCmdUI->Enable();
      DWORD dwStyle = pView->m_dwStyle;
      BOOL bChecked = FALSE;
      switch( pCmdUI->m_nID ) {
      case ID_VIEW_LOG:
         bChecked = (dwStyle == ID_VIEW_LOG);
         break;
      case ID_VIEW_STATUS:
         bChecked = (dwStyle == ID_VIEW_STATUS);
         break;
      case ID_VIEW_FILES:
         bChecked = (dwStyle == ID_VIEW_FILES);
         break;
      default:
         bChecked = FALSE;
         break;
      }
      pCmdUI->SetRadio(bChecked ? 1 : 0);
   }
}

void CMainFrame::OnViewStyle(UINT nCommandID)
{
   CLogView* pView = GetBottomPane();
   if (pView == NULL) return;
   pView->m_dwStyle = nCommandID;
   OnCreateNodes(0,0);
   m_wndSplitter.SetActivePane(0,0);
};

void CMainFrame::OnToolWebpagemake() 
{
   CString sFilename = BfxGetAppPath() + _T("WebPageMaker.exe");
   ::ShellExecute(m_hWnd, "open", sFilename, NULL, NULL, SW_SHOW);
}

void CMainFrame::OnUpdateToolWebpagemake(CCmdUI* pCmdUI) 
{
   static bool s_bUpdated = false;
   static BOOL s_bEnabled = FALSE;
   if( !s_bUpdated ) {
      CString sFilename = BfxGetAppPath() + _T("WebPageMaker.exe");
      s_bEnabled = ::GetFileAttributes(sFilename) != (DWORD) -1;
      s_bUpdated = true;
   }
   pCmdUI->Enable(s_bEnabled);
}