|
|
#include <windows.h>
#include <commctrl.h>
#include <shellapi.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <tchar.h>
#include <winfax.h>
#include <faxutil.h>
#include <mmsystem.h>
#include <winspool.h>
#include "resource.h"
#include "faxstat.h"
#include "faxreg.h"
#include "faxcfg.h"
#include "faxhelp.h"
#define ValidString( String ) ((String) ? (String) : TEXT( "" ))
// global variables
BOOL IsShowing = FALSE; BOOL IsOnTaskBar = FALSE;
NOTIFYICONDATA IconData; // icon data
DWORD Seconds;
LPTSTR TimeSeparator = NULL;
LIST_ENTRY EventListHead; DWORD EventCount;
// configuration options and their defaults
CONFIG_OPTIONS Config = { BST_CHECKED, // OnTop
BST_CHECKED, // TaskBar
BST_CHECKED, // VisualNotification
BST_UNCHECKED, // SoundNotification
BST_UNCHECKED, // AnswerNextCall
BST_UNCHECKED // ManualAnswerEnabled
};
extern HANDLE FaxPortHandle; extern HANDLE hFax;
INSTANCE_DATA FaxStat;
int WINAPI #ifdef UNICODE
wWinMain( #else
WinMain( #endif
HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd ) {
//
// szAppname must match the window class in the resource file
//
static TCHAR szAppName[] = FAXSTAT_WINCLASS;
MSG msg; WNDCLASSEX wndclass; HWND hWnd; HACCEL hAccel;
//
// if we are already running, then activate the window and exit
//
hWnd = FindWindow( szAppName, NULL );
if (hWnd) { PostMessage( hWnd, ACTIVATE, 0, 0 ); ExitProcess( 1 ); }
FaxStat.hInstance = hInstance;
InitCommonControls();
HeapInitialize(NULL,NULL,NULL,0);
InitializeEventList();
hAccel = LoadAccelerators( hInstance, TEXT( "MyAccelerators" ) );
wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = DLGWINDOWEXTRA; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON1 ) ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; wndclass.hIconSm = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON1 ) );
RegisterClassEx( &wndclass );
hWnd = FaxStat.hWnd = CreateDialog( hInstance, MAKEINTRESOURCE( IDD_FAXSTATUS ), 0, NULL);
MyShowWindow( hWnd, FALSE );
SetWindowLong( hWnd, GWL_USERDATA, (LONG) &FaxStat );
FaxStat.ServerName = lpCmdLine[0] ? lpCmdLine : NULL;
WorkerThreadInitialize( &FaxStat );
PostMessage( hWnd, CONFIGUPDATE, 0, 0 );
PostMessage( hWnd, INITANIMATION, 0, 0 );
while (GetMessage( &msg, NULL, 0, 0 )) {
if (!TranslateAccelerator( hWnd, hAccel, &msg )) {
TranslateMessage( &msg );
DispatchMessage(&msg); } }
return msg.wParam; }
VOID CALLBACK TimerProc( HWND hWnd, UINT iMsg, UINT iTimerID, DWORD dwTime ) { TCHAR StrBuf[STR_SIZE];
Seconds++;
_stprintf( StrBuf, TEXT( "%d%s%02d" ), Seconds / 60, TimeSeparator, Seconds % 60 );
SetDlgItemText( hWnd, IDC_TIME, StrBuf ); }
VOID StatusUpdate( HWND hWnd, DWORD EventId, DWORD LastEventId, PFAX_DEVICE_STATUS fds ) {
TCHAR FormatBuf[STR_SIZE]; TCHAR StrBuf[STR_SIZE]; INT FromTo = -1; static int CurrentPage; static BOOL FaxActive = FALSE; // this is TRUE when sending or receiving
PEVENT_RECORD NewEvent; PINSTANCE_DATA pInst = (PINSTANCE_DATA) GetWindowLong( hWnd, GWL_USERDATA );
if (EventId == FEI_ABORTING && LastEventId == FEI_ABORTING) { return; }
if (TimeSeparator == NULL) { INT BytesNeeded;
BytesNeeded = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_STIME, NULL, 0 ); TimeSeparator = MemAlloc( BytesNeeded + 4); BytesNeeded = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_STIME, TimeSeparator, BytesNeeded ); }
LoadString( pInst->hInstance, EventId, FormatBuf, STR_SIZE );
if (fds && EventId != LastEventId) {
CurrentPage = fds->CurrentPage; //pInst->JobId = fds->JobId;
} else { CurrentPage++; }
if (EventId == FEI_DIALING) {
_stprintf( StrBuf, FormatBuf, ValidString( fds->PhoneNumber ) );
EnableWindow( GetDlgItem( hWnd, IDC_FAXEND ), TRUE );
} else if (EventId == FEI_SENDING || EventId == FEI_RECEIVING) {
FromTo = EventId == FEI_SENDING ? IDS_TO : IDS_FROM;
_stprintf( StrBuf, FormatBuf, CurrentPage );
EnableWindow( GetDlgItem( hWnd, IDC_FAXEND ), TRUE );
} else {
_tcscpy( StrBuf, FormatBuf );
EnableWindow( GetDlgItem( hWnd, IDC_FAXEND ), FALSE );
}
NewEvent = InsertEventRecord( EventId, StrBuf );
if (pInst->hEventDlg != NULL) {
InsertEventDialog( pInst->hEventDlg, NewEvent );
}
SetDlgItemText( pInst->hWnd, IDC_STATUS, StrBuf );
if (IsOnTaskBar) {
IconData.uFlags = NIF_TIP;
_tcscpy( IconData.szTip, StrBuf );
Shell_NotifyIcon( NIM_MODIFY, &IconData ); }
switch(FromTo) { case IDS_FROM: case IDS_TO:
if (!FaxActive) {
PlayAnimation( GetDlgItem( pInst->hWnd, IDC_ANIMATE1 ), FromTo == IDS_FROM ? IDR_RECEIVE : IDR_SEND );
LoadString( pInst->hInstance, FromTo, StrBuf, STR_SIZE );
_tcscat( StrBuf, ValidString( fds->Tsid ) );
SetDlgItemText( pInst->hWnd, IDC_FROMTO, StrBuf );
LoadString( pInst->hInstance, IDS_ETIME, StrBuf, STR_SIZE );
SetDlgItemText( pInst->hWnd, IDC_STATICTIME, StrBuf );
Seconds = 0;
_stprintf( StrBuf, TEXT( "%d%s%02d" ), 0, TimeSeparator, 0 );
SetDlgItemText( pInst->hWnd, IDC_TIME, StrBuf );
SetTimer( pInst->hWnd, ID_TIMER, 1000, (TIMERPROC) TimerProc );
FaxActive = TRUE; }
break;
default:
SetDlgItemText( pInst->hWnd, IDC_FROMTO, TEXT( "" ) );
SetDlgItemText( pInst->hWnd, IDC_STATICTIME, TEXT( "" ) );
SetDlgItemText( pInst->hWnd, IDC_TIME, TEXT( "" ) );
StrBuf[0] = 0;
if (FaxActive) {
PlayAnimation( GetDlgItem( pInst->hWnd, IDC_ANIMATE1 ), IDR_IDLE );
KillTimer( pInst->hWnd, ID_TIMER );
FaxActive = FALSE; } }
if (EventId == FEI_DIALING || (EventId == FEI_RINGING && LastEventId != FEI_RINGING)) { if (IsOptionOn( Config.VisualNotification )) { MyShowWindow( pInst->hWnd, TRUE ); }
if (IsOptionOn( Config.SoundNotification )) { PlaySound( TEXT( "Incoming-Fax" ), NULL, SND_ASYNC | SND_APPLICATION ); }
if (EventId == FEI_RINGING && IsOptionOn( Config.ManualAnswerEnabled )) { HANDLE FaxJobHandle; TCHAR FileName[256]; DWORD rVal;
if (IsOptionOn( Config.AnswerNextCall )) {
rVal = IDYES;
} else { rVal = DialogBoxParam( FaxStat.hInstance, MAKEINTRESOURCE( IDD_ANSWER ), hWnd, AnswerDlgProc, (LPARAM) &FaxStat ); }
if ( rVal == IDYES ) {
FaxReceiveDocument( hFax, FileName, 256, &FaxJobHandle );
CheckDlgButton( hWnd, IDC_ANSWER_NEXT_CALL, BST_UNCHECKED );
Config.AnswerNextCall = BST_UNCHECKED; } } }
if (pInst->hAnswerDlg && EventId != FEI_RINGING) {
PostMessage( pInst->hAnswerDlg, WM_COMMAND, IDNO, 0 ); } }
BOOL CALLBACK AnswerDlgProc( HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam ) { static PINSTANCE_DATA pInst;
switch(iMsg) {
case WM_INITDIALOG:
pInst = (PINSTANCE_DATA) lParam;
pInst->hAnswerDlg = hDlg;
return TRUE;
case WM_COMMAND:
switch(LOWORD( wParam )) { case IDYES: case IDNO:
EndDialog( hDlg, LOWORD( wParam ) );
pInst->hAnswerDlg = NULL;
return TRUE; } break; } return FALSE; }
BOOL CALLBACK EventDlgProc( HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam ) { LV_COLUMN lvc = {0}; HWND hWndCtrl = GetDlgItem( hDlg, IDC_LIST1 ); PLIST_ENTRY Next; TCHAR StrBuf[STR_SIZE]; static PINSTANCE_DATA pInst;
switch(iMsg) {
case WM_INITDIALOG: lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
pInst = (PINSTANCE_DATA) lParam;
LoadString( pInst->hInstance, IDS_TIMELABEL, StrBuf, STR_SIZE );
lvc.pszText = StrBuf; lvc.iSubItem = 0; lvc.cx = 70; lvc.fmt = LVCFMT_LEFT; ListView_InsertColumn( hWndCtrl, 0, &lvc );
LoadString( pInst->hInstance, IDS_EVENTLABEL, StrBuf, STR_SIZE );
lvc.pszText = StrBuf; lvc.iSubItem = 1; lvc.cx = 180; lvc.fmt = LVCFMT_LEFT; ListView_InsertColumn( hWndCtrl, 1, &lvc );
if (!IsListEmpty( &EventListHead )) { PEVENT_RECORD EventRecord;
for (Next = EventListHead.Flink; Next != &EventListHead; Next = Next->Flink) {
EventRecord = CONTAINING_RECORD( Next, EVENT_RECORD, ListEntry );
InsertEventDialog( hDlg, EventRecord ); } }
pInst->hEventDlg = hDlg;
return TRUE;
case WM_COMMAND:
switch(LOWORD( wParam )) { case IDOK: case IDCANCEL:
EndDialog( hDlg, 0 );
pInst->hEventDlg = NULL;
return TRUE; } break; } return FALSE; }
VOID InsertEventDialog( HWND hDlg, PEVENT_RECORD pEventRecord ) { LV_ITEM lvi = {0}; HWND hWndCtrl = GetDlgItem( hDlg, IDC_LIST1 ); INT iItem; TCHAR TimeBuf[STR_SIZE];
GetTimeFormat( LOCALE_USER_DEFAULT, 0, &pEventRecord->Time, NULL, TimeBuf, STR_SIZE );
lvi.pszText = TimeBuf; lvi.iItem = ListView_GetItemCount( hWndCtrl ); lvi.iSubItem = 0; lvi.mask = LVIF_TEXT; iItem = ListView_InsertItem( hWndCtrl, &lvi );
lvi.pszText = pEventRecord->StrBuf; lvi.iItem = iItem; lvi.iSubItem = 1; lvi.mask = LVIF_TEXT; ListView_SetItem( hWndCtrl, &lvi );
ListView_Scroll( hWndCtrl, 0, iItem ); }
LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) { static DWORD EventId; static DWORD LastEventId = 0; static const DWORD monitorHelpIDs[] = {
IDC_FAXEND, IDH_FAXMONITOR_END_CALL, IDC_DETAILS, IDH_FAXMONITOR_DETAILS, IDC_STATUS, IDH_FAXMONITOR_STATUS, IDC_ANSWER_NEXT_CALL, IDH_FAXMONITOR_ANSWER_NEXT_CALL, 0, 0 }; PFAX_DEVICE_STATUS FaxDeviceStatus;
switch(iMsg) {
case WM_CREATE:
CenterWindow( hWnd, GetDesktopWindow() );
return 0;
case TRAYCALLBACK:
switch (lParam) { case WM_LBUTTONDOWN: MyShowWindow( hWnd, TRUE );
return 0;
case WM_RBUTTONDOWN: //
// execute the control panel applet
// if the property page number ever changes, it must be changed
// here also
//
ShellExecute( hWnd, TEXT( "open" ), TEXT( "rundll32" ), TEXT( "shell32.dll,Control_RunDLL faxcfg.cpl,Fax,7" ), TEXT( "." ), SW_SHOWNORMAL ); return 0; }
break;
case CONFIGUPDATE:
GetConfiguration();
if (IsOptionOn( Config.ManualAnswerEnabled )) {
EnableWindow( GetDlgItem( hWnd, IDC_ANSWER_NEXT_CALL ), TRUE );
} else {
CheckDlgButton( hWnd, IDC_ANSWER_NEXT_CALL, BST_UNCHECKED );
EnableWindow( GetDlgItem( hWnd, IDC_ANSWER_NEXT_CALL ), FALSE ); }
MyShowWindow( hWnd, IsShowing );
return 0;
case ACTIVATE:
MyShowWindow( hWnd, TRUE );
return 0;
case INITANIMATION:
PlayAnimation( GetDlgItem( hWnd, IDC_ANIMATE1 ), IDR_IDLE );
return 0;
case STATUSUPDATE:
LastEventId = EventId;
EventId = wParam;
FaxDeviceStatus = (PFAX_DEVICE_STATUS) lParam;
StatusUpdate( hWnd, EventId, LastEventId, FaxDeviceStatus );
return 0;
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) {
MyShowWindow( hWnd, FALSE );
return 0;
} else { break; }
case WM_COMMAND:
SetFocus( hWnd );
switch (LOWORD(wParam)) { BOOL rVal; HANDLE PrinterHandle; HWND hButton;
case IDC_FAXEND:
hButton = GetDlgItem( hWnd, LOWORD(wParam));
if (IsWindowEnabled( hButton )) {
if (HIWORD(wParam)) { // accelerator key
SendMessage( hButton, BM_SETSTATE, 1, 0 );
SendMessage( hButton, BM_SETSTATE, 0, 0 ); }
rVal = OpenPrinter( FaxStat.PrinterName, &PrinterHandle, NULL );
rVal = SetJob( PrinterHandle, FaxStat.JobId, 0, NULL, JOB_CONTROL_CANCEL );
ClosePrinter( PrinterHandle );
EnableWindow( hButton, FALSE);
SendMessage( hWnd, STATUSUPDATE, FEI_ABORTING, 0 ); }
break;
case IDC_DETAILS:
if (HIWORD(wParam)) { // accelerator key
SendMessage( GetDlgItem( hWnd, LOWORD(wParam)), BM_SETSTATE, 1, 0 );
SendMessage( GetDlgItem( hWnd, LOWORD(wParam)), BM_SETSTATE, 0, 0 ); }
DialogBoxParam( FaxStat.hInstance, MAKEINTRESOURCE( IDD_DETAILS ), hWnd, EventDlgProc, (LPARAM) &FaxStat );
break;
case IDC_EXIT:
if (IsOnTaskBar) { Shell_NotifyIcon( NIM_DELETE, &IconData ); } Disconnect(); PostQuitMessage( 0 ); break;
case IDC_ANSWER_NEXT_CALL:
if (IsWindowEnabled( GetDlgItem( hWnd, IDC_ANSWER_NEXT_CALL ))) {
CheckDlgButton( hWnd, IDC_ANSWER_NEXT_CALL, IsDlgButtonChecked( hWnd, IDC_ANSWER_NEXT_CALL ) == BST_CHECKED ? BST_UNCHECKED : BST_CHECKED );
Config.AnswerNextCall = IsDlgButtonChecked( hWnd, IDC_ANSWER_NEXT_CALL ); } break;
}
return 0;
case WM_DESTROY: PostQuitMessage( 0 ); return 0;
case WM_HELP: case WM_CONTEXTMENU:
FAXWINHELP( iMsg, wParam, lParam, monitorHelpIDs );
return 0; }
return DefWindowProc( hWnd, iMsg, wParam, lParam ); }
VOID InitializeEventList( VOID ) { InitializeListHead( &EventListHead ); EventCount = 0; }
PEVENT_RECORD InsertEventRecord( DWORD EventId, LPTSTR String ) { PEVENT_RECORD NewEvent; PLIST_ENTRY pListEntry;
if (EventCount == MAX_EVENTS) {
pListEntry = RemoveHeadList( &EventListHead ); NewEvent = CONTAINING_RECORD( pListEntry, EVENT_RECORD, ListEntry );
} else { NewEvent = MemAlloc( sizeof(EVENT_RECORD) ); EventCount++; }
GetLocalTime( &NewEvent->Time );
NewEvent->EventId= EventId;
_tcscpy( NewEvent->StrBuf, String );
InsertTailList( &EventListHead, &NewEvent->ListEntry );
return NewEvent; }
DWORD MapStatusIdToEventId( DWORD StatusId ) { DWORD EventId = 0;
if (StatusId & FPS_AVAILABLE) { StatusId &= FPS_AVAILABLE; }
switch( StatusId ) { case FPS_DIALING: EventId = FEI_DIALING; break;
case FPS_SENDING: EventId = FEI_SENDING; break;
case FPS_RECEIVING: EventId = FEI_RECEIVING; break;
case FPS_COMPLETED: EventId = FEI_COMPLETED; break;
case FPS_BUSY: EventId = FEI_BUSY; break;
case FPS_NO_ANSWER: EventId = FEI_NO_ANSWER; break;
case FPS_BAD_ADDRESS: EventId = FEI_BAD_ADDRESS; break;
case FPS_NO_DIAL_TONE: EventId = FEI_NO_DIAL_TONE; break;
case FPS_DISCONNECTED: EventId = FEI_DISCONNECTED; break;
case FPS_FATAL_ERROR: EventId = FEI_FATAL_ERROR; break;
case FPS_NOT_FAX_CALL: EventId = FEI_NOT_FAX_CALL; break;
case FPS_CALL_DELAYED: EventId = FEI_CALL_DELAYED; break;
case FPS_CALL_BLACKLISTED: EventId = FEI_CALL_BLACKLISTED; break;
case FPS_RINGING: EventId = FEI_RINGING; break;
case FPS_ABORTING: EventId = FEI_ABORTING; break;
case FPS_ROUTING: EventId = FEI_ROUTING; break;
case FPS_AVAILABLE: EventId = FEI_IDLE; break;
case FPS_ANSWERED: EventId = FEI_ANSWERED; break; }
return EventId; }
VOID FitRectToScreen( PRECT prc ) { INT cxScreen; INT cyScreen; INT delta;
cxScreen = GetSystemMetrics(SM_CXSCREEN); cyScreen = GetSystemMetrics(SM_CYSCREEN);
if (prc->right > cxScreen) { delta = prc->right - prc->left; prc->right = cxScreen; prc->left = prc->right - delta; }
if (prc->left < 0) { delta = prc->right - prc->left; prc->left = 0; prc->right = prc->left + delta; }
if (prc->bottom > cyScreen) { delta = prc->bottom - prc->top; prc->bottom = cyScreen; prc->top = prc->bottom - delta; }
if (prc->top < 0) { delta = prc->bottom - prc->top; prc->top = 0; prc->bottom = prc->top + delta; } }
VOID CenterWindow( HWND hWnd, HWND hwndToCenterOver ) { RECT rc; RECT rcOwner; RECT rcCenter; HWND hwndOwner;
GetWindowRect( hWnd, &rc );
if (hwndToCenterOver) { hwndOwner = hwndToCenterOver; GetClientRect( hwndOwner, &rcOwner ); } else { hwndOwner = GetWindow( hWnd, GW_OWNER ); if (!hwndOwner) { hwndOwner = GetDesktopWindow(); } GetWindowRect( hwndOwner, &rcOwner ); }
//
// Calculate the starting x,y for the new
// window so that it would be centered.
//
rcCenter.left = rcOwner.left + (((rcOwner.right - rcOwner.left) - (rc.right - rc.left)) / 2);
rcCenter.top = rcOwner.top + (((rcOwner.bottom - rcOwner.top) - (rc.bottom - rc.top)) / 2);
rcCenter.right = rcCenter.left + (rc.right - rc.left); rcCenter.bottom = rcCenter.top + (rc.bottom - rc.top);
FitRectToScreen( &rcCenter );
SetWindowPos(hWnd, NULL, rcCenter.left, rcCenter.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER); }
VOID MyShowWindow( HWND hWnd, BOOL visible ) { HWND hWndInsertAfter; DWORD Flags;
Flags = SWP_NOSIZE | SWP_NOMOVE;
hWndInsertAfter = IsOptionOn( Config.OnTop ) ? HWND_TOPMOST : HWND_NOTOPMOST;
Flags |= visible ? SWP_SHOWWINDOW : SWP_HIDEWINDOW;
SetWindowPos( hWnd, hWndInsertAfter, 0, 0, 0, 0, Flags );
if (visible) { SetForegroundWindow( hWnd ); } else { SetProcessWorkingSetSize( GetCurrentProcess(), 0xffffffff, 0xffffffff ); }
IsShowing = visible;
if (IsOptionOn( Config.TaskBar ) && !IsOnTaskBar) {
IconData.uID = (UINT) IDI_ICON1; IconData.cbSize = sizeof(NOTIFYICONDATA); IconData.hWnd = FaxStat.hWnd; IconData.uCallbackMessage = TRAYCALLBACK; IconData.hIcon = LoadIcon( FaxStat.hInstance, MAKEINTRESOURCE( IDI_ICON1 ) ); IconData.uFlags = NIF_ICON | NIF_MESSAGE;
Shell_NotifyIcon( NIM_ADD, &IconData ); IsOnTaskBar = TRUE;
} else if (!IsOptionOn( Config.TaskBar ) && IsOnTaskBar) {
Shell_NotifyIcon( NIM_DELETE, &IconData ); IsOnTaskBar = FALSE; }
}
VOID GetConfiguration( VOID ) { HKEY HKey;
HKey = OpenRegistryKey( HKEY_CURRENT_USER, REGKEY_FAX_USERINFO, FALSE, KEY_READ );
if (HKey == NULL) { DebugPrint(( TEXT("Cannot open HKEY_CURRENT_USER") )); return; }
Config.OnTop = GetRegistryDword( HKey, REGVAL_ALWAYS_ON_TOP ); Config.TaskBar = GetRegistryDword( HKey, REGVAL_TASKBAR ); Config.VisualNotification = GetRegistryDword( HKey, REGVAL_VISUAL_NOTIFICATION ); Config.SoundNotification = GetRegistryDword( HKey, REGVAL_SOUND_NOTIFICATION ); Config.ManualAnswerEnabled = GetRegistryDword( HKey, REGVAL_ENABLE_MANUAL_ANSWER );
RegCloseKey( HKey ); }
VOID PlayAnimation( HWND hWnd, DWORD Animation ) { static DWORD AnimationPlaying = 0;
if (Animation == AnimationPlaying) { return; }
if (AnimationPlaying == 0) { Animate_Close( hWnd ); }
Animate_Open( hWnd, MAKEINTRESOURCE( Animation ) );
Animate_Play( hWnd, 0, -1, -1 );
AnimationPlaying = Animation; }
|