如何在 WinForms 中绘制形状[重复]

2023-12-05

我正在尝试编写类似绘画的程序。您可以通过选择所需的形状来绘制填充形状,单击图片框并拖动鼠标以获得所需的尺寸。但THIS当我拖动时可能会发生。当我使用refresh();,之前绘制的形状会自行删除。我应该怎么做才能绘制填充形状?

private void CizimPicture_MouseDown(object sender, MouseEventArgs e)
    {
        Cursor = Cursors.Cross;
        if (e.Button == MouseButtons.Left)
        {
            cizim = true;
        }
        X1 = e.X;
        Y1 = e.Y;
    }

    private void CizimPicture_MouseUp(object sender, MouseEventArgs e)
    {
        Cursor = Cursors.Default;
        cizim = false;
    }

    private void CizimPicture_MouseMove(object sender, MouseEventArgs e)
    {
        if (!cizim) return;

        if (cizim == true)
        {
            X = e.X;
            Y = e.Y;
            X2 = (e.X - X1);
            Y2 = (Y1 - e.Y);

            if (dikdörtgen == true)
            {
                resmim.FillRectangle(renk.Brush, X1, Y1, X2, -Y2);
            }
            if (elips == true)
            {
                resmim.FillEllipse(renk.Brush, X1, Y1, X2, -Y2);
            }
        }

    }

我寻找既简单又有效的示例代码,但没有找到任何东西。您不需要屏幕外位图或CreateGraphics为此,但您需要按照 Eric 的建议处理跟踪鼠标位置、绘制到屏幕以及将绘制的形状添加到形状列表中。要处理交互式绘图,您需要在表单处理程序中存储鼠标状态、初始单击位置和当前矩形:

bool mouseDown;
Point clickPos;
Rectangle rect;

然后当用户点击时,记住初始位置:

private void MouseDown(object sender, MouseEventArgs e)
{
    mouseDown = true;
    clickPos = e.Location;
    rect = new Rectangle(clickPos, new Size(0, 0));
}

当用户用鼠标向下拖动时,创建一个包含开始位置和当前位置的矩形:

private void MouseMove(object sender, MouseEventArgs e)
{
    if (mouseDown)
    {
        this.Invalidate(rect);
        if (e.Location.X > clickPos.X && e.Location.Y > clickPos.Y)
        {
            rect = new Rectangle(clickPos.X, clickPos.Y, e.Location.X - clickPos.X, e.Location.Y - clickPos.Y);
        }
        else if (e.Location.X > clickPos.X && e.Location.Y < clickPos.Y)
        {
            rect = new Rectangle(clickPos.X, e.Location.Y, e.Location.X - clickPos.X, clickPos.Y - e.Location.Y);
        }
        else if (e.Location.X < clickPos.X && e.Location.Y < clickPos.Y)
        {
            rect = new Rectangle(e.Location.X, e.Location.Y, clickPos.X - e.Location.X, clickPos.Y - e.Location.Y);
        }
        else if (e.Location.X < clickPos.X && e.Location.Y > clickPos.Y)
        {
            rect = new Rectangle(e.Location.X, clickPos.Y, clickPos.X - e.Location.X, e.Location.Y - clickPos.Y);
        }

        this.Invalidate(rect);
    }
}

当用户释放鼠标时,停止绘制:

private void MouseUp(object sender, MouseEventArgs e)
{
    mouseDown = false;
}

Windows 窗体中最重要的第一条规则是:仅在 Paint 事件中绘制到屏幕。永远不要画在MouseMoved event:

private void Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(Brushes.DarkGray, rect);
}

一旦你开始工作,创建一个表单List<Rectangle>并将当前矩形添加到MouseUp事件并绘制所有矩形Paint事件。您可能还想将绘图剪辑到您正在其中绘图的面板或窗口。您还可以在以下位置进行一些优化:MouseMoved仅使更改的屏幕区域无效,而不使旧的和新的矩形都无效。

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

如何在 WinForms 中绘制形状[重复] 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调

随机推荐

  • Java中动态绑定是如何实现的?

    我知道在C 中 每个实例中都有一个指向虚拟表的虚拟指针 但是Java中动态绑定是如何实现的呢 我想我会回答我自己的问题 基本上 对象存储对其类对象的引用 动态绑定将从对象转发到该类对象
  • 部署在 IIS 6 上的 MVC3 RC 应用程序出现“403 禁止”错误

    我已经将一个非常简单的 MVC3 RC 应用程序部署到 IIS 6 Windows 2003 服务器 我在尝试访问根目录时收到 403 禁止 错误 目前该应用程序只有一页 因此没有其他可供尝试 我注意到根目录中不再有 default asp
  • 保护文件上传

    几年前 我在学习期间为一家小公司编写了一个网站 我开始意识到我的安全技能并没有达到应有的水平 最近该网站遭到黑客攻击 并且使用用于图像上传的表单上传了恶意 php 代码 此后我进入了 NET 世界 虽然我知道如何保护 NET 中的文件上传
  • 如何在 Internet Explorer 中使用控制台日志记录?

    有 IE 的控制台记录器吗 我正在尝试将一堆测试 断言记录到控制台 但我无法在 IE 中执行此操作 您可以通过启动 开发人员工具 F12 来访问 IE8 脚本控制台 单击 脚本 选项卡 然后单击右侧的 控制台 在 JavaScript 代码
  • 使用密码配置跳转/堡垒主机

    我有三个主机 我的本地 ansible 控制器 跳跃 堡垒主机 jump host 对于我的基础设施 我想要针对其运行 ansible 任务的目标主机 target host 只能通过以下方式访问jump host 作为我的库存文件的一部分
  • 通过 Microsoft Graph API 创建 Excel 文件

    有谁知道如何通过 MS Graph API 创建 excel 和 ppt 文件 我们正在尝试利用 MS Graph API 通过单击按钮来创建 word excel ppt 文件 虽然我们找到了如何创建 word 文件 但即使 API 成功
  • Java Final——一个永恒的谜

    suggestBox addKeyUpHandler new KeyUpHandler public void onKeyUp KeyUpEvent event if event getNativeKeyCode KeyCodes KEY
  • 找不到列“dbo”或用户定义函数或聚合“dbo.FN_Split”,或者名称不明确

    我有以下函数 它接受 CSV 和分隔符并将其拆分 ALTER FUNCTION dbo FN Split String varchar max Delimiter char 1 returns temptable TABLE orderId
  • :app:transformClassesWithMultidexlistForDebug 失败

    我已经尝试过以下链接 http developer android com intl es tools building multidex html 意外的顶级异常 com android dex DexException 多个 dex 文
  • 使用 ssh 端口转发运行 Erlang Observer

    我有一个远程 Erlang 节点和本地开发人员的 PC 我想启动本地节点 email protected 启动观察者 调用c nl 1和其他调试操作 我写了这个 bin sh export ERL EPMD PORT 43690 PORT
  • 在 Cocoa 应用程序中每晚使用 WebKit.framework?

    我目前正在 Cocoa 应用程序中使用 WebView 我还想在 webview 特别是 FileReader 中使用 HTML5 文件 API FileReader 在最新版本的 WebKit 中不受支持 但在 WebKit nightl
  • 如何在jsp中对url参数进行加密/编码

    我想对一个URL变量进行加密 这样用户在jsp中传递的信息就无法看到或修改 这是一个示例 URL localhost somewebpage name jsp id 1234 tname Employee March 2013 这里我想对参
  • Spring MVC - HTTP 状态 500 - Servlet loginDispacher 的 Servlet.init() 引发异常

    我做了一个简单的程序 但出现以下错误 我正在使用 Eclipse Kelper 和 Tomcat 7 0 尝试了很多事情 但没有任何对我有用 HTTP 状态 500 servlet loginDispacher 的 Servlet init
  • 根据另一个数据帧的多个列条件创建列

    假设我有两个数据框 条件和数据 import pandas as pd conditions pd DataFrame class 1 2 3 4 4 5 5 4 4 5 5 5 primary lower 0 0 0 160 160 16
  • Python SqlAlchemy - AttributeError:映射器

    基于我的模型 from sqlalchemy ext declarative import declarative base from sqlalchemy import Column Integer String ForeignKey f
  • iOS:如何查询WiFi状态

    是否可以以编程方式查询 iOS 上的 WiFi 状态 启用 禁用 当启用 WiFi 并且设备未连接到任何网络时 查询应返回 true EDIT 我知道提供的功能Reachability类 据我了解 它无法识别 WIFI 的已启用但未连接状态
  • while 循环 PHP get_result 不起作用

    我正在尝试使用 MySQl 准备好的语句从数据库中获取行并获取结果 然而这不起作用 请有人能看到我哪里出了问题吗 我已经尝试了几个小时的解决方案 但无法使其发挥作用 该页面只是不加载 就好像查询失败一样 tag trim GET tag s
  • 部署后在django中使用scipy.stats.stats

    我正在为一个严重依赖 scipy stats stats scipy 版本 0 9 0 的包创建一个由 django 支持的 1 3 接口 称为ovl 在早期开发阶段 使用 djangos 自己的开发服务器 这没有问题 使用apache d
  • 带有 WSDL for R 的 SOAP 客户端

    我正在尝试使用 SSOAP 包为 R 的 SOAP 客户端编写代码 这是我最初的代码 wsdl lt getURL http sistemas cvm gov br webservices Sistemas SCW CDocs WsDown
  • 如何在 WinForms 中绘制形状[重复]

    这个问题在这里已经有答案了 我正在尝试编写类似绘画的程序 您可以通过选择所需的形状来绘制填充形状 单击图片框并拖动鼠标以获得所需的尺寸 但THIS当我拖动时可能会发生 当我使用refresh 之前绘制的形状会自行删除 我应该怎么做才能绘制填