1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
#include <gtk/gtk.h>
#define WIDTH 500
#define HEIGHT 300
typedef struct APPLICATION
{
GtkWidget *pWin;
GtkWidget *pDrawArea;
GtkWidget *pVBox;
GtkWidget *pScrollBar;
}APPLICATION;
GdkPixmap *pPixmap = NULL;
static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event)
{
if(pPixmap) g_object_unref(pPixmap);
pPixmap = gdk_pixmap_new(widget->window, widget->allocation.width,
widget->allocation.height, -1);
gdk_draw_rectangle (pPixmap, widget->style->white_gc, TRUE, 0, 0,
widget->allocation.width,
widget->allocation.height);
return TRUE;
}
static gboolean draw_cb(GtkWidget *drawArea, GdkEventExpose *event, gpointer userData)
{
gdk_draw_drawable(drawArea->window, drawArea->style->fg_gc[GTK_WIDGET_STATE (drawArea)],
pPixmap, event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
PangoContext *pContext = gtk_widget_get_pango_context(drawArea);
PangoLayout *pLayout = pango_layout_new(pContext);
int i;
for(i = 0; i < 30; i++)
{
pango_layout_set_text (pLayout, "Test clipping", 14);
gdk_draw_layout (drawArea->window, drawArea->style->fg_gc[GTK_WIDGET_STATE(drawArea)],
0,i * 15, pLayout);
}
g_object_unref(pLayout);
return FALSE;
}
int main (int argc, char *argv[])
{
APPLICATION myApp;
gtk_init(&argc, &argv);
myApp.pWin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(myApp.pWin), WIDTH, HEIGHT);
g_signal_connect(G_OBJECT(myApp.pWin), "destroy", G_CALLBACK(gtk_main_quit), NULL);
myApp.pVBox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(myApp.pWin), myApp.pVBox);
myApp.pScrollBar = gtk_scrolled_window_new(NULL,NULL);
gtk_box_pack_start(GTK_BOX(myApp.pVBox), myApp.pScrollBar, TRUE, TRUE, 0);
myApp.pDrawArea = gtk_drawing_area_new ();
gtk_box_pack_start(GTK_BOX(myApp.pScrollBar), myApp.pDrawArea, TRUE, TRUE, 0);
gtk_widget_set_size_request (myApp.pDrawArea, myApp.pWin->allocation.width, 500);
g_signal_connect(G_OBJECT(myApp.pDrawArea),"expose_event",G_CALLBACK(draw_cb), &myApp);
g_signal_connect(G_OBJECT(myApp.pDrawArea),"configure_event", G_CALLBACK (configure_event), NULL);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(myApp.pScrollBar), myApp.pDrawArea);
gtk_window_set_title(GTK_WINDOW(myApp.pWin), "GTK-Win");
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(myApp.pScrollBar), GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC);
gtk_widget_show_all (myApp.pWin);
gtk_main ();
return 0;
} |