GFX_NULL
 
    Использование GFX_NULL драйвера в Windows

    Клиентская область окна обновляется, используя GfxLib. Меню, тулбары или диалоги могут быть добавлены в окно, используя обычные вызовы Win API.

    '' Пример использует GFX_NULL драйвер в windows
    '' GfxLib устанавливается в процедуре ON_Create
    '' GFXLib буфер рисуется в процедуре On_Paint
    '' GfXLib обновляется в цикле событий

    #include "fbgfx.bi"
    #include once "windows.bi"

    Using fb

    Dim Shared bmi As bitmapv4header
    Dim Shared mywin As rect

    ''
    ''--------------------------------------------------------------------------
    Function on_paint(ByVal hwnd As HWND,ByVal wparam As WPARAM,ByVal lparam As LPARAM) As Integer

        Dim rct As RECT
        Dim pnt As PAINTSTRUCT
        Dim hDC As HDC

        'рисование GFX буфера на экран
        hDC = BeginPaint(hWnd, @pnt)
        GetClientRect( hWnd, @rct )
        With rct
            StretchDIBits hDC, 0, 0,.Right-.Left+1,.bottom-.top+1, 0, 0, .Right-.Left+1,_
                .bottom-.top+1,ScreenPtr,CPtr(bitmapinfo Ptr, @bmi), DIB_RGB_COLORS, SRCCOPY
        End With

        EndPaint hWnd, @pnt

        Function = 0

    End Function     

    ''
    ''---------------------------------------------------------------------------
    Function on_Create(ByVal hwnd As HWND,ByVal wparam As WPARAM,ByVal lparam As LPARAM) As Integer
        Dim rct As RECT
        'Установка размера gfxscreen в клиентской области
        GetClientRect( hWnd, @mywin)
        ScreenRes mywin.right+1,mywin.bottom+1, 32, 1, GFX_NULL
        'и создание bmp заголовка, требуется, чтобы нарисовать его на экран
        With bmi
          .bV4Size = Len(BITMAPV4HEADER)
          .bv4width=mywin.right+1
          .bv4height=-(mywin.bottom+1)   'отрицательное значение => сверху вниз BMP
                                         '(стандартный bmp является снизу вверх)
          .bv4planes=  1
          .bv4bitcount=32
          .bv4v4compression=0
          .bv4sizeimage=mywin.right+1*mywin.bottom+1*4
          .bV4RedMask = &h0F00
          .bV4GreenMask = &h00F0
          .bV4BlueMask = &h000F
          .bV4AlphaMask = &hF000
        End With

        Function = 0

    End Function

    ''
    ''---------------------------------------------------------------------------
    Function on_Destroy(ByVal hwnd As HWND,ByVal wparam As WPARAM,ByVal lparam As LPARAM) As Integer
        'посылаем системе сообщение о прекращении работы программы....
        PostQuitMessage( 0 )

        Function = 0

    End Function

    ''
    ''----------------------------------------------------------------------------
    Function WndProc ( ByVal hWnd As HWND,ByVal message As UINT, _
                       ByVal wParam As WPARAM,ByVal lParam As LPARAM ) As LRESULT
       
        Function = 0

        Select Case As Const  message
        Case WM_CREATE
            Function = On_create(hwnd,wparam,lparam)
        Case WM_PAINT
            Function = On_paint(hwnd,wparam,lparam)
        Case WM_DESTROY
            Function = On_destroy(hwnd,wparam,lparam)
        Case Else
            Function = DefWindowProc( hWnd, message, wParam, lParam )   
        End Select

    End Function

    ''
    ''------------------------------------------------------------------------------
    ''Основная программа создать окно + цикл событий

        Dim wMsg As MSG
        Dim wcls As WNDCLASS     
        Dim szAppName As ZString * 30 => "Random Rectangles"
        Dim hWnd As HWND
        Dim i As Integer

        With wcls
            .style         = CS_HREDRAW Or CS_VREDRAW
            .lpfnWndProc   = @WndProc
            .cbClsExtra    = 0
            .cbWndExtra    = 0
            .hInstance     = GetModuleHandle( null )
            .hIcon         = LoadIcon( NULL, IDI_APPLICATION )
            .hCursor       = LoadCursor( NULL, IDC_ARROW )
            .hbrBackground = GetStockObject(WHITE_BRUSH )
            .lpszMenuName  = NULL
            .lpszClassName = @szAppName
        End With

        If( RegisterClass( @wcls ) = FALSE ) Then 
            End
        End If

        'сделать неизменяемый экран
        hWnd = CreateWindowEx( 0,szAppName,"Example of GFX_NULL",_
            WS_OVERLAPPEDWINDOW And Not (WS_sizebox Or ws_maximizebox),_
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, _
            NULL,NULL, wcls.hinstance,NULL )

        ShowWindow( hWnd, SW_NORMAL )
        UpdateWindow( hWnd )

        While 1
            If PeekMessage( @wMsg, NULL, 0,0, PM_Remove) Then   
                If wmsg.message=WM_QUIT Then 
                    Exit While
                End If
                TranslateMessage( @wMsg )
                DispatchMessage( @wMsg )
            Else
                'обновление gfx буфера
                Line (Rnd*mywin.right,Rnd*mywin.bottom)-(Rnd*mywin.right,Rnd*mywin.bottom),_
                RGB(Rnd*255,Rnd*255,Rnd*255),bf
                redrawwindow (hwnd,0,0,rdw_invalidate)
            End If
        Wend

        End wMsg.wparam