123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- // Copyright 2010 The Walk Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package main
- import (
- "log"
- "math"
- )
- import (
- "github.com/lxn/walk"
- . "github.com/lxn/walk/declarative"
- )
- func main() {
- mw := new(MyMainWindow)
- if _, err := (MainWindow{
- AssignTo: &mw.MainWindow,
- Title: "Walk Drawing Example",
- MinSize: Size{320, 240},
- Size: Size{800, 600},
- Layout: VBox{MarginsZero: true},
- Children: []Widget{
- CustomWidget{
- AssignTo: &mw.paintWidget,
- ClearsBackground: true,
- InvalidatesOnResize: true,
- Paint: mw.drawStuff,
- },
- },
- }).Run(); err != nil {
- log.Fatal(err)
- }
- }
- type MyMainWindow struct {
- *walk.MainWindow
- paintWidget *walk.CustomWidget
- }
- func (mw *MyMainWindow) drawStuff(canvas *walk.Canvas, updateBounds walk.Rectangle) error {
- bmp, err := createBitmap()
- if err != nil {
- return err
- }
- defer bmp.Dispose()
- bounds := mw.paintWidget.ClientBounds()
- rectPen, err := walk.NewCosmeticPen(walk.PenSolid, walk.RGB(255, 0, 0))
- if err != nil {
- return err
- }
- defer rectPen.Dispose()
- if err := canvas.DrawRectangle(rectPen, bounds); err != nil {
- return err
- }
- ellipseBrush, err := walk.NewHatchBrush(walk.RGB(0, 255, 0), walk.HatchCross)
- if err != nil {
- return err
- }
- defer ellipseBrush.Dispose()
- if err := canvas.FillEllipse(ellipseBrush, bounds); err != nil {
- return err
- }
- linesBrush, err := walk.NewSolidColorBrush(walk.RGB(0, 0, 255))
- if err != nil {
- return err
- }
- defer linesBrush.Dispose()
- linesPen, err := walk.NewGeometricPen(walk.PenDash, 8, linesBrush)
- if err != nil {
- return err
- }
- defer linesPen.Dispose()
- if err := canvas.DrawLine(linesPen, walk.Point{bounds.X, bounds.Y}, walk.Point{bounds.Width, bounds.Height}); err != nil {
- return err
- }
- if err := canvas.DrawLine(linesPen, walk.Point{bounds.X, bounds.Height}, walk.Point{bounds.Width, bounds.Y}); err != nil {
- return err
- }
- points := make([]walk.Point, 10)
- dx := bounds.Width / (len(points) - 1)
- for i := range points {
- points[i].X = i * dx
- points[i].Y = int(float64(bounds.Height) / math.Pow(float64(bounds.Width/2), 2) * math.Pow(float64(i*dx-bounds.Width/2), 2))
- }
- if err := canvas.DrawPolyline(linesPen, points); err != nil {
- return err
- }
- bmpSize := bmp.Size()
- if err := canvas.DrawImage(bmp, walk.Point{(bounds.Width - bmpSize.Width) / 2, (bounds.Height - bmpSize.Height) / 2}); err != nil {
- return err
- }
- return nil
- }
- func createBitmap() (*walk.Bitmap, error) {
- bounds := walk.Rectangle{Width: 200, Height: 200}
- bmp, err := walk.NewBitmap(bounds.Size())
- if err != nil {
- return nil, err
- }
- succeeded := false
- defer func() {
- if !succeeded {
- bmp.Dispose()
- }
- }()
- canvas, err := walk.NewCanvasFromImage(bmp)
- if err != nil {
- return nil, err
- }
- defer canvas.Dispose()
- brushBmp, err := walk.NewBitmapFromFile("../img/plus.png")
- if err != nil {
- return nil, err
- }
- defer brushBmp.Dispose()
- brush, err := walk.NewBitmapBrush(brushBmp)
- if err != nil {
- return nil, err
- }
- defer brush.Dispose()
- if err := canvas.FillRectangle(brush, bounds); err != nil {
- return nil, err
- }
- font, err := walk.NewFont("Times New Roman", 40, walk.FontBold|walk.FontItalic)
- if err != nil {
- return nil, err
- }
- defer font.Dispose()
- if err := canvas.DrawText("Walk Drawing Example", font, walk.RGB(0, 0, 0), bounds, walk.TextWordbreak); err != nil {
- return nil, err
- }
- succeeded = true
- return bmp, nil
- }
|