l2-unlegits/l2ooghelper/MainWindow.cpp
2012-02-01 05:25:08 +00:00

382 lines
11 KiB
C++

#include "stdafx.h"
#include "Resource.h"
#include "AccountDlg.h"
#include "Tabs.h"
#include "MainWindow.h"
#include "ScriptEngine.h"
#include "GlobalMapImages.h"
#include "DBLayer.h"
#include "SEH_global.h"
#include "HWID.h"
#include "bot_interaction/BotIPC.h"
#ifdef _DEBUG
#include "Logger.h"
#endif
#define MAX_LOADSTRING 256
// Ãëîáàëüíûå ïåðåìåííûå:
HINSTANCE g_hInst; // òåêóùèé ýêçåìïëÿð
HWND g_hWnd; // ãëàâíîå îêíî ïðèëîæåíèÿ
HWND g_hWndTab; // TabControl ïðèëîæåíèÿ
TCHAR szTitle[MAX_LOADSTRING]; // Òåêñò ñòðîêè çàãîëîâêà
TCHAR szWindowClass[MAX_LOADSTRING]; // èìÿ êëàññà ãëàâíîãî îêíà
GlobalMapImages g_mapImg; // êàðòû
// Îòïðàâèòü îáúÿâëåíèÿ ôóíêöèé, âêëþ÷åííûõ â ýòîò ìîäóëü êîäà:
ATOM MyRegisterClass( HINSTANCE hInstance );
BOOL InitInstance( HINSTANCE, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
INT_PTR CALLBACK About( HWND, UINT, WPARAM, LPARAM );
// ôóíêöèè îáðàáîòêè ñîîáùåíèé îêíà
LRESULT OnCreate();
LRESULT OnClose();
LRESULT OnDestroy();
LRESULT OnCommand( WPARAM wParam, LPARAM lParam );
LRESULT OnNotify( WPARAM wParam, LPARAM lParam );
LRESULT OnPaint();
LRESULT OnSize( WPARAM wParam, LPARAM lParam );
int APIENTRY _tWinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow )
{
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );
MSG msg;
HACCEL hAccelTable;
//
#ifdef _DEBUG
FILE *error_logger_file = fopen( "L2OOGHelper.log", "wt" );
ErrorLogger_Init();
ErrorLogger_SetWarnMessageLevel( LOG_DEBUG );
ErrorLogger_SetAutoPrependErrorType( true );
ErrorLogger_Enable( true );
ErrorLogger_SetLogFile( error_logger_file );
log_error( LOG_OK, "L2OOGHelper: Debug build start\n" );
#endif // _DEBUG
// init Comctl32.dll
InitCommonControls();
#ifdef USE_SEH
// set default error mode and global exception handler
SetErrorMode(0); // Use the system default, which is to display all error dialog boxes.
SetUnhandledExceptionFilter( GlobalUnhandledExceptionFilter );
#ifdef _DEBUG
SEH_loadMap();
#endif
#endif // USE_SEH
#ifdef CHAT_USE_RICHEDIT // åñëè îïðåäåëåíî, çàãðóæàåò Riched20.dll (Äëÿ RichEdit êîíòðîëà)
HINSTANCE hInstDllRichEdit = LoadLibrary( TEXT("Riched20") );
if( !hInstDllRichEdit )
{
#ifdef _DEBUG
log_error( LOG_ERROR, "_tWinMain: cannot load Riched20.dll!" );
#endif
MessageBox( NULL, TEXT("RichEdit control class DLL cannot be loaded\n")
TEXT("(Riched20.dll not found)"),
TEXT("L2OogHelper: FATAL ERROR"), MB_ICONSTOP );
return -1;
}
#ifdef _DEBUG
log_error( LOG_DEBUG, "_tWinMain: Riched20.dll loaded OK\n" );
#endif
#endif // CHAT_USE_RICHEDIT
// verify HWID
if( !verifyHWID() ) return 0;
if( !verifyTimeLimit() ) return 0;
// init WinSock
WSADATA wsadata;
WSAStartup( MAKEWORD(2,0), &wsadata );
// init L2Packets
L2PNet_InitDefault();
L2PacketNames_Init();
L2Data_init();
L2Data_SM_init();
// init caching database layer (based on L2Packets L2Data_*)
DBLayer_init();
// init global map images maps directory
char aCurDir[256] = {0};
GetCurrentDirectoryA( 255, aCurDir );
strcat( aCurDir, "\\maps" );
g_mapImg.setMapsDir( aCurDir );
// init recipe data
L2Data_InitRecipes();
// init Bot interprocess communications
BotIPC::getInstance();
// Èíèöèàëèçàöèÿ ãëîáàëüíûõ ñòðîê
LoadString( hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING );
LoadString( hInstance, IDC_L2OOGHELPER, szWindowClass, MAX_LOADSTRING );
MyRegisterClass( hInstance );
// Âûïîëíèòü èíèöèàëèçàöèþ ïðèëîæåíèÿ:
if( !InitInstance( hInstance, nCmdShow ) )
{
return FALSE;
}
hAccelTable = LoadAccelerators( hInstance, MAKEINTRESOURCE(IDC_L2OOGHELPER) );
// Öèêë îñíîâíîãî ñîîáùåíèÿ:
while( GetMessage( &msg, NULL, 0, 0) )
{
if( !TranslateAccelerator( msg.hwnd, hAccelTable, &msg ) )
{
//if( !IsDialogMessage( msg.hwnd, &msg ) ) // êîñÿ÷îê òóòà, íî ìîãóò áûòü ïðîáëåìû ñ äî÷åðíèìè äèàëîãàìè
//{
TranslateMessage( &msg );
DispatchMessage( &msg );
//}
}
}
BotIPC::getInstance()->delAllMyProcessBots(); // safe cleanup
BotIPC::freeInstance();
L2Data_SM_free();
DBLayer_free();
WSACleanup();
g_mapImg.unloadAllSquares();
if( g_mapImg.getLoadedCount() > 0 )
{
MessageBox( NULL, TEXT("GlobalMapImages: not all images are unloaded!"),
TEXT("Warning! Potential memory leaks!"), MB_ICONWARNING );
}
#ifdef _DEBUG
log_error( LOG_OK, "Closing log; last message... Bye!\n" );
ErrorLogger_SetLogFile( stdout );
ErrorLogger_Enable( false );
if( error_logger_file ) fclose( error_logger_file );
error_logger_file = NULL;
#endif
return (int)msg.wParam;
}
//
// ÔÓÍÊÖÈß: MyRegisterClass()
//
// ÍÀÇÍÀ×ÅÍÈÅ: ðåãèñòðèðóåò êëàññ îêíà.
//
// ÊÎÌÌÅÍÒÀÐÈÈ:
//
// Ýòà ôóíêöèÿ è åå èñïîëüçîâàíèå íåîáõîäèìû òîëüêî â ñëó÷àå, åñëè íóæíî, ÷òîáû äàííûé êîä
// áûë ñîâìåñòèì ñ ñèñòåìàìè Win32, íå èìåþùèìè ôóíêöèè RegisterClassEx'
// êîòîðàÿ áûëà äîáàâëåíà â Windows 95. Âûçîâ ýòîé ôóíêöèè âàæåí äëÿ òîãî,
// ÷òîáû ïðèëîæåíèå ïîëó÷èëî "êà÷åñòâåííûå" ìåëêèå çíà÷êè è óñòàíîâèëî ñâÿçü
// ñ íèìè.
//
ATOM MyRegisterClass( HINSTANCE hInstance )
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_OWNDC; // | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_L2OOGHELPER) );
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_L2OOGHELPER);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon( wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL) );
return RegisterClassEx( &wcex );
}
//
// ÔÓÍÊÖÈß: InitInstance(HINSTANCE, int)
//
// ÍÀÇÍÀ×ÅÍÈÅ: ñîõðàíÿåò îáðàáîòêó ýêçåìïëÿðà è ñîçäàåò ãëàâíîå îêíî.
//
// ÊÎÌÌÅÍÒÀÐÈÈ:
//
// Â äàííîé ôóíêöèè äåñêðèïòîð ýêçåìïëÿðà ñîõðàíÿåòñÿ â ãëîáàëüíîé ïåðåìåííîé, à òàêæå
// ñîçäàåòñÿ è âûâîäèòñÿ íà ýêðàí ãëàâíîå îêíî ïðîãðàììû.
//
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
HWND hWnd;
g_hInst = hInstance; // Ñîõðàíèòü äåñêðèïòîð ýêçåìïëÿðà â ãëîáàëüíîé ïåðåìåííîé
hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 960 /*CW_USEDEFAULT*/, 695, NULL, NULL, hInstance, NULL );
if( !hWnd ) return FALSE;
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
return TRUE;
}
LRESULT OnCreate()
{
RECT r;
GetClientRect( g_hWnd, &r );
// init common controls :)
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_TAB_CLASSES | ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES |
ICC_BAR_CLASSES | ICC_STANDARD_CLASSES | ICC_PROGRESS_CLASS;
InitCommonControlsEx( &icex );
// create tab control
g_hWndTab = CreateWindowEx( 0, WC_TABCONTROL, NULL,
WS_CHILD | WS_VISIBLE | TCS_MULTILINE | TCS_TABS,
0, 0, r.right - r.left, r.bottom - r.top, g_hWnd, NULL, g_hInst, NULL );
//
Tabs_Init();
return 0;
}
LRESULT OnClose()
{
return 0;
}
LRESULT OnDestroy()
{
PostQuitMessage( 0 );
return 0;
}
LRESULT OnCommand( WPARAM wParam, LPARAM lParam )
{
int wmId, wmEvent;
wmId = LOWORD( wParam );
wmEvent = HIWORD( wParam );
switch( wmId )
{
case IDM_ABOUT:
DialogBox( g_hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), g_hWnd, About );
break;
case IDM_EXIT:
PostMessage( g_hWnd, WM_CLOSE, 0, 0 );
break;
case IDM_LINEAGE_ADD_ACC:
{
AccountDlg *dlg = new AccountDlg();
if( dlg->run( g_hWnd ) )
{
Account acc = dlg->getAccount();
Tabs_AddAccount( &acc );
}
delete dlg;
} break;
#ifdef _DEBUG
case ID_DEBUG_ENABLECON: ErrorLogger_EnableLoggingToConsole( true ); break;
case ID_DEBUG_DISABLECON: ErrorLogger_EnableLoggingToConsole( false ); break;
case ID_LOGLEVEL_OK: ErrorLogger_SetWarnMessageLevel( LOG_OK ); break;
case ID_LOGLEVEL_ERROR: ErrorLogger_SetWarnMessageLevel( LOG_ERROR ); break;
case ID_LOGLEVEL_WARN: ErrorLogger_SetWarnMessageLevel( LOG_WARNING ); break;
case ID_LOGLEVEL_USERAI: ErrorLogger_SetWarnMessageLevel( LOG_USERAI ); break;
case ID_LOGLEVEL_PACKETNAME: ErrorLogger_SetWarnMessageLevel( LOG_PACKETNAME ); break;
case ID_LOGLEVEL_DEBUG: ErrorLogger_SetWarnMessageLevel( LOG_DEBUG ); break;
case ID_LOGLEVEL_DEBUGDUMP: ErrorLogger_SetWarnMessageLevel( LOG_DEBUGDUMP ); break;
/*case ID_DEBUG_RUNTESTSCRIPT:
{
ScriptEngine se;
se.init();
se.startScript( "test.lua" );
se.deinit();
} break;*/
#endif
default:
return DefWindowProc( g_hWnd, WM_COMMAND, wParam, lParam );
}
return 0;
}
LRESULT OnNotify( WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(wParam);
LPNMHDR lpnmhdr = (LPNMHDR)lParam;
switch( lpnmhdr->code )
{
case TCN_SELCHANGING: Tabs_OnSelChanging( lpnmhdr ); break;
case TCN_SELCHANGE: Tabs_OnSelChange( lpnmhdr ); break;
}
return 0;
}
LRESULT OnPaint()
{
//RECT wr;
//GetWindowRect( hWnd, &wr );
//TCHAR tstr[256];
//wsprintf( tstr, TEXT("%d x %d"), wr.right - wr.left, wr.bottom - wr.top );
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint( g_hWnd, &ps );
// TODO: äîáàâüòå ëþáîé êîä îòðèñîâêè...
//TextOut( hdc, 0, 0, tstr, lstrlen(tstr) );
EndPaint( g_hWnd, &ps );
Tabs_OnPaint();
return 0;
}
LRESULT OnSize( WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(wParam);
/*lParam:
The low-order word of lParam specifies the new width of the client area.
The high-order word of lParam specifies the new height of the client area.*/
int w = LOWORD( lParam );
int h = HIWORD( lParam );
// resize tab
MoveWindow( g_hWndTab, 0, 0, w, h, TRUE );
return 0;
}
LRESULT OnMyDeleteTab( LPARAM lParam )
{
Tabs_DeleteTab( (int)lParam );
return 0;
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_CREATE:
{
g_hWnd = hWnd;
return OnCreate();
} break;
case WM_COMMAND: return OnCommand( wParam, lParam ); break;
case WM_PAINT: return OnPaint(); break;
case WM_DESTROY: return OnDestroy(); break;
case WM_SIZE: return OnSize( wParam, lParam ); break;
case WM_NOTIFY: return OnNotify( wParam, lParam ); break;
case WMMY_DELETETAB: return OnMyDeleteTab( lParam ); break;
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
// Îáðàáîò÷èê ñîîáùåíèé äëÿ îêíà "Î ïðîãðàììå".
INT_PTR CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER(lParam);
switch( message )
{
case WM_INITDIALOG: return (INT_PTR)TRUE;
case WM_COMMAND:
if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL )
{
EndDialog( hDlg, LOWORD(wParam) );
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}