📄 mswindow.c
字号:
/***************************************************************************** TEST FILE FOR graph (Dynamic Layout Alg)**** MODUL: class library to interface MS-WINDOWS**** Author: dr. Szirmay-Kalos Laszlo (szirmay@fsz.bme.hu)** Technical University of Budapest, Hungary*****************************************************************************/#include "mswindow.hxx"static AppWindow * pwindow;long FAR PASCAL _export WndProc( unsigned int, unsigned int, unsigned int, long );//-------------------------------------------------------------------void App :: Error( char * message, int line )//-------------------------------------------------------------------{ fprintf( stderr, "ERROR: %s", message ); if ( line >= 0 ) fprintf( stderr, " in line %d", line ); fprintf( stderr, "\n" ); Quit( );}//-------------------------------------------------------------------void App :: Warning( char * message )//-------------------------------------------------------------------{ fprintf( stderr, "ERROR: %s\n", message );}//-------------------------------------------------------------------void App :: Quit( )//-------------------------------------------------------------------{ fprintf( stderr, "Bye ( Graph )\n" ); exit( -1 );}static HANDLE hInstance;static HANDLE hPrevInstance;static int nCmdShow;//-------------------------------------------------------------------AppWindow :: AppWindow( int argc, char * argv[] )//------------------------------------------------------------------- : canvas( 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT ){ WNDCLASS wndclass; pwindow = this; strcpy(szClassName, "GRAPH"); if ( ! hPrevInstance ) { wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = ::WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szClassName; if ( ! RegisterClass( &wndclass ) ) exit( -1 ); } hWnd = CreateWindow( szClassName, // window class name "Graph layout", // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x pos CW_USEDEFAULT, // initial y pos CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial x size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL ); // creation params if ( ! hWnd ) exit( -1 ); ShowWindow( hWnd, nCmdShow );}//-------------------------------------------------------------------RectAngle AppWindow :: Canvas()//-------------------------------------------------------------------{ return canvas;}//-------------------------------------------------------------------void AppWindow :: RePaint()//-------------------------------------------------------------------{ InvalidateRect( hWnd, NULL, TRUE ); // WM_PAINT message}//-------------------------------------------------------------------void AppWindow :: Text( char * text, Point p)//-------------------------------------------------------------------{ TEXTMETRIC tm; GetTextMetrics( hdc, &tm ); TextOut(hdc, p.X() - tm.tmMaxCharWidth / 2, p.Y() - tm.tmHeight / 2, text, strlen( text ));}//-------------------------------------------------------------------void AppWindow :: MoveTo( Point p )//-------------------------------------------------------------------{ ::MoveTo(hdc, p.X(), p.Y() );}//-------------------------------------------------------------------void AppWindow :: LineTo( Point p )//-------------------------------------------------------------------{ ::LineTo(hdc, p.X(), p.Y());}//-------------------------------------------------------------------void AppWindow :: DrawRectangle( RectAngle& rect )//-------------------------------------------------------------------{ RECT r; r.left = rect.HorPos(); r.top = rect.VerPos(); r.right = r.left + rect.Width(); r.bottom = r.top + rect.Height(); FillRect( hdc, &r, GetStockObject( BLACK_BRUSH ) );}//-------------------------------------------------------------------void AppWindow :: MessageLoop()//-------------------------------------------------------------------{ MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }}//-------------------------------------------------------------------// FORWARD EVENT TO EVENT HANDLERS//long AppWindow::WindowProc( HWND hwnd, WORD wmsg, WORD wParam, LONG lParam )//-------------------------------------------------------------------{ hWnd = hwnd; switch ( wmsg ) {//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case WM_PAINT: { // REPAINT WINDOW//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RECT rect; GetClientRect( hWnd, &rect ); canvas = RectAngle( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top ); ExposeEvent evt( &canvas ); hdc = BeginPaint(hWnd, &ps); ExposeAll( &evt ); EndPaint( hWnd, &ps ); } break;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case WM_CHAR: { // KEYBOARD EVENT//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ KeyEvent evt(wParam, lParam); hdc = GetDC( hWnd ); KeyPressed( &evt ); ReleaseDC( hWnd, hdc ); } break;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ case WM_DESTROY: // CLOSE WINDOW//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PostQuitMessage( 0 ); break;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ default: // ALL OTHER EVENTS//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return DefWindowProc( hwnd, wmsg, wParam, lParam ); } return 0;}/********************************************************************* ** MS-WINDOWS INTERFACE *********************************************************************///-------------------------------------------------------------------// EVENT HANDLER, CALLED BY WINDOWS//long FAR PASCAL _export WndProc( unsigned int hWnd, unsigned int message, unsigned int wParam, long lParam )//-------------------------------------------------------------------{ return pwindow->WindowProc( hWnd, message, wParam, lParam );}//-------------------------------------------------------------------// APPLICATION OBJECT//-------------------------------------------------------------------App app;//-------------------------------------------------------------------// PROGRAM ENTRY POINT, CALLED BY WINDOWS//int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow )//-------------------------------------------------------------------{ ::hInstance = hInstance; ::hPrevInstance = hPrevInstance; ::nCmdShow = nCmdShow;/** MAKE argc, argv FROM lpsCmdLine*/ char * argv[20]; argv[0] = new char[ strlen( "graph" ) + 1 ]; strcpy( argv[0], "graph" ); int argc = 1; char far * start = lpszCmdLine; for( char far * ps = lpszCmdLine; *ps != '\0'; ps++ ) { if ( *ps != ' ' && *ps != '\t' ) continue; else if ( ps != start ) { argv[ argc ] = ( char * ) malloc( ps - start + 1); for(int i = 0; i < ps - start; i++ ) argv[argc][i] = start[i]; argv[argc++][i] = '\0'; } } if ( ps != start ) { argv[ argc ] = ( char * )malloc( ps - start + 1); for(int i = 0; i < ps - start; i++ ) argv[argc][i] = start[i]; argv[argc++][i] = '\0'; }/** CALL APPLICATION DEPENDENT ENTRY*/ app.Start( argc, argv ); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -