📄 uiapp.cpp
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// You may use this source code, compile or redistribute it as part of your application
// for free. You cannot redistribute it as a part of a software development
// library without the agreement of the author. If the sources are
// distributed along with the application, you should leave the original
// copyright notes in the source code without any changes.
// This code can be used WITHOUT ANY WARRANTIES at your own risk.
//
// For the latest updates to this code, check this site:
// http://www.masmex.com
// after Sept 2000
//
// Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
//*******************************************************************************
#include "stdafx.h"
#include "UIFrameWnd.h"
#include "UIApp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CUIApp
IMPLEMENT_DYNAMIC(CUIApp,CWinApp)
BEGIN_MESSAGE_MAP(CUIApp, CWinApp)
//{{AFX_MSG_MAP(CUIApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUIApp construction
CUIApp::CUIApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
m_IDMyIcon = 0;
m_bMyClassRegistered = false;
}
CDocTemplate *CUIApp::GetFirstDocTemplate()
{
POSITION posTempl = GetFirstDocTemplatePosition();
CDocTemplate *pTempl = GetNextDocTemplate(posTempl);
ASSERT(pTempl);
return pTempl;
}
CFrameWnd *CUIApp::GetMainFrame(CWnd *pWnd)
{
if (pWnd)
return pWnd->GetParentFrame();
return (CFrameWnd*)m_pMainWnd;
}
CString CUIApp::GetRegAppKey()
{
CString sKey;
sKey += _T("Software");
sKey += _T("\\");
sKey += m_pszRegistryKey;
sKey += _T("\\");
sKey += m_pszProfileName;
sKey += _T("\\");
return sKey;
}
BOOL CUIApp::InitInstance()
{
if (!m_sMyClassName.IsEmpty() && !RegisterMyClass())
return FALSE;
return CWinApp::InitInstance();
}
int CUIApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
if(m_bMyClassRegistered)
::UnregisterClass(m_sMyClassName,AfxGetInstanceHandle());
return CWinApp::ExitInstance();
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CUIApp object
bool CUIApp::RegisterMyClass()
{
// Register our unique class name so only one instance can be started
//////////////////////////////////////////////////////////////
ASSERT(!m_sMyClassName.IsEmpty());
if (m_sMyClassName.IsEmpty())
return false;
//////////////////////////////////////////////////////////////
WNDCLASSEX wndcls;
memset(&wndcls, 0, sizeof(WNDCLASSEX));
wndcls.cbSize = sizeof(WNDCLASSEX);
wndcls.style = CS_DBLCLKS;// | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
if (m_IDMyIcon)
{
wndcls.hIcon = LoadIcon(m_IDMyIcon);
wndcls.hIconSm = (HICON)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(m_IDMyIcon),
IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
0);
if (wndcls.hIconSm == NULL)
{
ErrorMessage(_T("LoadImage failed"));
}
}
wndcls.hCursor = LoadStandardCursor(IDC_ARROW);
wndcls.hbrBackground = NULL; //(HBRUSH) (COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
// Specify our own class name for using FindWindow later to set focus to running app
wndcls.lpszClassName = m_sMyClassName;
WNDCLASSEX wndclsEx;
if (GetClassInfoEx(wndcls.hInstance, wndcls.lpszClassName, &wndclsEx))
{
// class already registered
return true;
}
// Register new class and exit if it fails
if(!::RegisterClassEx(&wndcls))
{
ErrorMessage(_T("Class Registration Failed"));
return false;
}
else
TRACE(_T("Window class %s was registered in CUIApp\n"),GetMyClass());
m_bMyClassRegistered = true;
return true;
}
BOOL CUIApp::FirstInstance()
{
ASSERT(!m_sMyClassName.IsEmpty());
if (m_sMyClassName.IsEmpty())
return TRUE;
CWnd *pWndPrev, *pWndChild;
// Determine if another window with our class name exists...
if (pWndPrev = CWnd::FindWindow(m_sMyClassName,NULL))
{
// if so, does it have any popups?
pWndChild = pWndPrev->GetLastActivePopup();
// If iconic, restore the main window
if (pWndPrev->IsIconic())
pWndPrev->ShowWindow(SW_RESTORE);
// Bring the main window or its popup to
// the foreground
pWndChild->SetForegroundWindow();
// and we are done activating the previous one.
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CUIApp initialization
void CUIApp::SetStatusBarText(UINT nPaneID,LPCTSTR Text,UINT nIconID)
{
if (m_pMainWnd == NULL)
{
TRACE1("Warning: '%s' SetStatusBarText called before main frame created!\n",Text);
return;
}
CUIFrameWnd *pMainFrame = (CUIFrameWnd*)m_pMainWnd;
if (nIconID)
pMainFrame->GetStatusBar().AddIcon(nPaneID,nIconID,false);
pMainFrame->GetStatusBar().SetText(nPaneID,Text,true);
}
void CUIApp::SetStatusBarText(LPCTSTR Text)
{
SetStatusBarText(0,Text);
}
void CUIApp::SetStatusBarText(UINT nPaneID,LPCTSTR Text,CView *pView,UINT nIconID)
{
if (m_pMainWnd == NULL)
return;
if (((CFrameWnd*)m_pMainWnd)->GetActiveView() == pView)
SetStatusBarText(nPaneID,Text,nIconID);
}
void CUIApp::SetStatusBarText(UINT nPaneID,UINT nResID,UINT nIconID)
{
CString str;
str.LoadString(nResID);
SetStatusBarText(nPaneID,str,nIconID);
}
void CUIApp::SetStatusBarIcon(UINT nPaneID,UINT nIconID,bool bAdd)
{
if (m_pMainWnd == NULL)
return;
CUIFrameWnd *pMainFrame = (CUIFrameWnd*)m_pMainWnd;
if (bAdd)
pMainFrame->GetStatusBar().AddIcon(nPaneID,nIconID);
else
pMainFrame->GetStatusBar().RemoveIcon(nPaneID,nIconID);
pMainFrame->GetStatusBar().RedrawWindow();
}
void CUIApp::SetStatusBarIdleMessage()
{
if (m_pMainWnd == NULL)
return;
CUIFrameWnd *pMainFrame = (CUIFrameWnd*)m_pMainWnd;
pMainFrame->GetStatusBar().RemoveAllIcons(0);
SetStatusBarText(0,AFX_IDS_IDLEMESSAGE);
}
CDocument *CUIApp::GetDocument()
{
CDocTemplate *pTempl = GetFirstDocTemplate();
POSITION posDoc = pTempl->GetFirstDocPosition();
CDocument *pDoc = pTempl->GetNextDoc(posDoc);
ASSERT(pDoc);
return pDoc;
}
CView *CUIApp::GetView(CRuntimeClass *pClass)
{
CDocTemplate *pTemplate = GetFirstDocTemplate();
POSITION posDoc = pTemplate->GetFirstDocPosition();
while (posDoc)
{
CDocument *pDoc = pTemplate->GetNextDoc(posDoc);
POSITION posView = pDoc->GetFirstViewPosition();
while (posView)
{
CView *pView = pDoc->GetNextView(posView);
if (pView && pView->IsKindOf(pClass))
return pView;
}
}
return NULL;
}
void CUIApp::ChangeProfile(LPCTSTR szRegistryKey,LPCTSTR szProfileName)
{
m_strOldProfileName = m_pszProfileName;
m_strOldRegistryKey = m_pszRegistryKey;
free((void*)m_pszRegistryKey);
m_pszRegistryKey = _tcsdup(szRegistryKey);
free((void*)m_pszProfileName);
m_pszProfileName = _tcsdup(szProfileName);
}
void CUIApp::RestoreProfile()
{
if (!m_strOldProfileName.IsEmpty())
{
free((void*)m_pszProfileName);
m_pszProfileName = _tcsdup(m_strOldProfileName);
}
if (!m_strOldRegistryKey.IsEmpty())
{
free((void*)m_pszRegistryKey);
m_pszRegistryKey = _tcsdup(m_strOldRegistryKey);
}
}
/////////////////////////////////////////////////////////////////////////////
// CAppReg
// Tricks MFC into using another application key
// useful if in HKEY_CURRENT_USER
CAppReg::CAppReg(CWinApp *pApp,LPCTSTR szRegistryKey,LPCTSTR szProfileName)
{
ASSERT(pApp);
m_pApp = (CUIApp*)pApp;
m_pApp->ChangeProfile(szRegistryKey,szProfileName);
}
CAppReg::~CAppReg()
{
ASSERT(m_pApp);
m_pApp->RestoreProfile();
}
//static
bool CUIApp::COMMessage(HRESULT hr,UINT nID)
{
CString sMess;
sMess.LoadString(nID);
return COMMessage(hr,sMess);
}
bool CUIApp::COMMessage(HRESULT hr,LPCTSTR szText)
{
if (FAILED(hr))
{
ErrorMessage(szText,(DWORD)hr);
return false;
}
return true;
}
void CUIApp::ErrorMessage(UINT nID,DWORD dwError)
{
CString sMess;
sMess.LoadString(nID);
ErrorMessage(sMess);
}
void CUIApp::ErrorMessage(LPCTSTR szText,DWORD dwError)
{
bool bError=true;
if (dwError == 0)
{
dwError = GetLastError();
bError = true;
}
else
{
bError = FAILED(dwError);
}
LPVOID lpMsgBuf=NULL;
if (bError)
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
}
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
CString sMess;
if (lpMsgBuf)
{
sMess = (LPCTSTR)lpMsgBuf;
sMess += _T("\n");
LocalFree( lpMsgBuf );
}
if (szText)
{
sMess += szText;
}
AfxMessageBox(sMess, MB_ICONSTOP );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -