2016-01-29 7 views
0

Я пытаюсь нарисовать доску и выполнять действия пользователя при нажатии кнопки.Форма мерцания при использовании кнопок

Кажется, что наведение кнопки вызывает форму 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() 

ответ

2

Используйте форму с двойной буферизацией (http://fssnip.net/rA)

/// Double-buffered form 
type CompositedForm() = 
    inherit Form() 
    override this.CreateParams = 
     let cp = base.CreateParams 
     cp.ExStyle <- cp.ExStyle ||| 0x02000000 
     cp 
+0

значение флага coressponds в WS_CLIPCHILDREN: Исключает площадь, занимаемая дочерними окнами при рисовании происходит внутри родительского окна. Этот стиль используется при создании родительского окна. (MSDN) –