仅调用一个 Paint 事件

2024-03-26

我的问题是我有 8 个图片框,但一次只有其中一个调用其绘制方法。

我的代码有点太大,所以我尝试尽可能地将其范围缩小到受影响的部分。

我最好的猜测是,这并不是我的代码中的错误,而是对绘制事件如何工作的误解。

我有一个继承自 PictureBox 的类,我正在使用它而不是 Picturebox。唯一的变化是构造函数

using System.Drawing;
using System.Windows.Forms;

public class DrawingSurface : PictureBox
{
    public DrawingSurface(Rectangle bounds) : base() {
        base.Dock = DockStyle.Fill;
        base.SizeMode = PictureBoxSizeMode.Zoom;
        //I set the size and bounds which is probably redundant because 
        //I was trying random things to fix the problem
        base.Size = new Size(bounds.Width, bounds.Height);
        base.Bounds = bounds;
        base.Margin = new Padding(0) ;
        base.BackColor = Color.Transparent;
    }
}


public class MyForm:Form
{
    public MyForm():base()
    {
        base.FormBorderStyle = FormBorderStyle.Sizable;
        base.MaximizeBox = false;
        base.MinimizeBox = false;
        base.Bounds = Screen.PrimaryScreen.Bounds;
    }

}

这是我的主要课程

class Program
{
    static int Main()
    {
        short boardOffsetX, boardOffsetY, trayOffsetX, trayOffsetY;
        MyForm gameImage = null;
        Tray playerTray = null;
        ScrabbleBoard board = null;
        BagOfLetters bag = null;


        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);//this line of code doesn't work either if any of you can spot anything obvious here.  

        //this is my hacky way of centering the images, wouldn't mind you telling me
        //a better way of doing this either.  
        boardOffsetX = (short)(Screen.PrimaryScreen.Bounds.Width/4);
        boardOffsetY = (short)(Screen.PrimaryScreen.Bounds.Height/8);
        trayOffsetX = (short)(Screen.PrimaryScreen.Bounds.Width / 3.3);
        trayOffsetY = (short)(Screen.PrimaryScreen.Bounds.Height / 24);
        try
        {
            gameImage = new MyForm();
            bag = new BagOfLetters();
            board = new ScrabbleBoard(gameImage, new Point(boardOffsetX, boardOffsetY));
            playerTray = new Tray(bag, trayOffsetX, trayOffsetY, gameImage);
            gameImage.ShowDialog();
        }
        finally
        {
             //Dispose all
        }
    }
}

我的图像是这样画的。我有一个带有大图像的大类,其中包含 7 个较小的类及其图像。我尝试初始化我的大班中的所有内容。

public class Tray{
    private Image TrayImage;
    private DrawingSurface TraySurface;
    private short OffsetY = 0;
    private short OffsetX = 0;
    public List<LB> Tray;

    public Tray(Bag bag, short offsetX, short offsetY, MyForm gameImage)
    {
        Letter tmp;

        //paramater validation

        TrayImage = Image.FromFile(PATHOFTRAY);
        //GetBoundsAsRectangle is just getting the image dimensions as a rectangle
        TraySurface = new DrawingSurface(GetBoundsAsRectangle()) ;
        TraySurface.Location = new Point(offsetX, offsetY);

        this.OffsetX = offsetX;
        this.OffsetY = offsetY;

        do
        {
            tmp = bag.PullLetter();
        }
        while (AddLetter(tmp, gameImage));
        //make this image draw
        TraySurface.Paint += new PaintEventHandler(this.Draw);
        gameImage.Controls.Add(TraySurface);
        TraySurface.SendToBack();
    }


    public bool AddLetter(Letter letter, MyForm gameImage) {
        //argument validation
        Count++;
        letter.PutOnTray(Count, OffsetX, OffsetY);
        gameImage.Controls.Add(letter.GetDrawingSurface());
        if (letterCount >= MAXLETTERS)
        {
            return false;
        }
        return true;
    }


    public void Paint(Object sender, PaintEventArgs drawEvent)
    {
        //paramater validation here
        Rectangle rectangleAreaToDrawImage = new Rectangle(OffsetX,
                                                            OffsetY,
                                                            TrayImage.Width,
                                                            TrayImage.Height);
        // Draw image to screen.
        drawEvent.Graphics.DrawImage(TrayImage, rectangleAreaToDrawImage);
    }
}

public class Letter
{
    private Image LetterImage;
    private DrawingSurface LetterSurface;
    private int PositionOnTray;

    public Letter(char value, String fName) {
        LetterImage = Image.FromFile(fName);
        LetterSurface = new DrawingSurface(GetBoundsAsRectangle());
    }


    public void PutOnTray(short position, short x, short y)
    {
        //validation
        PositionOnTray = position;
        TrayOffsetX = (short)(x + (position*20));
        TrayOffsetY = y;
        IsOnTray = true;
        LetterSurface.Location = new Point(TrayOffsetX, TrayOffsetY);
        LetterSurface.Paint += new PaintEventHandler(this.Draw);
    }
    public void Paint(Object sender, PaintEventArgs drawEvent)
    {
        int x = 0, y = 0;

        //paramater validation here
        x = (TrayOffsetX + (LetterImage.Width * PositionOnTray));
        y = (TrayOffsetY + 6);
        Location = new Rectangle(x,
                                 y,
                                 LetterImage.Width,
                                 LetterImage.Image.Height);
        drawEvent.Graphics.DrawImage(LetterImage, Location);
}

所以基本上托盘上有一个图像,7 个字母也有图像。这些字母现在绘制在托盘顶部,但在它们自己的图片框中。我向托盘和字母添加了绘制方法,并将它们添加到图片框 Paint 中。我需要这些字母有单独的图片框,因为稍后我想添加功能,通过单击鼠标将它们拾取并在屏幕上拖动。

问题是绘制方法没有被调用。从理论上来说,用伪代码,你会如何画这个?我有 Java/C/C++ 背景,图形从来都不是我关注的焦点,所以我确信这不是一个错误,而是我处理这个问题的方式是错误的。


解决方案是删除所有图片框...所有这些事件都可以直接添加到表单中,没有问题。我最初认为我需要通过图片框为所有内容提供单独的处理程序,但我错了。看起来 Pictureboxes 的事件部分几乎没有被使用,除非在极少数情况下,例如将它们添加到表格布局面板时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅调用一个 Paint 事件 的相关文章

随机推荐

  • 如何从 Kendo 网格中删除所有行

    我在用Kendo grid 我想从中删除所有行Kendo grid using JavaScript 我使用 for 循环删除了它们 但我想找到删除所有行的最佳方法 尝试按照代码进行操作 var grid Grid data kendoGr
  • mongodb show dbs list数据库失败

    我是 mongodb 的新手 我刚刚在我的MAC上安装了mongoDB 看完这个 YouTube 视频后 在 mongo shell 中 我输入 show dbs 并得到有线输出 请帮助我理解并解决这个问题 gt show dbs 2017
  • 在 JDBC 中插入单引号以进行 SQL 查询不起作用

    我在通过 Oracle JDBC 在 JAVA 的准备好的语句中使用单引号时遇到了处理单引号的问题 假设我们有一张 Restaurant 表 其中一列 Restaurant name 的值为 1 Jack s Deli 我想使用一个简单的准
  • 使用另一个对话框的功能更改 jQuery-UI 对话框的标题

    为什么第二个 jQuery UI 对话框标题在弹出时不改变 第一个对话框我使用以下命令更改框的标题 attr title Confirm 它将第一个框的标题更改为 确认 就像它应该有的那样 现在 当第二个框弹出时 它应该将标题更改为 消息
  • 将 std::hash 专门化为依赖类型

    我已经定义了这个模板类结构 template
  • 尝试获取已安装应用程序列表时出现 TransactionTooLargeException

    作为我的应用程序的一部分 我通过使用 ApplicationPackageManager getInstalledApplications 获取设备上安装的应用程序列表 但对于某些用户 我收到崩溃报告说 android osBinderPr
  • 视图漂浮在所有 ViewController 之上

    在 iOS 上 视图是否可能始终漂浮在所有其他视图之上 我问这个是因为我想要实现的是一个漂浮在 ViewController 之上的视图 然后一个模态视图控制器滑入 同时该特定视图仍然漂浮在该模态视图控制器上 希望你明白我想说的 有 您可以
  • 程序员多久会被要求编写一个 makefile 文件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从当前文化中获取货币?

    有没有办法从应用程序文化设置动态获取当前信息 基本上 如果用户将文化设置为美国 我想知道货币是美元 或者如果他们将其设置为英国 我想知道英镑等 等等 这样我就可以在付款时将此信息发送给 PayPal 使用 RegionInfo ISOCur
  • 根据当前值更新 MongoDB 中的值

    我想做这样的事情 但是this关键字似乎没有在更新语句中设置 db items update foo set bar this foo false true 我必须使用eval来完成这个 是的 您不能引用修饰符中的其他字段 您必须使用 db
  • 使 MongoDB 中的表字段可文本搜索

    先决条件 已使用集合创建数据库posts它的架构如下 module exports function mongoose var Schema mongoose Schema var postSchema new Schema postID
  • Java TA-Lib 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找有关的文档TA Lib http www ta lib org index html在爪哇
  • 使用 SWIG 和 Python/C API 包装返回 std::map 的函数

    我想包装一个 C 例程 它返回一个std map整数和指向 C 类实例的指针 我在使用 SWIG 时遇到困难 希望能提供任何帮助 我试图通过一个简单的例子来将这个问题归结为它的本质 标题test h定义如下 File test h incl
  • 计算单元测试运行期间发生的GC数量[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我目前正在编写一个单元测试来查看给定方法的性能影响 从实践中我们观察到 当前在给定方法的执行过程中发生了很多GC 我想知道是否可以查看从
  • ASIHTTPRequest dealloc 和 EXC_BAD_ACCESS 问题

    我使用一组 ASIHTTPRequest 包装器 AsyncImageLoader 来下载 UITableView 中单元格的图像 我在处理 ASIHTTPRequests 生命周期时遇到问题 如果我释放它们 如果我在它们尝试加载图像时继续
  • 警告:require_once():http:// 包装器在服务器配置中被allow_url_include=0 禁用

    我试图通过以下方式在页面中包含 php 文件 require once http localhost web a php 我收到错误 Warning require once http wrapper is disabled in the
  • Jodatime的LocalDateTime第一次使用时很慢

    我目前正在一个 java 项目中测试一些 webapp 技术 并且想知道为什么页面有时加载速度很快 有时需要近 5 秒才能加载 我终于发现是这条线 LocalDateTime now new LocalDateTime 第一次调用时 需要很
  • 使用 par 时图例框宽度不正确

    我有问题 我的图例太大 我的代码 par mfrow c 1 2 hist alvsloss breaks 100 freq F main Histogramm density curve gaussian kernel n and fit
  • Dart - 试图理解“工厂”构造函数的价值

    如果我理解正确的话 A factory constructor affords an abstract class to be instantiated by another class despite being abstract 例如
  • 仅调用一个 Paint 事件

    我的问题是我有 8 个图片框 但一次只有其中一个调用其绘制方法 我的代码有点太大 所以我尝试尽可能地将其范围缩小到受影响的部分 我最好的猜测是 这并不是我的代码中的错误 而是对绘制事件如何工作的误解 我有一个继承自 PictureBox 的