139 lines
4.8 KiB
C#
139 lines
4.8 KiB
C#
|
// This is free and unencumbered software released into the public domain.
|
||
|
// Happy coding!!! - GtkSharp Team
|
||
|
|
||
|
// Ported from https://developer.gnome.org/gtkmm-tutorial/3.24/gtkmm-tutorial.html
|
||
|
|
||
|
using Cairo;
|
||
|
using Gtk;
|
||
|
using System;
|
||
|
|
||
|
namespace Samples
|
||
|
{
|
||
|
[Section(ContentType = typeof(DrawingArea), Category = Category.Widgets)]
|
||
|
class DrawingAreaSection : ListSection
|
||
|
{
|
||
|
public DrawingAreaSection()
|
||
|
{
|
||
|
AddItem(DrawCircles());
|
||
|
AddItem(DrawText());
|
||
|
}
|
||
|
|
||
|
public (string, Widget) DrawCircles()
|
||
|
{
|
||
|
DrawingArea drawingArea = new DrawingArea();
|
||
|
drawingArea.SetSizeRequest(50,50);
|
||
|
drawingArea.Drawn += DrawingAreaCirclesOnDrawn;
|
||
|
|
||
|
return ("Draw Circles :", drawingArea);
|
||
|
}
|
||
|
|
||
|
public (string, Widget) DrawText()
|
||
|
{
|
||
|
DrawingArea drawingArea = new DrawingArea();
|
||
|
drawingArea.SetSizeRequest(200,100);
|
||
|
drawingArea.Drawn += DrawingAreaTextOnDrawn;
|
||
|
|
||
|
return ("Draw Pango Text :", drawingArea);
|
||
|
}
|
||
|
|
||
|
private void DrawingAreaCirclesOnDrawn(object o, DrawnArgs args)
|
||
|
{
|
||
|
if (o is DrawingArea da)
|
||
|
{
|
||
|
Context cr = args.Cr;
|
||
|
|
||
|
int width = da.Allocation.Width;
|
||
|
int height = da.Allocation.Height;
|
||
|
|
||
|
cr.LineWidth = 5;
|
||
|
cr.SetSourceRGB(0.8, 0.8, 0.8);
|
||
|
|
||
|
cr.Rectangle(0, 0, width, height);
|
||
|
cr.Fill();
|
||
|
|
||
|
cr.SetSourceRGB(0.9, 0, 0);
|
||
|
cr.Translate(width/2d, height/2d);
|
||
|
cr.Arc(0, 0, (width < height ? width : height) / 2 - 10, 0, 2*Math.PI);
|
||
|
cr.StrokePreserve();
|
||
|
|
||
|
cr.SetSourceRGB(0, 0.9, 0);
|
||
|
cr.Fill();
|
||
|
|
||
|
cr.GetTarget().Dispose();
|
||
|
cr.Dispose();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void DrawingAreaTextOnDrawn(object o, DrawnArgs args)
|
||
|
{
|
||
|
if (o is DrawingArea da)
|
||
|
{
|
||
|
Context cr = args.Cr;
|
||
|
|
||
|
int width = da.Allocation.Width;
|
||
|
int height = da.Allocation.Height;
|
||
|
|
||
|
int rectangle_width = width;
|
||
|
int rectangle_height = height / 2;
|
||
|
|
||
|
// Draw a black rectangle
|
||
|
cr.SetSourceRGB(0, 0, 0);
|
||
|
cr.Rectangle(0, 0, rectangle_width, rectangle_height);
|
||
|
cr.Fill();
|
||
|
|
||
|
// and some white text
|
||
|
cr.SetSourceRGB(1.0, 1.0, 1.0);
|
||
|
draw_text(cr, rectangle_width, rectangle_height, "Hi there!");
|
||
|
|
||
|
// flip the image vertically
|
||
|
// see http://www.cairographics.org/documentation/cairomm/reference/classCairo_1_1Matrix.html
|
||
|
// the -1 corresponds to the yy part (the flipping part)
|
||
|
// the height part is a translation (we could have just called cr->translate(0, height) instead)
|
||
|
// it's height and not height / 2, since we want this to be on the second part of our drawing
|
||
|
// (otherwise, it would draw over the previous part)
|
||
|
Cairo.Matrix matrix = new Matrix(1.0, 0.0, 0.0, -1.0, 0.0, height);
|
||
|
|
||
|
// apply the matrix
|
||
|
cr.Transform(matrix);
|
||
|
|
||
|
// white rectangle
|
||
|
cr.SetSourceRGB(1.0, 1.0, 1.0);
|
||
|
cr.Rectangle(0, 0, rectangle_width, rectangle_height);
|
||
|
cr.Fill();
|
||
|
|
||
|
// black text
|
||
|
cr.SetSourceRGB(0, 0, 0);
|
||
|
draw_text(cr, rectangle_width, rectangle_height, "Hi there!");
|
||
|
|
||
|
cr.GetTarget().Dispose();
|
||
|
cr.Dispose();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void draw_text(Context cr, int rectangle_width, int rectangle_height, string text)
|
||
|
{
|
||
|
// http://developer.gnome.org/pangomm/unstable/classPango_1_1FontDescription.html
|
||
|
Pango.FontDescription font = new Pango.FontDescription();
|
||
|
|
||
|
font.Family = "Monospace";
|
||
|
font.Weight = Pango.Weight.Bold;
|
||
|
|
||
|
// http://developer.gnome.org/pangomm/unstable/classPango_1_1Layout.html
|
||
|
Pango.Layout layout = CreatePangoLayout(text);
|
||
|
|
||
|
layout.FontDescription = font;
|
||
|
|
||
|
int text_width;
|
||
|
int text_height;
|
||
|
|
||
|
//get the text dimensions (it updates the variables -- by reference)
|
||
|
layout.GetPixelSize(out text_width, out text_height);
|
||
|
|
||
|
// Position the text in the middle
|
||
|
cr.MoveTo((rectangle_width - text_width) / 2d, (rectangle_height - text_height) / 2d);
|
||
|
|
||
|
Pango.CairoHelper.ShowLayout(cr, layout);
|
||
|
}
|
||
|
}
|
||
|
}
|