TextViewNG.cpp
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:8k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2001,2002,2003 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: TextViewNG.cpp,v 1.40.2.6 2003/10/12 15:10:33 mike Exp $
  29.  * 
  30.  */
  31. #include <afxcmn.h>
  32. #include <stdarg.h>
  33. #include <afxext.h>
  34. #include "resource.h"
  35. #include "config.h"
  36. #include "ptr.h"
  37. #include "RFile.h"
  38. #include "TextViewNG.h"
  39. #include "TVFrame.h"
  40. #include "Keys.h"
  41. #include "Unicode.h"
  42. #include "XListBox.h"
  43. #ifdef _DEBUG
  44. #define new DEBUG_NEW
  45. #undef THIS_FILE
  46. static char THIS_FILE[] = __FILE__;
  47. #endif
  48. // ugly hacks
  49. #ifndef WS_OVERLAPPEDWINDOW
  50. #define WS_OVERLAPPEDWINDOW 0
  51. #endif
  52. #define IPCCLASS  _T("HaaliReaderIPC")
  53. #define IPCLEN   (sizeof(IPCCLASS)/sizeof(TCHAR))
  54. #define REGNAME _T("Haali")
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CTVApp
  57. BEGIN_MESSAGE_MAP(CTVApp, CWinApp)
  58. //{{AFX_MSG_MAP(CTVApp)
  59. //}}AFX_MSG_MAP
  60. // Standard file based document commands
  61. END_MESSAGE_MAP()
  62. /////////////////////////////////////////////////////////////////////////////
  63. // CTVApp construction
  64. CTVApp::CTVApp()
  65. : CWinApp()
  66. {
  67. }
  68. /////////////////////////////////////////////////////////////////////////////
  69. // The one and only CTVApp object
  70. static CTVApp theApp;
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CTVApp initialization
  73. BOOL CTVApp::InitInstance()
  74. {
  75.   // init XListBox control
  76.   XLB_Init();
  77.   SetRegistryKey(REGNAME);
  78.   RFile::InitBufSize();
  79.   Keys::InitKeys();
  80.   CTVFrame* pFrame = new CTVFrame();
  81.   m_pMainWnd = pFrame;
  82.   pFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,NULL,NULL);
  83. #ifndef _WIN32_WCE
  84.   pFrame->ModifyStyleEx(WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE,0);
  85.   pFrame->SetWindowPos(NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED);
  86. #endif
  87.   pFrame->SetWindowText(_T("Haali Reader"));
  88.   pFrame->InitWindowPos(m_nCmdShow);
  89.   pFrame->UpdateWindow();
  90.   // create a dummy window
  91.   WNDCLASS    wc;
  92.   memset(&wc,0,sizeof(wc));
  93.   wc.hInstance=AfxGetInstanceHandle();
  94.   wc.lpszClassName=IPCCLASS;
  95.   wc.lpfnWndProc=DefWindowProc;
  96.   RegisterClass(&wc);
  97.   TCHAR szExeName[MAX_PATH];
  98.   ::GetModuleFileName(NULL,szExeName,MAX_PATH);
  99.   HWND hWnd=CreateWindow(IPCCLASS,szExeName,WS_POPUP,0,0,1,1,pFrame->m_hWnd,NULL,
  100.     wc.hInstance,NULL);
  101.   pFrame->PostMessage(WM_COMMAND,ID_INIT);
  102.   return TRUE;
  103. }
  104. void CTVApp::Barf(const TCHAR *format,...) {
  105.   TCHAR     buffer[2048];
  106.   va_list   ap;
  107.   va_start  (ap,format);
  108.   _vsntprintf(buffer,sizeof(buffer)/sizeof(TCHAR),format,ap);
  109.   va_end(ap);
  110.   CWnd   *wnd=AfxGetMainWnd();
  111.   if (wnd)
  112.     wnd->MessageBox(buffer,_T("Error"),MB_OK|MB_ICONERROR);
  113.   else
  114.     ::MessageBox(NULL,buffer,_T("Error"),MB_OK|MB_ICONERROR);
  115. }
  116. void CTVApp::QueueCmd(UINT cmd) {
  117.   theApp.m_cmdqueue.Add(cmd);
  118. }
  119. UINT CTVApp::TopQueuedCmd() {
  120.   if (theApp.m_cmdqueue.GetSize()>0)
  121.     return theApp.m_cmdqueue[theApp.m_cmdqueue.GetSize()-1];
  122.   return 0;
  123. }
  124. BOOL CTVApp::OnIdle(LONG lCount) 
  125. {
  126.   // force processing queued messages even before the framework
  127.   if (lCount==0 && m_cmdqueue.GetSize()>0) {
  128.     m_pMainWnd->PostMessage(WM_COMMAND,m_cmdqueue[0],0);
  129.     m_cmdqueue.RemoveAt(0);
  130.   }
  131.   return CWinApp::OnIdle(lCount);
  132. }
  133. CImageList* CTVApp::ImageList() {
  134.   if (!theApp.m_imagelist.get()) {
  135.     theApp.m_imagelist.reset(new CImageList());
  136.     theApp.m_imagelist->Create(IDB_SMALLICONS,16,0,RGB(255,0,255));
  137.   }
  138.   return theApp.m_imagelist.get();
  139. }
  140. static bool  FindOtherWindow(CWinThread* pThread,LPCTSTR cmdline) {
  141.   // WinCE: Only one application instance can be run
  142.   HANDLE  hMuTex;
  143.   TCHAR   szTempName[MAX_PATH], szExeName[MAX_PATH];
  144.   int   i, iValue;
  145.   
  146.   iValue=::GetModuleFileName(NULL,szExeName,MAX_PATH);
  147.   HKEY hKey;
  148.   CString kname(_T("Software\") REGNAME _T("\"));
  149.   TCHAR   *exp=szExeName+iValue;
  150.   while (exp>szExeName && exp[-1]!=_T('/') && exp[-1]!=_T('\'))
  151.     --exp;
  152.   kname+=exp;
  153.   if (kname.Right(4).CompareNoCase(_T(".exe"))==0)
  154.     kname=kname.Left(kname.GetLength()-4);
  155.   kname+=_T("\Parameters");
  156.   bool allow=false;
  157.   if (::RegOpenKeyEx(HKEY_CURRENT_USER,kname,0,HR_REG_PERM,&hKey)==ERROR_SUCCESS) {
  158.     DWORD   type;
  159.     DWORD   val=0;
  160.     DWORD   sizeval=sizeof(val);
  161.     if (::RegQueryValueEx(hKey,_T("AllowOnlyOneInstance"),0,&type,(BYTE*)&val,&sizeval)==ERROR_SUCCESS &&
  162. type==REG_DWORD && sizeval==sizeof(val))
  163.       allow=val==0;
  164.     RegCloseKey(hKey);
  165.   }
  166.   if (allow)
  167.     return false;
  168.   _tcscpy(szTempName,szExeName);
  169.   for(i = 0; i < iValue; i++) 
  170.   {
  171.     if (szTempName[i]=='\') 
  172.       szTempName[i]='/';
  173.   }
  174.   
  175.   hMuTex = ::CreateMutex(NULL, FALSE, szTempName);
  176.   if (hMuTex!=NULL)
  177.   {
  178.     if (::GetLastError() == ERROR_ALREADY_EXISTS) 
  179.     {
  180.       HWND  hWnd=::FindWindow(IPCCLASS,szExeName);
  181.       HWND  hFrame=hWnd ? ::GetParent(hWnd) : NULL;
  182.       if (hFrame) 
  183.       {
  184. if (cmdline && cmdline[0]) {
  185.   COPYDATASTRUCT   cd;
  186.   cd.dwData=0;
  187.   // force the filename to unicode
  188.   cd.cbData=wcslen(cmdline)*sizeof(wchar_t);
  189.   cd.lpData=(void *)cmdline;
  190.   ::SendMessage(hFrame,WM_COPYDATA,0,(LPARAM)&cd);
  191. }
  192. #ifdef _WIN32_WCE
  193. ::SetForegroundWindow((HWND)(((DWORD)hFrame)|0x01));
  194. #else
  195. ::SetForegroundWindow(hFrame);
  196. #endif
  197. return true;
  198.       }
  199.     }
  200.   }
  201.   return false;
  202. }
  203. int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  204.       LPTSTR lpCmdLine, int nCmdShow)
  205. {
  206.   ASSERT(hPrevInstance == NULL);
  207.   AfxGetModuleState()->m_bDLL=FALSE; // XXX
  208.   int nReturnCode = -1;
  209.   CWinThread* pThread = AfxGetThread();
  210.   CWinApp* pApp = AfxGetApp();
  211.   
  212.   // AFX internal initialization
  213.   if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
  214.     goto InitFailure;
  215.   
  216.   // App global initializations (rare)
  217.   if (pApp != NULL && !pApp->InitApplication())
  218.     goto InitFailure;
  219.   
  220.   if (FindOtherWindow(pThread,lpCmdLine))
  221.     goto InitFailure;
  222.   
  223.   // Perform specific initializations
  224.   if (!pThread->InitInstance())
  225.   {
  226.     if (pThread->m_pMainWnd != NULL)
  227.     {
  228.       TRACE0("Warning: Destroying non-NULL m_pMainWndn");
  229.       pThread->m_pMainWnd->DestroyWindow();
  230.     }
  231.     nReturnCode = pThread->ExitInstance();
  232.     goto InitFailure;
  233.   }
  234.   nReturnCode = pThread->Run();
  235.   
  236. InitFailure:
  237. #ifdef _DEBUG
  238.   // Check for missing AfxLockTempMap calls
  239.   if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
  240.   {
  241.     TRACE1("Warning: Temp map lock count non-zero (%ld).n",
  242.       AfxGetModuleThreadState()->m_nTempMapLock);
  243.   }
  244.   AfxLockTempMaps();
  245.   AfxUnlockTempMaps(-1);
  246. #endif
  247.   
  248.   AfxWinTerm();
  249.   return nReturnCode;
  250. }
  251. #ifndef _WIN32_WCE
  252. extern "C" int WINAPI
  253. _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  254. LPTSTR lpCmdLine, int nCmdShow)
  255. {
  256.   return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
  257. }
  258. #endif