clover.for

来自「开放源码的编译器open watcom 1.6.0版的源代码」· FOR 代码 · 共 185 行

FOR
185
字号
! Clover drawing program using regions.

*$include winapi.fi

        integer*2 function FWINMAIN( hInstance,
     &                               hPrevInstance,
     &                               lpszCmdLine,
     &                               nCmdShow )

        integer*2 hInstance
        integer*2 hPrevInstance
        integer*4 lpszCmdLine
        integer*2 nCmdShow

        include 'wincreat.fi'
        include 'wincurs.fi'
        include 'windefn.fi'
        include 'windisp.fi'
        include 'winmsg.fi'
        include 'windtool.fi'
        include 'winutil.fi'

        external WndProc

        integer*2               hWnd
        record /MSG/            msg
        record /WNDCLASS/       wndclass
        character*7             AppName

        data AppName/'Clover'/ AppName(7:7)/'00'x/

        if( hPrevInstance .eq. NULL_HANDLE )then
            wndclass.style = CS_HREDRAW .or. CS_VREDRAW
            wndclass.lpfnWndProc = Loc( WndProc )
            wndclass.cbClsExtra = 0
            wndclass.cbWndExtra = 0
            wndclass.hInstance = hInstance
            wndclass.hIcon = NULL_HANDLE
            wndclass.hCursor = LoadCursor( NULL_HANDLE, IDC_ARROW )
            wndclass.hbrBackground = GetStockObject( WHITE_BRUSH )
            wndclass.lpszMenuName = NULL
            wndclass.lpszClassName = Loc( AppName )
            if( RegisterClass( wndclass ) .eq. 0 )then
                FWINMAIN = 0
            end if
        end if

        hWnd = CreateWindow( AppName,
     &                       AppName,
     &                       WS_OVERLAPPEDWINDOW,
     &                       CW_USEDEFAULT,
     &                       0,
     &                       CW_USEDEFAULT,
     &                       0,
     &                       NULL_HANDLE,
     &                       NULL_HANDLE,
     &                       hInstance,
     &                       NULL )
        call ShowWindow( hWnd, nCmdShow )
        call UpdateWindow( hWnd )

        while( GetMessage( msg, NULL_HANDLE, 0, 0 ) .ne. 0 )do
            call TranslateMessage( msg )
            call DispatchMessage( msg )
        end while

        FWINMAIN = msg.wParam

        end

*$pragma aux (callback) WndProc parm( value, value, value, value )

        integer*4 function WndProc( HWnd, iMessage, wParam, lParam )

        integer*2 hWnd
        integer*2 iMessage
        integer*2 wParam
        integer*4 lParam

        include 'windefn.fi'
        include 'wincurs.fi'
        include 'wincreat.fi'
        include 'winline.fi'
        include 'winmap.fi'
        include 'winmsg.fi'
        include 'winmsgs.fi'
        include 'winpaint.fi'
        include 'winrgn.fi'
        include 'windtool.fi'
        include 'winutil.fi'

        double precision TWO_PI
        parameter ( TWO_PI = 2 * 3.14159 )

        integer*2               hRgnClip
        integer*2               xClient, yClient
        double precision        fAngle, fRadius
        integer*2               hCursor
        integer*2               hDC
        integer*2               hRgnTemp(6)
        record /PAINTSTRUCT/    ps
        integer                 i
        double precision        hypot, x, y

        save hRgnClip, xClient, yClient

        data hRgnClip/NULL_HANDLE/

        hypot( x, y ) = sqrt( x**2 + y**2 )

        select( iMessage )
        case( WM_SIZE )
            xClient = LOWORD( lParam )
            yClient = HIWORD( lParam )

            hCursor = SetCursor( LoadCursor( NULL_HANDLE, IDC_WAIT ) )
            call ShowCursor( 1 )

            if( hRgnClip .ne. NULL_HANDLE )then
                call DeleteObject( hRgnClip )
            end if

            hRgnTemp(1) = CreateEllipticRgn( 0,
     &                                       yClient / 3,
     &                                       xClient / 2,
     &                                       2 * yClient / 3 )
            hRgnTemp(2) = CreateEllipticRgn( xClient / 2,
     &                                       yClient / 3,
     &                                       xClient,
     &                                       2 * yClient / 3 )
            hRgnTemp(3) = CreateEllipticRgn( xClient / 3,
     &                                       0,
     &                                       2 * xClient / 3,
     &                                       yClient / 2 )
            hRgnTemp(4) = CreateEllipticRgn( xClient / 3,
     &                                       yClient / 2,
     &                                       2 * xClient / 3,
     &                                       yClient )
            hRgnTemp(5) = CreateRectRgn( 0, 0, 1, 1 )
            hRgnTemp(6) = CreateRectRgn( 0, 0, 1, 1 )
            hRgnClip = CreateRectRgn( 0, 0, 1, 1 )

            call CombineRgn( hRgnTemp(5), hRgnTemp(1), hRgnTemp( 2 ),
     &                       RGN_OR )
            call CombineRgn( hRgnTemp(6), hRgnTemp(3), hRgnTemp( 4 ),
     &                       RGN_OR )
            call CombineRgn( hRgnClip, hRgnTemp(5), hRgnTemp( 6 ),
     &                       RGN_XOR )

            do i = 1, 6
                call DeleteObject( hRgnTemp(i) )
            end do

            call SetCursor( hCursor )
            call ShowCursor( 0 )
        case( WM_PAINT )
            hDC = BeginPaint( hWnd, ps )

            call SetViewportOrg( hDC, xClient / 2, yClient / 2 )
            call SelectClipRgn( hDC, hRgnClip )

            fRadius = hypot( xClient / 2d0, yClient / 2d0 )

            fAngle = 0.0
            while( fAngle .lt. TWO_PI )do
                call MoveTo( hDC, 0, 0 )
                call LineTo( hDC,
     &                 hfix( real( fRadius * cos( fAngle ) + .5 ) ),
     &                 hfix( real( (-fRadius) * sin( fAngle ) + .5 ) ) )
                fAngle = fAngle + TWO_PI / 360
            end while

            call EndPaint( hWnd, ps )
        case( WM_DESTROY )
            call DeleteObject( hRgnClip )
            call PostQuitMessage( 0 )
        case default
            WndProc = DefWindowProc( hWnd, iMessage, wParam, lParam )
            return
        end select

        WndProc = 0

        end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?