drawing.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Copyright 2010 The Walk Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "log"
  7. "math"
  8. )
  9. import (
  10. "github.com/lxn/walk"
  11. . "github.com/lxn/walk/declarative"
  12. )
  13. func main() {
  14. mw := new(MyMainWindow)
  15. if _, err := (MainWindow{
  16. AssignTo: &mw.MainWindow,
  17. Title: "Walk Drawing Example",
  18. MinSize: Size{320, 240},
  19. Size: Size{800, 600},
  20. Layout: VBox{MarginsZero: true},
  21. Children: []Widget{
  22. CustomWidget{
  23. AssignTo: &mw.paintWidget,
  24. ClearsBackground: true,
  25. InvalidatesOnResize: true,
  26. Paint: mw.drawStuff,
  27. },
  28. },
  29. }).Run(); err != nil {
  30. log.Fatal(err)
  31. }
  32. }
  33. type MyMainWindow struct {
  34. *walk.MainWindow
  35. paintWidget *walk.CustomWidget
  36. }
  37. func (mw *MyMainWindow) drawStuff(canvas *walk.Canvas, updateBounds walk.Rectangle) error {
  38. bmp, err := createBitmap()
  39. if err != nil {
  40. return err
  41. }
  42. defer bmp.Dispose()
  43. bounds := mw.paintWidget.ClientBounds()
  44. rectPen, err := walk.NewCosmeticPen(walk.PenSolid, walk.RGB(255, 0, 0))
  45. if err != nil {
  46. return err
  47. }
  48. defer rectPen.Dispose()
  49. if err := canvas.DrawRectangle(rectPen, bounds); err != nil {
  50. return err
  51. }
  52. ellipseBrush, err := walk.NewHatchBrush(walk.RGB(0, 255, 0), walk.HatchCross)
  53. if err != nil {
  54. return err
  55. }
  56. defer ellipseBrush.Dispose()
  57. if err := canvas.FillEllipse(ellipseBrush, bounds); err != nil {
  58. return err
  59. }
  60. linesBrush, err := walk.NewSolidColorBrush(walk.RGB(0, 0, 255))
  61. if err != nil {
  62. return err
  63. }
  64. defer linesBrush.Dispose()
  65. linesPen, err := walk.NewGeometricPen(walk.PenDash, 8, linesBrush)
  66. if err != nil {
  67. return err
  68. }
  69. defer linesPen.Dispose()
  70. if err := canvas.DrawLine(linesPen, walk.Point{bounds.X, bounds.Y}, walk.Point{bounds.Width, bounds.Height}); err != nil {
  71. return err
  72. }
  73. if err := canvas.DrawLine(linesPen, walk.Point{bounds.X, bounds.Height}, walk.Point{bounds.Width, bounds.Y}); err != nil {
  74. return err
  75. }
  76. points := make([]walk.Point, 10)
  77. dx := bounds.Width / (len(points) - 1)
  78. for i := range points {
  79. points[i].X = i * dx
  80. points[i].Y = int(float64(bounds.Height) / math.Pow(float64(bounds.Width/2), 2) * math.Pow(float64(i*dx-bounds.Width/2), 2))
  81. }
  82. if err := canvas.DrawPolyline(linesPen, points); err != nil {
  83. return err
  84. }
  85. bmpSize := bmp.Size()
  86. if err := canvas.DrawImage(bmp, walk.Point{(bounds.Width - bmpSize.Width) / 2, (bounds.Height - bmpSize.Height) / 2}); err != nil {
  87. return err
  88. }
  89. return nil
  90. }
  91. func createBitmap() (*walk.Bitmap, error) {
  92. bounds := walk.Rectangle{Width: 200, Height: 200}
  93. bmp, err := walk.NewBitmap(bounds.Size())
  94. if err != nil {
  95. return nil, err
  96. }
  97. succeeded := false
  98. defer func() {
  99. if !succeeded {
  100. bmp.Dispose()
  101. }
  102. }()
  103. canvas, err := walk.NewCanvasFromImage(bmp)
  104. if err != nil {
  105. return nil, err
  106. }
  107. defer canvas.Dispose()
  108. brushBmp, err := walk.NewBitmapFromFile("../img/plus.png")
  109. if err != nil {
  110. return nil, err
  111. }
  112. defer brushBmp.Dispose()
  113. brush, err := walk.NewBitmapBrush(brushBmp)
  114. if err != nil {
  115. return nil, err
  116. }
  117. defer brush.Dispose()
  118. if err := canvas.FillRectangle(brush, bounds); err != nil {
  119. return nil, err
  120. }
  121. font, err := walk.NewFont("Times New Roman", 40, walk.FontBold|walk.FontItalic)
  122. if err != nil {
  123. return nil, err
  124. }
  125. defer font.Dispose()
  126. if err := canvas.DrawText("Walk Drawing Example", font, walk.RGB(0, 0, 0), bounds, walk.TextWordbreak); err != nil {
  127. return nil, err
  128. }
  129. succeeded = true
  130. return bmp, nil
  131. }