Click here to Skip to main content
15,886,565 members
Articles / Desktop Programming / MFC

Remote Processes and Machine control of Windows NT based systems (2000/XP)

Rate me:
Please Sign up or sign in to vote.
4.80/5 (35 votes)
1 Apr 2012CPOL5 min read 156.9K   8.9K   103  
Control certain aspects of machines sitting remotely, without having to install and trigger an application on the remote machine.
// MainFrame.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "RemoteAdmin.h"
#include "MainFrame.h"
#include "MachineView.h"
#include "RemoteAdminView.h"
#include "RemoteAdminDoc.h"
#include "GlobalMFCHelperFunc.h"
#include "TimeSettings.h"

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

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

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_CLOSE()
	ON_COMMAND(ID_SETTINGS_TIMERS, OnSettingsTimers)
	ON_COMMAND(ID_FILE_ADD_MACHINE, OnAddMachine)
	ON_COMMAND(ID_MACHINEOPTIONS_ADD_MACHINE, OnAddMachine)
	ON_COMMAND(ID_MACHINEOPTIONS_DELETE_MACHINE, OnDeleteMachine)
	ON_COMMAND(ID_SETTINGS_WINDOW_ALWAYSONTOP, OnWindowAlwaysOnTop)
    ON_UPDATE_COMMAND_UI(ID_SETTINGS_WINDOW_ALWAYSONTOP, OnUpdateWindowAlwaysOnTop)
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnUpdateViewStyles)
	ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnViewStyle)
END_MESSAGE_MAP()

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

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

CMainFrame::CMainFrame()
{
	m_bWindowOnTop = FALSE;
}

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
	}

    // Commented by Prateek Kaul on May 21, 2003
    // Currently no dialog bar required
    /*
	if (!m_wndDlgBar.Create(this, IDR_MAINFRAME, 
		CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR))
	{
		TRACE0("Failed to create dialogbar\n");
		return -1;		// fail to create
	}
    */
    
	if (!m_wndReBar.Create(this) ||
		!m_wndReBar.AddBar(&m_wndToolBar) /*||
		!m_wndReBar.AddBar(&m_wndDlgBar)*/)
	{
		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
	}

	// TODO: Remove this if you don't want tool tips
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY);
    
    // By default keep the window on top, no matter what
    if (m_bWindowOnTop != FALSE)
    {
        this->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    }

	//CRemoteAdminApp* pApp = static_cast<CRemoteAdminApp*>(::AfxGetApp());
	(MFC_DocView::GetApp())->CreateAndShowSystemTrayIcon();
	
	return 0;
}

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
	CCreateContext* pContext)
{

    CRect rcClient;
    GetClientRect(rcClient);

    // Machine view's width is 25% of the mainframe's client rectangle
    int nMachineViewWidth  = 0.25 * rcClient.Width();
    int nMachineViewHeight = rcClient.Height();


    // The RemoteAdmin view's width is the remaining
    int nRemoteAdminViewWidth  = rcClient.Width() - nMachineViewWidth;
    int nRemoteAdminViewHeight = rcClient.Height();
	
    // create splitter window
	if (!m_wndSplitter.CreateStatic(this, 1, 2))
		return FALSE;

	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMachineView), CSize(nMachineViewWidth, nMachineViewHeight), pContext) ||
		!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRemoteAdminView), CSize(nRemoteAdminViewWidth, nRemoteAdminViewHeight), pContext))
	{
		m_wndSplitter.DestroyWindow();
		return FALSE;
	}

	
	return TRUE;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

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

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

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

#endif //_DEBUG

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

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

void CMainFrame::OnUpdateViewStyles(CCmdUI* pCmdUI)
{
	// TODO: customize or extend this code to handle choices on the
	// View menu.

	CRemoteAdminView* pView = GetRightPane(); 

	// if the right-hand pane hasn't been created or isn't a view,
	// disable commands in our range

	if (pView == NULL)
		pCmdUI->Enable(FALSE);
	else
	{
		DWORD dwStyle = pView->GetStyle() & LVS_TYPEMASK;

		// if the command is ID_VIEW_LINEUP, only enable command
		// when we're in LVS_ICON or LVS_SMALLICON mode

		if (pCmdUI->m_nID == ID_VIEW_LINEUP)
		{
			if (dwStyle == LVS_ICON || dwStyle == LVS_SMALLICON)
				pCmdUI->Enable();
			else
				pCmdUI->Enable(FALSE);
		}
		else
		{
			// otherwise, use dots to reflect the style of the view
			pCmdUI->Enable();
			BOOL bChecked = FALSE;

			switch (pCmdUI->m_nID)
			{
			case ID_VIEW_DETAILS:
				bChecked = (dwStyle == LVS_REPORT);
				break;

			case ID_VIEW_SMALLICON:
				bChecked = (dwStyle == LVS_SMALLICON);
				break;

			case ID_VIEW_LARGEICON:
				bChecked = (dwStyle == LVS_ICON);
				break;

			case ID_VIEW_LIST:
				bChecked = (dwStyle == LVS_LIST);
				break;

			default:
				bChecked = FALSE;
				break;
			}

			pCmdUI->SetRadio(bChecked ? 1 : 0);
		}
	}
}


void CMainFrame::OnViewStyle(UINT nCommandID)
{
	// TODO: customize or extend this code to handle choices on the
	// View menu.
	CRemoteAdminView* pView = GetRightPane();

	// if the right-hand pane has been created and is a CRemoteAdminView,
	// process the menu commands...
	if (pView != NULL)
	{
		DWORD dwStyle = -1;

		switch (nCommandID)
		{
		case ID_VIEW_LINEUP:
			{
				// ask the list control to snap to grid
				CListCtrl& refListCtrl = pView->GetListCtrl();
				refListCtrl.Arrange(LVA_SNAPTOGRID);
			}
			break;

		// other commands change the style on the list control
		case ID_VIEW_DETAILS:
			dwStyle = LVS_REPORT;
			break;

		case ID_VIEW_SMALLICON:
			dwStyle = LVS_SMALLICON;
			break;

		case ID_VIEW_LARGEICON:
			dwStyle = LVS_ICON;
			break;

		case ID_VIEW_LIST:
			dwStyle = LVS_LIST;
			break;
		}

		// change the style; window will repaint automatically
		if (dwStyle != -1)
			pView->ModifyStyle(LVS_TYPEMASK, dwStyle);
	}
}

void CMainFrame::OnAddMachine() 
{
    (MFC_DocView::GetMachineView())->OnAddMachine();
}

void CMainFrame::ActivateFrame(int nCmdShow) 
{
	// Show full screen without flicker
    CFrameWnd::ActivateFrame(SW_MAXIMIZE);
}

void CMainFrame::OnDeleteMachine() 
{
    MFC_DocView::GetMachineView()->OnDeleteMachine();	
}

void CMainFrame::OnClose() 
{
    extern BOOL g_bUpdateProcessList;
	g_bUpdateProcessList = FALSE;
	
	CFrameWnd::OnClose();
}

void CMainFrame::OnSettingsTimers() 
{
    extern UINT g_iShutdownDelay;
    extern UINT g_iUpdateProcessDelay;

	CTimeSettingsDlg dlgTimeSettings;

    // Convert from milli secs to secs for display purposes
    dlgTimeSettings.m_iProcessRefresh = g_iUpdateProcessDelay/1000.0;
    dlgTimeSettings.m_iShutdownDelay  = g_iShutdownDelay/1000.0;

    if (dlgTimeSettings.DoModal() == IDOK)
    {
        // Convert to milli secs from secs for actual calculation purposes
        g_iShutdownDelay      = dlgTimeSettings.m_iShutdownDelay  * 1000;
        g_iUpdateProcessDelay = dlgTimeSettings.m_iProcessRefresh * 1000;
    }
}

void CMainFrame::OnWindowAlwaysOnTop() 
{
    // Keep on top no matter what
    if (m_bWindowOnTop == FALSE)
    {
        this->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
        m_bWindowOnTop = TRUE;
    }
    else
    {
        this->SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
        m_bWindowOnTop = FALSE;
    }
}


void CMainFrame::OnUpdateWindowAlwaysOnTop(CCmdUI* pCmdUI)
{
    if (m_bWindowOnTop == TRUE)
    {
        pCmdUI->SetCheck(TRUE);
    }
    else
    {
        pCmdUI->SetCheck(FALSE);
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions