Я пытаюсь нарисовать доску и выполнять действия пользователя при нажатии кнопки.Форма мерцания при использовании кнопок
Кажется, что наведение кнопки вызывает форму Paint
формы, которая перерисовывает доску и вызывает мерцание формы.
В случае, если правление перерисовано на Paint
является нормальным (использование действий будет определять изменения на плате), есть ли способ избежать мерцания? Может быть, вызывать форму Invalidate
на определенных событиях? Может быть, найти альтернативу CreateGraphics
?
open System.Windows.Forms
open System.Drawing
type BoardForm() =
let button = new Button()
let initializeButton (button:Button) left top caption sizeX sizeY enabled callback =
button.Text<-caption
button.Top<-top
button.Left<-left
button.Size<-new Size(sizeX,sizeY)
button.Click.Add(callback)
let drawBoard (form:Form) (x:int) (y:int) (width:int) (height:int) =
let brushBoard = new SolidBrush(Color.Beige)
let g = form.CreateGraphics()
g.FillRectangle(brushBoard, x, y, width, height)
let cellSize = 10
let cellsX = 10
let cellsY = 10
use pen = new Pen(Brushes.Black)
for i in [0..cellsY] do
g.DrawLine(pen, x, y+i*cellSize, x+cellsX*cellSize, y+i*cellSize)
let drawButtons (form:Form) =
let left = 10
let top = 300
let buttonWidth = 50
let buttonHeight = 30
initializeButton button left top "Ping" 50 buttonHeight true (fun _ -> printfn "I was pushed")
[button] |> Seq.cast<Control> |> Array.ofSeq |> form.Controls.AddRange
let initializeForm() =
let formWidth = 240
let formHeight = 400
let x = 10
let y = 10
let width = 200
let height = 200
let form = new Form(Width=formWidth, Height=formHeight, Visible=true, Text="Some form", TopMost=true)
form.Paint.Add(fun e -> drawBoard form x y width height)
drawButtons form
member this.Start() =
initializeForm()
let boardForm = new BoardForm()
boardForm.Start()
значение флага coressponds в WS_CLIPCHILDREN: Исключает площадь, занимаемая дочерними окнами при рисовании происходит внутри родительского окна. Этот стиль используется при создании родительского окна. (MSDN) –