www.pudn.com > DNW0-50A.rar > Engine.cpp
// ============================================= // Program Name: engine // ============================================= #define STRICT #define WIN32_LEAN_AND_MEAN #include#include #pragma hdrstop #include #include #include #include //for _vsntprintf() #include "resource.h" #include "engine.h" #include "dnw.h" #include "fileopen.h" #include "font.h" #include "d_box.h" #include "usbtxrx.h" #pragma warning (disable : 4100) #pragma warning (disable : 4068) TCHAR szAppName[] = APPNAME; HINSTANCE _hInstance; HWND _hwnd; static HWND _hwndEdit; #define EDITID 1 #define MAX_EDIT_BUF_SIZE (0x7FFE) #define EDIT_BUF_SIZE (0x6000) #define EDIT_BUF_DEC_SIZE (0x2000) //1) Why program doesn't work when EDIT_BUF_SIZE=50000? // If the data size of the edit box is over about 30000, // EM_REPLACESEL message needs very long time. // So,EDIT_BUF_SIZE is limited to 30000. // If the size is bigger than 30000, the size will be decreased by 5000. //2) WM_CLEAR to the edit box doesn't work. only, EM_REPLACESEL message works. // ============================================== // INITIALIZATION // ============================================== ////////////////////////////////////// // The WinMain function is the program entry point. ////////////////////////////////////// #pragma argsused int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { MSG Msg; _hInstance = hInst; //OutputDebugString(""); if (!Register(hInst)) return FALSE; if (!Create(hInst, nCmdShow)) return FALSE; while (GetMessage(&Msg, NULL, 0, 0)) { if( _hDlgDownloadProgress ==0 || !IsDialogMessage(_hDlgDownloadProgress,&Msg) ) //To throw the message to dialog box procedure { TranslateMessage(&Msg); //To intercept key-board input instead of edit control. if(Msg.message==WM_CHAR) SendMessage(_hwnd,WM_CHAR,Msg.wParam,Msg.lParam); else //2000.1.26 DispatchMessage(&Msg); //EB_Printf("."); //for debug } } return Msg.wParam; } ////////////////////////////////////// // Register Window ////////////////////////////////////// BOOL Register(HINSTANCE hInst) { #if 0 WNDCLASS WndClass; WndClass.style = CS_HREDRAW | CS_VREDRAW; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInst; WndClass.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)); WndClass.hCursor = LoadCursor(NULL,IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); WndClass.lpszClassName = szAppName; return (RegisterClass (&WndClass) != 0); #else WNDCLASSEX WndClass; WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.style = CS_HREDRAW | CS_VREDRAW; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInst; WndClass.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)); WndClass.hCursor = LoadCursor(NULL,IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); WndClass.lpszClassName = szAppName; WndClass.hIconSm = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON2)); return (RegisterClassEx(&WndClass) != 0); #endif } ////////////////////////////////////// // Create the window and show it. ////////////////////////////////////// BOOL Create(HINSTANCE hInst, int nCmdShow) { HWND hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW /*&(~(WS_SIZEBOX|WS_MAXIMIZEBOX|WS_MINIMIZEBOX))*/, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_XSIZE,WINDOW_YSIZE, NULL, NULL, hInst, NULL); if (hwnd == NULL) return FALSE; //_hwnd=hwnd; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); return TRUE; } //============================================== // IMPLEMENTATION //============================================== LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { //static HINSTANCE hInst; switch(Message) { case WM_CREATE: //PlaySound(TEXT("d:\\windows\\media\\chimes.wav"),NULL,SND_FILENAME|SND_ASYNC); _hwnd=hwnd; PopFileInitialize(hwnd); SetTimer(hwnd,1,1000,NULL); // Create the edit control child window _hwndEdit = CreateWindow (TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | /*WS_HSCROLL |*/ WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_READONLY | /*ES_NOHIDESEL|*/ ES_AUTOVSCROLL /*|ES_AUTOHSCROLL*/ , 0, 0,SCREEN_X,SCREEN_Y, hwnd, (HMENU)EDITID, ((LPCREATESTRUCT)lParam)->hInstance, NULL); SetFont(_hwndEdit); SendMessage(_hwndEdit, EM_SETLIMITTEXT, MAX_EDIT_BUF_SIZE, 0L); ReadUserConfig(); //To get serial settings return 0; case WM_COMMAND: if(lParam==0) //is menu command? { switch(LOWORD(wParam)) { case CM_CONNECT: MenuConnect(hwnd); break; case CM_TRANSMIT: MenuTransmit(hwnd); break; case CM_OPTIONS: MenuOptions(hwnd); break; case CM_USBTRANSMIT: MenuUsbTransmit(hwnd); break; case CM_USBRECEIVE: MenuUsbReceive(hwnd); break; case CM_USBSTATUS: MenuUsbStatus(hwnd); break; case CM_ABOUT: MenuAbout(hwnd); break; } return 0; } else return 0; break; // WM_PAINT should be processed on DefWindowProc(). // If there is WM_PAINT, there should be UpdateWindow(_hwndEdit). /* case WM_PAINT: UpdateWindow(_hwndEdit); return 0; */ case WM_DESTROY: KillTimer(hwnd,1); Quit(hwnd); ReleaseFont(); PostQuitMessage(0); return 0; case WM_TIMER: switch(wParam) { case 1: UpdateWindowTitle(); break; default: break; } return 0; case WM_SIZE : MoveWindow (_hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE); return 0 ; //If the size of the parent window is not adjustable, //WM_SIZE message is not received. //If the size of the parent window is adjustable, //WM_SIZE message is received although window size is not changed. //MoveWindow(,,,,,TRUE) will make WM_PAINT. //If DefWindowProc() doesn't process WM_PAINT and WM_PAINT is processed by user, //UpdateWindow(_hwndEdit) is should be executed inide WM_PAINT case, //which update the child window. case WM_CHAR: WriteCommBlock((char)wParam); //UNICODE problem!!! return 0; /* case WM_CTLCOLOR: //for changing FONT & COLOR if ( HIWORD(lParam) == CTLCOLOR_EDIT ) { // Set the text background color. SetBkColor(wParam, RGB(128,128,128)); // Set the text foreground color. SetTextColor(wParam, RGB(255, 255, 255) ); // Return the control background brush. return GetStockObject(LTGRAY_BRUSH); } else return GetStockObject(WHITE_BRUSH); */ } return DefWindowProc(hwnd, Message, wParam, lParam); } //8: \b //13: \r // 1)about EM_SETSEL message arguments // start_position,end_position // The selected character is from start_position to end_position-1; // So, We should do +1 to the position of last selected character. // 2)The char index start from 0. // 3)WM_CLEAR,WM_CUT doesn't operate on EM_SETSEL chars. #define STRING_LEN 4096 volatile static int isUsed=0; void EB_Printf(TCHAR *fmt,...) { va_list ap; int i,slen,lineIdx; int txtRepStart,txtRepEnd,txtSelEnd; static int wasCr=0; //should be static type. static TCHAR string[STRING_LEN+4096]; //margin for '\b' static TCHAR string2[STRING_LEN+4096]; //margin for '\n'->'\r\n' static int prevBSCnt=0; int str2Pt=0; while(isUsed==1); //EB_Printf can be called multiplely //KIW txtRepStart=SendMessage(_hwndEdit,WM_GETTEXTLENGTH,0x0,0x0); txtRepEnd=txtRepStart-1; va_start(ap,fmt); _vsntprintf(string2,STRING_LEN-1,fmt,ap); va_end(ap); string2[STRING_LEN-1]='\0'; //for better look of BS(backspace) char., //the BS in the end of the string will be processed next time. for(i=0;i 0) { string2[--str2Pt]='\0'; txtRepEnd--; continue; } //str2Pt==0; if(txtRepStart>0) { txtRepStart--; } continue; } string2[str2Pt++]=string[i]; txtRepEnd++; // if(str2Pt>256-3)break; //why needed? 2001.1.26 } string2[str2Pt]='\0'; if(str2Pt>0) { SendMessage(_hwndEdit,EM_SETSEL,txtRepStart,txtRepEnd+1); SendMessage(_hwndEdit,EM_REPLACESEL,0,(LPARAM)string2); } else { if(txtRepStart<=txtRepEnd) { SendMessage(_hwndEdit,EM_SETSEL,txtRepStart,txtRepEnd+1); SendMessage(_hwndEdit,EM_REPLACESEL,0,(LPARAM)""); } } //If edit buffer is over EDIT_BUF_SIZE, //the size of buffer must be decreased by EDIT_BUF_DEC_SIZE. if(txtRepEnd>EDIT_BUF_SIZE) { lineIdx=SendMessage(_hwndEdit,EM_LINEFROMCHAR,EDIT_BUF_DEC_SIZE,0x0); //lineIdx=SendMessage(_hwndEdit,EM_LINEFROMCHAR,txtRepEnd-txtRepStart+1,0x0); //for debug txtSelEnd=SendMessage(_hwndEdit,EM_LINEINDEX,lineIdx,0x0)-1; SendMessage(_hwndEdit,EM_SETSEL,0,txtSelEnd+1); SendMessage(_hwndEdit,EM_REPLACESEL,0,(LPARAM)""); //SendMessage(_hwndEdit,WM_CLEAR,0,0); //WM_CLEAR doesn't work? Why? //SendMessage(_hwndEdit,WM_CUT,0,0); //WM_CUT doesn't work? Why? //make the end of the text shown. txtRepEnd=SendMessage(_hwndEdit,WM_GETTEXTLENGTH,0x0,0x0)-1; SendMessage(_hwndEdit,EM_SETSEL,txtRepEnd+1,txtRepEnd+2); SendMessage(_hwndEdit,EM_REPLACESEL,0,(LPARAM)" "); SendMessage(_hwndEdit,EM_SETSEL,txtRepEnd+1,txtRepEnd+2); SendMessage(_hwndEdit,EM_REPLACESEL,0,(LPARAM)""); } isUsed=0; }