graphics.pp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. program graphics;
  2. {$mode objfpc}
  3. {$h+}
  4. uses glib,gdk,gtk,sysutils;
  5. var
  6. window,
  7. area : PGtkWidget;
  8. Function close_application( widget : PGtkWidget ;
  9. event : PGdkEvent;
  10. data : gpointer) : boolean; cdecl;
  11. Begin
  12. gtk_main_quit();
  13. close_application := false;
  14. End;
  15. Function AllocateColor(R,G,B : Integer; Widget : PGtkWidget) : PGdkColor;
  16. begin
  17. Result:=New(PgdkColor);
  18. With Result^ do
  19. begin
  20. Pixel:=0;
  21. Red:=R;
  22. Blue:=B;
  23. Green:=G;
  24. end;
  25. gdk_colormap_alloc_color(gtk_widget_get_colormap(Widget),Result,true,False);
  26. end;
  27. function Exposed(Widget: PGtkWidget;event : PGdkEventExpose; Data : gpointer) : Integer; cdecl;
  28. Const
  29. Triangle : Array[1..4] of TgdkPoint =
  30. ((X:10;Y:195),(X:110;Y:195),(X:55;Y:145),(X:10;Y:195));
  31. LineStyles : Array[1..5] of TgdkLineStyle =
  32. (GDK_LINE_SOLID, GDK_LINE_ON_OFF_DASH, GDK_LINE_DOUBLE_DASH,
  33. GDK_LINE_ON_OFF_DASH, GDK_LINE_SOLID);
  34. capstyles : Array[1..5] of TgdkCapStyle =
  35. (GDK_CAP_ROUND,GDK_CAP_NOT_LAST, GDK_CAP_BUTT, GDK_CAP_PROJECTING,
  36. GDK_CAP_NOT_LAST);
  37. FontName : Pchar =
  38. '-*-helvetica-bold-r-normal--*-120-*-*-*-*-iso8859-1';
  39. Var
  40. SegTriangle : Array[1..3] of TgdkSegment;
  41. Win : pgdkWindow;
  42. gc : PgdkGC;
  43. i,seg : Integer;
  44. font : PgdkFont;
  45. Angle1,Angle2 : Longint;
  46. begin
  47. gc:=gdk_gc_new(widget^.Window);
  48. Win:=widget^.window;
  49. With Event^.area do
  50. gdk_window_clear_area (win,x,y,width,height);
  51. gdk_gc_set_foreground(gc,allocatecolor(0,0,0,Widget));
  52. gdk_draw_rectangle(win,gc,0,5,5,590,390);
  53. // gdk_draw_rectangle(win,gc,-1,15,15,570,370);
  54. gdk_gc_set_foreground(gc,allocatecolor(0,0,$ffff,Widget));
  55. for I:=10 to 50 do
  56. gdk_draw_point(win,gc,I*10,100);
  57. gdk_gc_set_foreground(gc,allocatecolor($ffff,0,0,Widget));
  58. for I:=10 to 50 do
  59. begin
  60. gdk_gc_set_line_attributes(gc,6,LineStyles[i div 10],CapStyles[i div 10],GDK_JOIN_MITER);
  61. gdk_draw_line(win,gc,I*10,20,I*10,90)
  62. end;
  63. gdk_gc_set_line_attributes(gc,1,GDK_LINE_SOLID,GDK_CAP_BUTT,GDK_JOIN_MITER);
  64. gdk_gc_set_foreground(gc,allocatecolor($ffff,0,$ffff,Widget));
  65. seg:=(360 div 20) * 64;
  66. For I:=1 to 20 do
  67. gdk_draw_arc(win,gc,0,220-I*4,200-i*4,8*i,8*i,i*seg,seg*19);
  68. For I:=1 to 20 do
  69. gdk_draw_arc(win,gc,-1,380-I*4,200-i*4,8*i,8*i,(i-1)*seg,seg);
  70. gdk_gc_set_foreground(gc,allocatecolor(0,$ffff,$ffff,Widget));
  71. gdk_draw_polygon(win,gc,0,@triangle[1],4);
  72. For I:=1 to 4 do
  73. Triangle[i].Y:=400-Triangle[i].y;
  74. gdk_draw_polygon(win,gc,-1,@triangle[1],4);
  75. gdk_gc_set_foreground(gc,allocatecolor(0,$ffff,0,Widget));
  76. For I:=1 to 4 do
  77. Triangle[i].X:=600-Triangle[i].x;
  78. gdk_draw_lines(win,gc,@triangle[1],4);
  79. For I:=1 to 3 do
  80. begin
  81. SegTriangle[i].X1:=Triangle[i].X;
  82. SegTriangle[i].Y1:=400-Triangle[i].Y;
  83. SegTriangle[i].X2:=Triangle[i+1].X;
  84. SegTriangle[i].Y2:=400-Triangle[i+1].Y;
  85. end;
  86. gdk_draw_segments(win,gc,@segtriangle[1],3);
  87. font:=gdk_font_load(FontName);
  88. gdk_gc_set_foreground(gc,allocatecolor($ffff,$ffff,0,Widget));
  89. For I:=1 to 4 do
  90. gdk_draw_string(win,font,gc,I*100,300,Pchar(format('String %d',[i])));
  91. result:=0;
  92. end;
  93. Begin
  94. // Initialize GTK and create the main window
  95. gtk_init( @argc, @argv );
  96. window := gtk_window_new( GTK_WINDOW_TOPLEVEL );
  97. gtk_window_set_policy(PgtkWindow(Window),0,0,1);
  98. gtk_signal_connect (GTK_OBJECT (window), 'delete_event',
  99. GTK_SIGNAL_FUNC( @close_application ), NIL);
  100. gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  101. area := gtk_drawing_area_new();
  102. gtk_container_add( GTK_CONTAINER(window), Area);
  103. gtk_signal_connect (GTK_OBJECT (area),'expose_event',
  104. GTK_SIGNAL_FUNC(@Exposed),Nil);
  105. gtk_drawing_area_size (PGTKDRAWINGAREA(area),600,400);
  106. gtk_widget_show_all( window );
  107. gtk_main();
  108. end.