forms - windows.forms 和重绘位图

标签 forms graphics f#

我正在实现一个 gameboy 模拟器,就像我之前的许多人一样。

我正在尝试实现 PPU 并为此使用代表屏幕的类。

// needed because VS can't find it as dependency
#r "nuget: System.Windows.Forms"
open System
open System.Windows.Forms
open System.Drawing

type Screen(title, width : int, height : int) as screen =
    inherit Form()
    
    let mutable canvas = new Bitmap(width, height)

    do
        // set some attributes of the screen
        screen.Size <- new Size(width, height)
        screen.Text <- title

    interface IDisposable with
        member S.Dispose() = (canvas :> IDisposable).Dispose()

    override S.OnPaint e =
        e.Graphics.DrawImage(canvas,0,0) // here
        base.OnPaint(e)

    member S.Item
        with get (w, h) = canvas.GetPixel(w,h)
        and set (w,h) pixel = canvas.SetPixel(w,h,pixel)

但是在重绘位图后我无法让它更新屏幕,它不显示重绘的图像。

重绘

let main () =
    let screen = new Screen("gameboy",800,600)
    Application.Run(screen)
    // test example
    for i in 0 .. 300 do
        screen.[i,i] <- Drawing.Color.Black
    (screen :> Form).Refresh()

即如何让它在位图更新后重绘?

最佳答案

Application.Run 被调用后,您不能做任何图形化的事情,因为直到用户关闭主窗体它才会完成。相反,您可以创建一个在主窗体加载后调用的事件处理程序,如下所示:

let main argv =
    let screen = new Screen("gameboy",800,600)
    screen.Load.Add(fun _ ->
        for i in 0 .. 300 do
            screen.[i,i] <- Drawing.Color.Black)
    Application.Run(screen)
    0

关于forms - windows.forms 和重绘位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66325086/

相关文章:

php - 让所有表单验证错误都显示在 symfony 的顶部?

javascript - 如何使用 HTML 表单代替 AJAX

javascript - 在action.php 的表单之外定位按钮?

F# 使用通用参数调用 .Net 函数 - 无法编译

forms - Drupal Managed_file 形式

java - 我以为我已经准备好运行该程序,但是当我运行它时什么也没有发生

java - 使用抽象父类(super class)生成子类的随机实例

java - 奇怪的图形错误 : a copy of component A is painted on component B. 帮助! ( java )

f# - 聚合函数 - f# vs c# 性能

f# - 如何在 F# 中测试序列是否为空?