仅调用一个 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 事件 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • 如何从 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 的