DragonNest/Third/XTToolkitPro/Samples/Utilities/StylerBrowser/Styler.cpp
2024-12-19 09:48:26 +08:00

282 lines
6.6 KiB
C++

// Styler.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "Styler.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "StylerDoc.h"
#include "StylerView.h"
#include "FilterDialog.h"
#include "PopupFilter.h"
#include "CWebBrowser2.h"
#include "MouseManager.h"
#include "PageSearch.h"
//#include "CustSite.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CStylerApp
BEGIN_MESSAGE_MAP(CStylerApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
// CStylerApp construction
CStylerApp::CStylerApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
// The one and only CStylerApp object
CStylerApp theApp;
// CStylerApp initialization
BOOL CStylerApp::InitInstance()
{
// InitCommonControls() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual xtps. Otherwise, any window creation will fail.
InitCommonControls();
CWinApp::InitInstance();
// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
CXTPWinDwmWrapper().SetProcessDPIAware();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization
SetRegistryKey(_T("Styler"));
LoadStdProfileSettings(4); // Load standard INI file options (including MRU)
CFilterDialog::LoadFilterList();
CPopupFilter::LoadFilterList();
CStylerView::Load();
CMainFrame::Load();
CPageSearch::Load();
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CStylerDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CStylerView));
AddDocTemplate(pDocTemplate);
// call DragAcceptFiles only if there's a suffix
// In an MDI app, this should occur immediately after setting m_pMainWnd
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!OneInstance(cmdInfo))
return FALSE;
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew &&
(CMainFrame::m_nStartup == STARTUP_NOTHING || CMainFrame::m_nStartup == STARTUP_LASTVISITED))
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
// Dispatch commands specified on the command line. Will return FALSE if
// app was launched with /RegServer, /Register, /Unregserver or /Unregister.
if (!ProcessShellCommand(cmdInfo))
return FALSE;
if (!CMouseManager::Load())
{
ACCEL accel = {FCONTROL, 0, ID_FILE_CLOSE};
CMouseManager::AddCommand(WM_LBUTTONDOWN, accel, MOUSE_AREA_TAB);
}
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNothing && CMainFrame::m_nStartup == STARTUP_LASTVISITED)
((CMainFrame*)pMainFrame)->OpenLastVisited();
// The main window has been initialized, so show and update it
//pMainFrame->ShowWindow(m_nCmdShow/*, CMainFrame::m_bRestoreWindowPos*/);
CWindowPlacement(pMainFrame, _T("Main Frame")).ShowWindow(m_nCmdShow, CMainFrame::m_bRestoreWindowPos);
pMainFrame->UpdateWindow();
m_pMainWnd->DragAcceptFiles();
return TRUE;
}
BOOL CStylerApp::ProcessShellCommand(CCommandLineInfo& cmdInfo)
{
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen)
{
CString strURL = cmdInfo.m_strFileName;
if(strURL.Right(4).CompareNoCase(_T(".url")) == 0)
{
TCHAR buf[2048];
::GetPrivateProfileString(_T("InternetShortcut"), _T("URL"),
_T(""), buf, 2048, strURL);
OpenWindow(buf);
return TRUE;
}
if (strURL.Find(_T("://")) != -1)
{
OpenWindow(strURL);
return TRUE;
}
}
return CWinApp::ProcessShellCommand(cmdInfo);
}
BOOL CStylerApp::ExitInstance()
{
CStylerView::Save();
CMainFrame::Save();
CMouseManager::Save();
CPageSearch::Save();
return CWinApp::ExitInstance();
}
BOOL CStylerApp::OneInstance(CCommandLineInfo& cmdInfo)
{
HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszAppName);
if (GetLastError() == ERROR_ALREADY_EXISTS && CMainFrame::m_bOneInstance)
{
CloseHandle(hSem);
HWND hWndPrevious = ::FindWindow(_T("StylerMainWindow"), NULL);
if (hWndPrevious)
{
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen )
{
//if (::GetLastActivePopup(hWndPrevious) == hWndPrevious)
{
LPTSTR lpData;
//mutex
HANDLE hMutex = CreateMutex(NULL, TRUE, _T("StylerMutex"));
WaitForSingleObject(hMutex, INFINITE);
HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE, 0, 2560, _T("STYLERSHARE"));
if (hMapping == NULL)
{
TRACE(_T("App:Fail to create share memory!"));
}
else
{
lpData = (LPTSTR) MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if (lpData == NULL)
{
TRACE(_T("App:MapViewOfFile Fail"));
}
else
{
#if (_MSC_VER > 1310) // VS2005
_stprintf_s(lpData, 2560, _T("%s"), cmdInfo.m_strFileName);
#else
_stprintf(lpData, _T("%s"), cmdInfo.m_strFileName);
#endif
::SendMessage(hWndPrevious,WM_USER_SHELL_OPEN,NULL,NULL);
UnmapViewOfFile(lpData);
}
CloseHandle(hMapping);
}
ReleaseMutex(hMutex);
}
}
if (::IsIconic(hWndPrevious))
::ShowWindow(hWndPrevious,SW_RESTORE);
::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
return FALSE;
}
}
return TRUE;
}
// App command to run the dialog
void CStylerApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
// CStylerApp message handlers
CString GetModuleDir()
{
TCHAR lpszModule[MAX_PATH];
if (!GetModuleFileName(AfxGetResourceHandle(), lpszModule, MAX_PATH))
return _T("");
CString strPath(lpszModule);
int nIndex = strPath.ReverseFind('\\');
if (nIndex != -1 && strPath.GetLength() != 3)
return strPath.Left(nIndex + 1) + _T("Config\\");
return _T("Config\\");
}