Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

gfx2gtk.bi

Uploader:MitgliedOneCypher
Datum/Zeit:23.03.2010 20:32:29

#include once "gtk/gtk.bi"

#ifndef NULL
#define NULL 0
#endif

namespace mycrt
    #include "crt.bi"
end namespace

dim shared gtkthread as any ptr

type gfxwin
    public:
    win as GtkWidget ptr
    drawarea as GtkWidget ptr
    width as integer
    height as integer
    fbbuffer as any ptr
    gbuffer as ubyte ptr
    inkey as string
    mouse_x as integer
    mouse_y as integer
    mouse_b as integer
    declare sub refresh()
    declare sub close()
    declare constructor(w as integer, h as integer)
    declare property title as string
    declare property title (v as string)
    private:
    p_title as string
end type

property gfxwin.title as string
    return p_title
end property

property gfxwin.title (v as string)
    p_title = v
    gtk_window_set_title( GTK_WINDOW(win), p_title )
end property

function on_darea_keypress cdecl( byval widget as GtkWidget ptr, byval event as GdkEventKey ptr, byval userdata as gpointer) as gboolean
    with *cast(gfxwin ptr, userdata)
    .inkey = *event->string
    end with
    return true
end function

function on_darea_keyrelease cdecl( byval widget as GtkWidget ptr, byval event as GdkEventKey ptr, byval userdata as gpointer) as gboolean
    with *cast(gfxwin ptr, userdata)
    .inkey = ""
    end with
    return true
end function

function on_darea_clicked cdecl( byval widget as GtkWidget ptr, byval event as GdkEventButton ptr, byval userdata as gpointer) as gboolean
    with *cast(gfxwin ptr, userdata)
    .mouse_b = event->button
    end with
    return true
end function

function on_darea_released cdecl( byval widget as GtkWidget ptr, byval event as GdkEventButton ptr, byval userdata as gpointer) as gboolean
    with *cast(gfxwin ptr, userdata)
    .mouse_b = 0
    end with
    return true
end function

function on_darea_move cdecl( byval widget as GtkWidget ptr, byval event as GdkEventMotion ptr, byval userdata as gpointer) as gboolean
    with *cast(gfxwin ptr, userdata)
    .mouse_x = event->x
    .mouse_y = event->y
    end with
    return true
end function


function on_darea_expose cdecl( byval widget as GtkWidget ptr, byval event as GdkEventExpose ptr, byval userdata as gpointer) as gboolean
    Dim pixdata As ubyte Ptr, pitch As Integer
    dim MyGFX2GTK as gfxwin ptr = cast(any ptr, userdata)
    with *MyGFX2GTK
    imageinfo .fbbuffer, ,,, pitch, pixdata
    dim p as ubyte ptr
    For y As Integer = 0 to .height -1
        p = pixdata + y * pitch
        mycrt.memcpy @.gbuffer[y*.width*4] , p, (.width *4)
    Next
    gdk_draw_rgb_32_image( widget->window, widget->style->fg_gc(GTK_STATE_NORMAL), 0, 0, .WIDTH, .HEIGHT, GDK_RGB_DITHER_MAX, .gbuffer, .WIDTH * 4 )
    end with
    return TRUE
end function

sub gfxwin.refresh()
    on_darea_expose ( drawarea, 0, cast(any ptr, @this))
end sub

sub startgtk()
    gtk_main()
end sub

constructor gfxwin(w as integer, h as integer)
    width = w
    height =h
    fbbuffer = imagecreate(w,h,RGB(0,0,0))
    gbuffer = allocate(4*w*h)
    gtk_init( NULL, NULL )
    win = gtk_window_new( GTK_WINDOW_TOPLEVEL )
    gtk_signal_connect( GTK_OBJECT(win), "delete_event", GTK_SIGNAL_FUNC(@gtk_main_quit), NULL )
    drawarea = gtk_drawing_area_new()
    gtk_widget_set_size_request( drawarea, w, h )
    gtk_container_add( GTK_CONTAINER(win), drawarea )
    gtk_widget_add_events(drawarea, GDK_POINTER_MOTION_MASK)
    gtk_widget_add_events(drawarea, GDK_BUTTON_PRESS_MASK)
    gtk_widget_add_events(drawarea, GDK_BUTTON_RELEASE_MASK)
    gtk_widget_add_events(drawarea, GDK_KEY_PRESS_MASK)
    gtk_widget_add_events(drawarea, GDK_KEY_RELEASE_MASK)
    gtk_widget_set_flags(drawarea, GTK_CAN_FOCUS)
    gtk_signal_connect( GTK_OBJECT(drawarea), "expose-event", GTK_SIGNAL_FUNC(@on_darea_expose), cast(any ptr, @This) )
    gtk_signal_connect( GTK_OBJECT(drawarea), "motion_notify_event", GTK_SIGNAL_FUNC(@on_darea_move), cast(any ptr, @This) )
    gtk_signal_connect( GTK_OBJECT(drawarea), "button_press_event", GTK_SIGNAL_FUNC(@on_darea_clicked), cast(any ptr, @This) )
    gtk_signal_connect( GTK_OBJECT(drawarea), "button_release_event", GTK_SIGNAL_FUNC(@on_darea_released), cast(any ptr, @This) )
    gtk_signal_connect( GTK_OBJECT(drawarea), "key_press_event", GTK_SIGNAL_FUNC(@on_darea_keypress), cast(any ptr, @This) )
    gtk_signal_connect( GTK_OBJECT(drawarea), "key_release_event", GTK_SIGNAL_FUNC(@on_darea_keyrelease), cast(any ptr, @This) )
    gtk_widget_show_all( win )
    if gtkthread = 0 then gtkthread = threadcreate(cast(any ptr, @startgtk))
end constructor