📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "test2.h"
#include "test2Doc.h"
#include "MainFrm.h"
#include "server.h"
#include "group.h"
#include "test2View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// Registry entry names:
static LPCTSTR lpszMainWindow = _T("Main Window");
static LPCTSTR lpszX = _T("x");
static LPCTSTR lpszY = _T("y");
static LPCTSTR lpszCX = _T("cx");
static LPCTSTR lpszCY = _T("cy");
static LPCTSTR lpszState = _T("State");
static LPCTSTR lpszGroups = _T("Groups");
static LPCTSTR lpszEvents = _T("Events");
static LPCTSTR lpszToolbar = _T("Toolbar");
static LPCTSTR lpszStatusbar = _T("Status Bar");
// Status bar string resources:
#define ID_HELPTEXT 0
#define ID_ITEMCOUNT 1
static UINT auIDs[] =
{
ID_HELPTEXT,
ID_ITEMCOUNT,
};
// For window update timer:
#define STATUSUPDATETIMER 1
#define STATUSUPDATEINTERVAL 250
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_TIMER()
/*ON_UPDATE_COMMAND_UI (ID_APP_ABOUT, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_APP_EXIT, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_EDIT_DELETE, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_NEW, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_OPEN, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_SAVE, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_SAVE_AS, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE1, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE2, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE3, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE4, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE5, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE6, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE7, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE8, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE9, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE10, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE11, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE12, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE13, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE14, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE15, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_FILE_MRU_FILE16, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_SET_ACTIVE, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_SET_INACTIVE, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_ASYNC20_READ_DEVICE, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_ASYNC20_REFRESH_CACHE, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_ASYNC20_REFRESH_DEVICE, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_GET_ERROR_STRING, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_GET_GROUP_BY_NAME, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_ENUMERATE_GROUPS, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_CONNECT, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_DISCONNECT, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_RECONNECT, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_EXPORT_CSV, OnUpdateCmdUI)
ON_UPDATE_COMMAND_UI (ID_TOOLS_IMPORT_CSV, OnUpdateCmdUI)*/
//}}AFX_MSG_MAP
//ON_UPDATE_COMMAND_UI_RANGE (ID_EDIT_NEWSERVER, ID_EDIT_DELETE, OnUpdateCmdUI)
ON_MESSAGE (UM_SERVER_SHUTDOWN, OnServerShutdownRequest)
ON_MESSAGE (UM_SELECT_GROUP, OnSelectGroup)
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_cnItems = 0;
m_strIdleStatusText.LoadString (AFX_IDS_IDLEMESSAGE);
m_strStatusText = m_strIdleStatusText;
m_bForceStatusText = false;
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\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: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
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
void CMainFrame::OnClose()
{
CTest2Doc *pDoc = (CTest2Doc *) GetActiveDocument ();
ASSERT (pDoc);
// Only allow a close if the document is not locked (i.e. some other
// thread is using document and needs it to stay alive until they are
// done:
if (!pDoc->IsLocked ())
{
// Save main window settings in registry so it will appear the
// same next time application is started:
//SaveSettings ();
// Perform default processing:
CFrameWnd::OnClose ();
}
else
{
// Don't allow close. Sound a beep to warn user:
MessageBeep ((DWORD)-1);
return;
}
//CFrameWnd::OnClose();
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (CFrameWnd::OnCmdMsg (nID, nCode, pExtra, pHandlerInfo))
return (TRUE);
// Otherwise pass it onto the document for routing to all inactive views.
// If one of these views processes the message, return TRUE:
CTest2Doc *pDoc = (CTest2Doc *) GetActiveDocument ();
if (pDoc != NULL)
{
if (pDoc->RouteCmdMsg (GetActiveView (), nID, nCode, pExtra, pHandlerInfo))
return (TRUE);
}
// If we make it here, message not processed. Return FALSE to indicate
// this:
return (FALSE);
//return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
void CMainFrame::OnDestroy()
{
KillTimer (STATUSUPDATETIMER);
CFrameWnd::OnDestroy ();
}
// **************************************************************************
// OnServerShutdownRequest ()
//
// Description:
// Handles notification that a server has been shutdown.
//
// Parameters:
// WPARAM wParam Not used.
// LPARAM lParam Pointer to server object.
//
// Returns:
// long - 0.
// **************************************************************************
long CMainFrame::OnServerShutdownRequest (WPARAM wParam, LPARAM lParam)
{
// Get pointer to our document:
CTest2Doc *pDoc = (CTest2Doc *) GetActiveDocument ();
ASSERT (pDoc != NULL);
// Notify the document of the shutdown request:
pDoc->OnServerShutdown ((CKServer *) lParam);
return (0);
}
// **************************************************************************
// OnSelectGroup
//
// Description:
// Handles notification that a group should be selected.
//
// Parameters:
// WPARAM wParam Not used.
// LPARAM lParam Pointer to group object.
//
// Returns:
// long - 0.
// **************************************************************************
long CMainFrame::OnSelectGroup (WPARAM wParam, LPARAM lParam)
{
// Get pointer to our document:
CTest2Doc *pDoc = (CTest2Doc *) GetActiveDocument ();
ASSERT (pDoc != NULL);
// Notify document to update all views due to a new group selection.
// Pointer to selected group object is passed along as lParam:
pDoc->UpdateAllViews (NULL, HINT_SELECT_GROUP, (CObject *)lParam);
return (0);
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
if (nIDEvent == STATUSUPDATETIMER)
{
// Create a CSafeLock to make this object thread safe. Our critical
// section gets locked here, and will automatically be unlocked when the
// CSafeLock goes out of scope.
CSafeLock cs (&m_csStatus);
static TCHAR szBuff [128];
static CString strItemCount;
static int cnItems = -1;
// Only update on item change:
if (cnItems != m_cnItems)
{
cnItems = m_cnItems;
// Initialize string once:
if (strItemCount.IsEmpty ())
strItemCount.LoadString (IDS_ITEMCOUNT);
// Update item count string:
wsprintf (szBuff, strItemCount, cnItems);
// Calculate new size for the pane:
CClientDC dc (NULL);
HFONT hFont = (HFONT)m_cStatusBar.SendMessage (WM_GETFONT);
HGDIOBJ hOldFont = NULL;
if (hFont != NULL)
hOldFont = dc.SelectObject (hFont);
CSize sz = dc.GetTextExtent (szBuff, lstrlen (szBuff));
if (hOldFont != NULL)
dc.SelectObject (hOldFont);
// Update the width:
m_cStatusBar.SetPaneInfo (ID_ITEMCOUNT, auIDs[ID_ITEMCOUNT], SBPS_NORMAL, sz.cx);
// Update pane text:
m_cStatusBar.SetPaneText (ID_ITEMCOUNT, szBuff, true);
}
// Reset status bar text if force update flag is set or if
// current text is not "Idle"
if (m_bForceStatusText || m_strIdleStatusText != m_strStatusText)
{
m_cStatusBar.SetPaneText (ID_HELPTEXT, m_strStatusText, true);
m_bForceStatusText = false;
}
}
// Perform default processing for all other timer event types:
CFrameWnd::OnTimer (nIDEvent);
}
void CMainFrame::SetStatusBarText (LPCTSTR lpszText)
{
// Create a CSafeLock to make this object thread safe. Our critical
// section gets locked here, and will automatically be unlocked when the
// CSafeLock goes out of scope.
CSafeLock cs (&m_csStatus);
// Store the text:
m_strStatusText = lpszText;
// Set flag to force a status bar update (to be processed in OnTimer()):
m_bForceStatusText = true;
}
void CMainFrame::UpdateItemCount (int nDelta)
{
// Create a CSafeLock to make this object thread safe. Our critical
// section gets locked here, and will automatically be unlocked when the
// CSafeLock goes out of scope.
CSafeLock cs (&m_csStatus);
// Update the item count:
m_cnItems += nDelta;
ASSERT (m_cnItems >= 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -