MGateWay.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:10k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // MGateWay.cpp : Defines the entry point for the application.
  2. //
  3. #include "stdafx.h"
  4. //#include "resource.h"
  5. #include "MGateWay.h"
  6. #include "PlayerManager.h"
  7. #include "Macro.h"
  8. #define MAX_LOADSTRING 100
  9. /*
  10.  * Global Variables
  11.  */
  12. HINSTANCE g_hInst; // current instance
  13. static HWND g_hwndAnnounceBox = NULL;
  14. static HANDLE g_hOneInstanceEvent = INVALID_HANDLE_VALUE;
  15. static CPlayerManager *g_pPlayerManager = NULL;
  16. TCHAR g_szTitle[MAX_LOADSTRING]; // The title bar text
  17. TCHAR g_szWindowClass[MAX_LOADSTRING]; // The title bar text
  18. TCHAR g_szAppInfo[MAX_LOADSTRING];
  19. /*
  20.  * Forward declarations of functions included in this code module
  21.  */
  22. ATOM AppRegisterClass( HINSTANCE hInstance );
  23. BOOL InitInstance( HINSTANCE, int );
  24. void ExitInstance();
  25. LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
  26. LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );
  27. BOOL CheckStartupCondition();
  28. void CleanStartupInfo();
  29. void ShowAnnounceBox( HWND hwndParent, int nCmdShow );
  30. BOOL CALLBACK AnnounceBoxProc( HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam );
  31. /*
  32.  * Implement
  33.  */
  34. void ShowAnnounceBox( HWND hwndParent, int nCmdShow )
  35. {
  36. if ( NULL == g_hwndAnnounceBox && !IsWindow( g_hwndAnnounceBox ) )
  37. g_hwndAnnounceBox = ::CreateDialog( g_hInst, 
  38. MAKEINTRESOURCE( IDD_ANNOUNCEBOX ), 
  39. hwndParent, 
  40. (DLGPROC) AnnounceBoxProc );
  41. RECT rect;
  42. ::GetWindowRect( g_hwndAnnounceBox, &rect );
  43. ::SetWindowPos( g_hwndAnnounceBox, 
  44. NULL, 
  45. rect.left, 
  46. rect.top / 2,
  47. 0,
  48. 0,
  49. SWP_NOSIZE | SWP_NOZORDER );
  50. }
  51. ::ShowWindow( g_hwndAnnounceBox, nCmdShow );
  52. ::UpdateWindow( g_hwndAnnounceBox );
  53. }
  54. BOOL CALLBACK AnnounceBoxProc( HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam )
  55. {
  56.     switch (message) 
  57.     { 
  58. case WM_INITDIALOG: 
  59. return TRUE; 
  60. case WM_COMMAND: 
  61. switch ( LOWORD( wParam ) ) 
  62. case IDCANCEL: 
  63. DestroyWindow( hwndDlg );
  64. g_hwndAnnounceBox = NULL;
  65. return TRUE; 
  66.     }
  67.     return FALSE; 
  68. }
  69. int APIENTRY WinMain( HINSTANCE hInstance,
  70.                       HINSTANCE hPrevInstance,
  71.                       LPSTR     lpCmdLine,
  72.                       int       nCmdShow )
  73. {
  74. MSG msg;
  75. HACCEL hAccelTable;
  76. CHAR szInfo[MAX_LOADSTRING];
  77. LoadString( hInstance, IDS_APP_TITLE, g_szAppInfo, MAX_LOADSTRING );
  78. #ifdef TRUE
  79. bool bOpenTracer = false;
  80.     while( lpCmdLine[0] == '-' || lpCmdLine[0] == '/' )
  81.     {
  82.         lpCmdLine++;
  83.         switch ( *lpCmdLine++ )
  84.         {
  85. case 'c':
  86.         case 'C':
  87.             bOpenTracer = true;
  88.             break;
  89.         }
  90.         while( IS_SPACE( *lpCmdLine ) )
  91.         {
  92.             lpCmdLine++;
  93.         }
  94.     }
  95. if ( bOpenTracer ) 
  96. {
  97. AllocConsole();
  98. }
  99. #endif // End of this function
  100. /*
  101.  * Is it one instance?
  102.  */
  103. if ( !CheckStartupCondition() )
  104. {
  105. LoadString( hInstance, IDS_STARTUP_ERROR, szInfo, MAX_LOADSTRING );
  106. ::MessageBox( NULL, szInfo, g_szAppInfo, MB_OK | MB_ICONASTERISK );
  107. return FALSE;
  108. }
  109. /*
  110.  * Load and setup environment
  111.  */
  112. if ( !LoadEnvironmentVariable( hInstance ) )
  113. {
  114. return FALSE;
  115. }
  116. /*
  117.  * Initialize global strings
  118.  */
  119. LoadString( hInstance, IDS_APP_TITLE, g_szTitle, MAX_LOADSTRING );
  120. LoadString( hInstance, IDC_MGATEWAY, g_szWindowClass, MAX_LOADSTRING );
  121. AppRegisterClass( hInstance );
  122. /*
  123.  * Perform application initialization
  124.  */
  125. if ( !InitInstance ( hInstance, nCmdShow ) )
  126. {
  127. LoadString( hInstance, IDS_LOADENVIRONMENT_ERROR, szInfo, MAX_LOADSTRING );
  128. ::MessageBox( NULL, szInfo, g_szAppInfo, MB_OK | MB_ICONEXCLAMATION );
  129. return FALSE;
  130. }
  131. hAccelTable = LoadAccelerators( hInstance, (LPCTSTR)IDC_MGATEWAY );
  132. /*
  133.  * Main message loop
  134.  */
  135. while ( GetMessage( &msg, NULL, 0, 0 ) )
  136. {
  137. if ( !TranslateAccelerator( msg.hwnd, hAccelTable, &msg ) &&
  138. ( !IsWindow( g_hwndAnnounceBox ) ||
  139.   !IsDialogMessage( g_hwndAnnounceBox, &msg ) ) ) 
  140. {
  141. TranslateMessage( &msg );
  142. DispatchMessage( &msg );
  143. }
  144. }
  145. ExitInstance();
  146. /*
  147.  * Update and save environment
  148.  */
  149. SaveEnvironmentVariable();
  150. CleanStartupInfo();
  151. #ifdef TRUE
  152. if ( bOpenTracer )
  153. {
  154. FreeConsole();
  155. }
  156. #endif
  157. return msg.wParam;
  158. }
  159. //
  160. //  FUNCTION: AppRegisterClass()
  161. //
  162. //  PURPOSE: Registers the window class.
  163. //
  164. //  COMMENTS:
  165. //
  166. //    This function and its usage is only necessary if you want this code
  167. //    to be compatible with Win32 systems prior to the 'RegisterClassEx'
  168. //    function that was added to Windows 95. It is important to call this function
  169. //    so that the application will get 'well formed' small icons associated
  170. //    with it.
  171. //
  172. ATOM AppRegisterClass( HINSTANCE hInstance )
  173. {
  174. WNDCLASSEX wcex;
  175. wcex.cbSize = sizeof( WNDCLASSEX ); 
  176. wcex.style = CS_HREDRAW | CS_VREDRAW;
  177. wcex.lpfnWndProc = (WNDPROC)WndProc;
  178. wcex.cbClsExtra = 0;
  179. wcex.cbWndExtra = 0;
  180. wcex.hInstance = hInstance;
  181. wcex.hIcon = LoadIcon( hInstance, (LPCTSTR)IDI_MGATEWAY );
  182. wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
  183. wcex.hbrBackground = (HBRUSH)( COLOR_WINDOW+1 );
  184. wcex.lpszMenuName = (LPCSTR)IDC_MGATEWAY;
  185. wcex.lpszClassName = g_szWindowClass;
  186. wcex.hIconSm = LoadIcon( wcex.hInstance, (LPCTSTR)IDI_SMALL );
  187. return RegisterClassEx( &wcex );
  188. }
  189. //
  190. //   FUNCTION: InitInstance(HANDLE, int)
  191. //
  192. //   PURPOSE: Saves instance handle and creates main window
  193. //
  194. //   COMMENTS:
  195. //
  196. //        In this function, we save the instance handle in a global variable and
  197. //        create and display the main program window.
  198. //
  199. BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
  200. {
  201. HWND hWnd;
  202. g_hInst = hInstance; // Store instance handle in our global variable
  203. /*
  204.      * Create window
  205.  */
  206. hWnd = CreateWindow( g_szWindowClass, g_szTitle, WS_OVERLAPPEDWINDOW,
  207. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL );
  208. if ( !hWnd )
  209. {
  210. return FALSE;
  211. }
  212. EnableWindow( hWnd, FALSE );
  213.   
  214. /*
  215.  * Show window
  216.  */
  217. ShowWindow( hWnd, nCmdShow );
  218. UpdateWindow( hWnd );
  219. ShowAnnounceBox( NULL, SW_SHOW );
  220. /*
  221.  * Init player manager
  222.  */
  223. g_pPlayerManager = new CPlayerManager( g_theEnviroment );
  224.    
  225. if ( !g_pPlayerManager->Create() )
  226. {
  227. return FALSE;
  228. }
  229. ShowAnnounceBox( NULL, SW_HIDE );
  230.    
  231. EnableWindow( hWnd, TRUE );
  232. ::InvalidateRect( hWnd, NULL, FALSE );
  233. return TRUE;
  234. }
  235. void SetShowInfo( _tstring sTitle, _tstring sContent, int nFormat /*= SIF_NONE*/ )
  236. {
  237. static const _tstring sSpace = _T("    ");
  238. static const _tstring sColon = _T(" : ");
  239. switch ( nFormat )
  240. {
  241. case SIF_SPACE:
  242. g_theEnviroment.mShowInfo[sTitle] = sTitle + sSpace + sContent;
  243. break;
  244. case SIF_COLON:
  245. g_theEnviroment.mShowInfo[sTitle] = sTitle + sColon + sContent;
  246. break;
  247. case SIF_NONE:
  248. default:
  249. g_theEnviroment.mShowInfo[sTitle] = sTitle + sContent;
  250. break;
  251. }
  252. }
  253. void ExitInstance()
  254. {
  255. ShowAnnounceBox( NULL, SW_SHOW );
  256. g_pPlayerManager->Destroy();
  257. SAFE_DELETE( g_pPlayerManager );
  258. ShowAnnounceBox( NULL, SW_HIDE );
  259. }
  260. //
  261. //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
  262. //
  263. //  PURPOSE:  Processes messages for the main window.
  264. //
  265. //  WM_COMMAND - process the application menu
  266. //  WM_PAINT - Paint the main window
  267. //  WM_DESTROY - post a quit message and return
  268. //
  269. //
  270. LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  271. {
  272. int wmId, wmEvent;
  273. PAINTSTRUCT ps;
  274. HDC hdc;
  275. HBRUSH hBkBrush;
  276. RECT rect;
  277. /* static UINT s_unTimerID = 0;
  278. static const UINT s_unEvent = 1;
  279. static const UINT s_unElapse = 1000;
  280. */
  281. // static UINT s_unAppTimer = 0;
  282. static char szInfo[100];
  283. static const int s_nCornerCoord = 8;
  284. static const int s_nTextSpace = 30;
  285. switch (message) 
  286. {
  287. case WM_CREATE:
  288. // s_unTimerID = ::SetTimer( hWnd, s_unEvent, s_unElapse, NULL );
  289. break;
  290. case WM_COMMAND:
  291. {
  292. wmId    = LOWORD( wParam ); 
  293. wmEvent = HIWORD( wParam ); 
  294. /*
  295. * Parse the menu selections:
  296. */
  297. switch ( wmId )
  298. {
  299. case IDM_ABOUT:
  300. DialogBox( g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About );
  301. break;
  302. case IDM_EXIT:
  303. DestroyWindow( hWnd );
  304. break;
  305. default:
  306. return DefWindowProc( hWnd, message, wParam, lParam );
  307. }
  308. }
  309. break;
  310. /* case WM_TIMER:
  311. if ( wParam == s_unEvent )
  312. {
  313. UINT s_unHour = s_unAppTimer / 3600;
  314. UINT s_unMinute = ( s_unAppTimer % 3600 ) / 60;
  315. UINT s_unSecond = ( s_unAppTimer % 3600 ) % 60;
  316. sprintf( szInfo, "%d : %2.2d : %2.2d", s_unHour, s_unMinute, s_unSecond );
  317. SetShowInfo( "Application Timer", szInfo, SIF_SPACE );
  318. s_unAppTimer ++;
  319. ::InvalidateRect( hWnd, NULL, FALSE );
  320. }
  321. break;
  322. */
  323. case WM_PAINT:
  324. {
  325. hdc = BeginPaint( hWnd, &ps );
  326. hBkBrush = CreateSolidBrush( RGB( 255, 255, 255 ) );
  327. GetClientRect( hWnd, &rect );
  328. FillRect( hdc, &rect, hBkBrush );
  329. rect.left = rect.top = s_nCornerCoord;
  330. for ( _tssmap_it i = g_theEnviroment.mShowInfo.begin();
  331. i != g_theEnviroment.mShowInfo.end();
  332. i ++ )
  333. {
  334. DrawText( hdc, (*i).second.c_str(), strlen( (*i).second.c_str() ), &rect, DT_LEFT );
  335. rect.top += s_nTextSpace;
  336. }
  337. DeleteObject( hBkBrush );
  338. EndPaint( hWnd, &ps );
  339. }
  340. break;
  341. case WM_ERASEBKGND:
  342. return FALSE;
  343. break;
  344. case WM_DESTROY:
  345. // ::KillTimer( hWnd, s_unTimerID );
  346. PostQuitMessage(0);
  347. break;
  348. default:
  349. return DefWindowProc( hWnd, message, wParam, lParam );
  350. }
  351. return 0;
  352. }
  353. // Mesage handler for about box.
  354. LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
  355. {
  356. switch (message)
  357. {
  358. case WM_INITDIALOG:
  359. return TRUE;
  360. case WM_COMMAND:
  361. if ( LOWORD( wParam ) == IDOK || LOWORD( wParam ) == IDCANCEL )
  362. {
  363. EndDialog( hDlg, LOWORD( wParam ) );
  364. return TRUE;
  365. }
  366. break;
  367. }
  368.     return FALSE;
  369. }
  370. BOOL CheckStartupCondition()
  371. {
  372. g_hOneInstanceEvent = ::CreateMutex( NULL, FALSE, "MGW_ONEINST" );
  373. if ( ERROR_ALREADY_EXISTS == ::GetLastError() )
  374. {
  375. return false;
  376. }
  377. return true;
  378. }
  379. void CleanStartupInfo()
  380. {
  381. SAFE_CLOSEHANDLE( g_hOneInstanceEvent );
  382. }