剪切工具滞后荧光笔

2023-12-05

我尝试在 C# Winforms 中创建荧光笔。我使用的大部分代码都在这里像截图工具一样突出显示效果但当我尝试画得太快时,它就会滞后。不确定我做错了什么。这是我尝试过的。

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Bitmap bmp = (Bitmap)pictureBox1.Image;
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        IntPtr hBMP = bmp.GetHbitmap();
        IntPtr bDC = g.GetHdc();
        IntPtr mDC = CreateCompatibleDC(bDC);
        IntPtr oDC = SelectObject(mDC, hBMP);

        int useColor = System.Drawing.ColorTranslator.ToWin32(brush.Color);
        IntPtr pen = CreatePen(PS_SOLID, _w, (uint)useColor);
        IntPtr xDC = SelectObject(mDC, pen);
        SetROP2(mDC, R2_MASKPEN);
        Rectangle dest = new Rectangle(currentX - _x, currentY - _y, _w, _h);
        Rectangle(mDC, dest.Left, dest.Top, dest.Right, dest.Bottom);
        SetROP2(mDC, R2_COPYPEN);

        BitBlt(bDC, 0, 0, bmp.Width, bmp.Height, mDC, 0, 0, SRCCOPY);
        SelectObject(mDC, xDC);
        DeleteObject(pen);
        g.ReleaseHdc(bDC);
        SelectObject(mDC, oDC);
        DeleteDC(mDC);
        DeleteObject(hBMP);
    }
}

enter image description here

What I'm trying to do is: enter image description here

Edit

bool draw = false;
int currentX = 0;
int currentY = 0;

//Rectangle width/height
int _w = 6;
int _h = 18

//These are just to center the cursor according to the width and height of rectangle.
int _x = 3; //(half of _w)
int _y = 9; //(half of _h)

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    draw = true;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && draw == true)
    {
        currentX = e.X;
        currentY = e.Y;
        pictureBox1.Invalidate();
    }
}

您需要将点存储在列表中,然后为了平滑绘图,使用基于这些点绘制曲线DrawCurve。此外,您还需要设置一支具有适当设置(例如圆形)的宽笔LineJoin, StartCap and EndCap,然后你可以得到如下的高亮图:

enter image description here

List<List<Point>> Lines = new List<List<Point>>();
bool drawing = false;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    Lines.Add(new List<Point>());
    Lines.Last().Add(e.Location);
    drawing = true;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (drawing) { Lines.Last().Add(e.Location); pictureBox1.Invalidate(); }
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    if (drawing)
    {
        this.drawing = false;
        Lines.Last().Add(e.Location);
        pictureBox1.Invalidate();
    }
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    using (var pen = new Pen(Color.FromArgb(150, Color.Yellow), 30)
    {
        LineJoin = System.Drawing.Drawing2D.LineJoin.Round,
        StartCap = System.Drawing.Drawing2D.LineCap.Round,
        EndCap = System.Drawing.Drawing2D.LineCap.Round,
    })
        foreach (var item in Lines)
            e.Graphics.DrawCurve(pen, item.ToArray());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剪切工具滞后荧光笔 的相关文章

  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 是否可以提供一种将对象转换为角度模板字符串的隐式方法?

    假设我有一些具有相同原型的对象 并且我想在 Angular 模板中自定义它们的显示 我知道我可以创建自己的过滤器 然后像这样使用它 p anObjectOfProtoP myCustomFilter p 或附加到 scope 的函数 p m
  • 外键参考复合主键

    该数据库将存储有关硬件设备及其收集的数据的信息 我创建了一个设备表来存储可用的硬件设备 CREATE TABLE IF NOT EXISTS devices deviceID int 10 unsigned NOT NULL AUTO IN
  • 新窗口句柄在 IE 中消失,无法切换到新窗口

    我在 Internet Explorer 10 中使用最新版本的 Selenium 2 37 0 和 C 使用最新的 32 位 InternetExplorerDriver 2 37 0 登录网页 单击打开新窗口的按钮 然后然后将焦点更改到
  • CSS渐变产生虚线

    我需要打印 textarea 内容 用户输入 我只是使用 css 渐变在文本下方生成线条 下面的 css 对我来说很有效 linedText color 000000 line height 24px background color ff
  • C# 线程安全与 get/set

    这是 C 的详细问题 假设我有一个带有对象的类 并且该对象受锁保护 Object mLock new Object MyObject property public MyObject MyProperty get return proper
  • 画布中的模糊 svg

    为什么 SVG 在画布中无法正确缩放 全是像素化且模糊 我究竟做错了什么 我想要的只是 SVG 图像无论画布大小如何都能保持其纵横比 并且不会变得模糊 var canvas document getElementById screen ct
  • 根据填充颜色索引删除行

    我正在尝试删除范围内的所有行A7 AI300包含黄色填充的单元格 颜色索引 6 我有一些代码将删除包含该颜色的所有行 但我遇到的问题是它正在尝试运行整个工作表的代码并将冻结我的工作簿 我正在尝试插入一个范围以加快计算速度 谁能告诉我如何插入
  • 每个 Pandas 数据框行的词频

    我正在尝试找出如何获取每个数据帧行中最常见的单词 比如说前 10 个最常见的单词 我的代码可以获取整个 DF 中最常见的单词 但现在我需要更精细 import pandas as pd import numpy as np df1 pd r
  • 实体框架 4 未关闭 sql server 2005 profiler 中的连接

    我第一次在 ASP net 应用程序中使用实体框架 4 我想确保数据库连接在离开using语句后关闭 但是 在SQL Server 2005分析器中 我在离开using时看不到连接注销 只能看到输入时的登录 例如 我从一个空白的 asp n
  • 在 Matlab 中生成矩阵的所有可能组合

    知道该矩阵的元素只能是 0 或 1 如何生成 N M 矩阵的所有可能值 例如 如果我想要一个 2 2 矩阵 我们会得到 16 个具有不同可能组合的矩阵 0 0 0 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 等 Us
  • 绝对真实的居中背景图像

    我有一个网站 其中居中的背景图像在主页动画中起着至关重要的作用 背景会一直居中 直到浏览器窗口无法适应网站的宽度 此时背景会左对齐 这是我的身体代码 body line height 1 margin 0px auto padding 0p
  • Kivy 错误:[严重] [应用程序] 无法获取窗口,中止

    我看到的针对这个 Kivy 错误的所有解决方案对我来说都不起作用 现在已经过去两周多了 但我所有的努力都白费了 我使用 python 3 6 4 kivy 1 10 1 pycharm 作为我的 IDE 和 Windows 10 这是错误代
  • Angular – 通过提交表单将组件的新实例添加到显示中,动态加载同一组件的多个实例

    问题更新链接 Problem 我试图动态加载同一组件的多个实例 当用户提交表单时 新组件会添加 加载到屏幕上 其背后的想法是 用户可以提供表单的详细信息 然后将其显示在所创建的组件的特定实例上 我最初的想法是拥有某种数据结构 例如键对值的数
  • JOOQ:使用字符串获取表和列?

    您好 我正在将 JOOQ 与 Spring Boot 结合使用 想知道是否有办法获取表及其列及其名称字符串 例如 我希望能够通过执行以下操作来获得一张桌子 someObject getTable user 然后使用该 get 方法的结果 我
  • Vagrant 错误:无法在 Linux 来宾中挂载文件夹

    我对 Vagrant 共享文件夹有一些问题 我的基本系统是 Ubuntu 13 10 桌面 我不明白为什么我会出现此错误 是配置不正确吗 是 NFS 问题还是 Virtualbox Guest Additions 问题 我尝试过使用不同的许
  • 当用户尝试在 vb6 中打开新实例时返回到已打开的应用程序

    假设用户将我的 Visual Basic 应用程序最小化到任务栏通知图标 现在我希望当用户打开一个新实例时 旧实例应该恢复 通常 创建单实例应用程序的策略是在应用程序初始化中添加一些代码来确定实例是否已在运行 如果是 它会获取主窗口的句柄
  • 对 d3.js 堆积条形图进行排序

    目前这个堆积条形图根据每个条形的总计从左到右排序 我还如何对每个单独的条形图进行排序 而不是按键对每个单独的条形图进行排序 即 5 岁以下位于底部 65 岁及以上位于顶部 而是按值 最大 对每个单独的条形图进行排序位于底部 最小位于顶部 例
  • Fabric.js 定义图像的边界/限制

    I ve set up a fabric js based t shirt simulator Everything works as expected except for one detail that the client would
  • 如何在 Java 应用程序中使用 Akka Actors?

    我想用阿卡演员在爪哇 我下载了akka 1 0 zip并添加了akka actor 1 0 jar到我在 Eclipse 中的 构建路径 然后我写了这个 Actor 类 package com example import akka act
  • 剪切工具滞后荧光笔

    我尝试在 C Winforms 中创建荧光笔 我使用的大部分代码都在这里像截图工具一样突出显示效果但当我尝试画得太快时 它就会滞后 不确定我做错了什么 这是我尝试过的 private void pictureBox1 Paint objec