绘制可翻转的矩形

2024-02-14

我得到了代码http://support.microsoft.com/kb/314945 http://support.microsoft.com/kb/314945绘制一个可翻转/橡皮筋矩形。我向其中添加了代码,这样当我离开鼠标左键时,也会在图像上创建一个矩形,然后我用它来裁剪图像。

这效果棒极了。唯一的问题是橡皮筋矩形不是从鼠标所在的位置开始或结束......差异很小,但仍然非常值得注意。之后我使用相同的坐标来绘制矩形,该矩形恰好在我的鼠标开始和结束的位置绘制。帮助将不胜感激。

这是代码:(已解决问题 - 添加其他人可以从中受益的代码) 我已将其设为控件,并在需要的地方使用它!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CroppingControl
{
    public partial class CroppingImage : UserControl
    {
        Rectangle rc = new Rectangle();
        Boolean bHaveMouse;
        Point ptOriginal = new Point();
        Point ptLast = new Point();
        Image Pic;

        public CroppingImage()
        {
            InitializeComponent();
            pictureBox1.MouseDown += new MouseEventHandler(MyMouseDown);
            pictureBox1.MouseUp += new MouseEventHandler(MyMouseUp);
            pictureBox1.MouseMove += new MouseEventHandler(MyMouseMove);
            bHaveMouse = false;
        }


        public Image Image
        {
            set
            {
                pictureBox1.Image = value;
                Pic = value;
            }
            get
            {
                return pictureBox1.Image;
            }
        }

        public void MyMouseDown(Object sender, MouseEventArgs e)
        {
            pictureBox1.Image = Pic;
            // Make a note that we "have the mouse".

            bHaveMouse = true;
            // Store the "starting point" for this rubber-band rectangle.
            ptOriginal.X = e.X;
            ptOriginal.Y = e.Y;
            // Special value lets us know that no previous
            // rectangle needs to be erased.
            ptLast.X = -1;
            ptLast.Y = -1;
        }

        // Convert and normalize the points and draw the reversible frame.
        private void MyDrawReversibleRectangle(Point p1, Point p2)
        {
            Point px = p1;
            Point py = p2;

            // Convert the points to screen coordinates.
            p1 = PointToScreen(p1);
            p2 = PointToScreen(p2);
            // Normalize the rectangle.
            if (p1.X < p2.X)
            {
                rc.X = p1.X;
                rc.Width = p2.X - p1.X;
            }
            else
            {
                rc.X = p2.X;
                rc.Width = p1.X - p2.X;
            }
            if (p1.Y < p2.Y)
            {
                rc.Y = p1.Y;
                rc.Height = p2.Y - p1.Y;
            }
            else
            {
                rc.Y = p2.Y;
                rc.Height = p1.Y - p2.Y;
            }
            // Draw the reversible frame.
            ControlPaint.DrawReversibleFrame(rc, Color.Black, FrameStyle.Dashed);

            rc.X = px.X;
            rc.Y = px.Y;

        }
        // Called when the left mouse button is released.
        public void MyMouseUp(Object sender, MouseEventArgs e)
        {
            // Set internal flag to know we no longer "have the mouse".
            bHaveMouse = false;
            // If we have drawn previously, draw again in that spot
            // to remove the lines.
            if (ptLast.X != -1)
            {
                Point ptCurrent = new Point(e.X, e.Y);
                MyDrawReversibleRectangle(ptOriginal, ptLast);
                Graphics graphics = pictureBox1.CreateGraphics();
                Pen pen = new Pen(Color.Gray, 2);
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                graphics.DrawRectangle(pen, rc);

            }
            // Set flags to know that there is no "previous" line to reverse.
            ptLast.X = -1;
            ptLast.Y = -1;
            ptOriginal.X = -1;
            ptOriginal.Y = -1;
        }
        // Called when the mouse is moved.
        public void MyMouseMove(Object sender, MouseEventArgs e)
        {
            Point ptCurrent = new Point(e.X, e.Y);
            // If we "have the mouse", then we draw our lines.
            if (bHaveMouse)
            {
                // If we have drawn previously, draw again in
                // that spot to remove the lines.
                if (ptLast.X != -1)
                {
                    MyDrawReversibleRectangle(ptOriginal, ptLast);
                }
                // Update last point.
                ptLast = ptCurrent;
                // Draw new lines.
                MyDrawReversibleRectangle(ptOriginal, ptCurrent);
            }
        }

    }
}

ControlPaint.DrawReversibleFrame使用屏幕坐标在屏幕上绘制一个矩形(即不考虑应用程序的窗口),这在执行拖动鼠标操作时非常有用,因为鼠标可能会移动到应用程序窗口之外。如果您在应用程序中使用这些完全相同的原始坐标进行绘制,那么它们将作为您正在绘制的控件上的坐标相对于控件的原点(通常是其左上角)而显示出来。

要使用屏幕坐标,首先需要使用以下命令将它们转换为控制坐标:PointToClient() or RectangleToClient()您正在绘画的控件上的方法,例如

// panel`s OnPaint
Rectangle screenRectangle = ...
Rectangle clientRectangle = panel.RectangleToClient(screenRectangle);
graphics.DrawRectangle(Pens.Red, clientRectangle);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绘制可翻转的矩形 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 如何扩展 jQuery UI 日期选择器来修改“今日”按钮并添加帮助图标

    我想扩展基于 jQuery UI datepicker 小部件 并将其称为 datepickerHelp jQuery UI 日期选择器小部件 http api jqueryui com datepicker 我对扩展感兴趣而不是直接修改
  • Docker 主机的 Elastic Beanstalk 环境变量

    我有一个 EB 环境 其中正确部署了 Docker Web 应用程序 rails 我设置了几个 EB 环境变量 它们在容器中正确可见 现在 我希望这些 EB 环境变量对 EC2 实例主机可见 以便我可以在 docker 构建过程中使用它们
  • 将 scala/spark 信息写入 MongoDB

    我有一个日志数据 其中包含如下数据 Started by timer Finished SUCCESS 对于每个日志数据 日志状态 此处为 Finished 和状态 SUCCESS 需要写入MongoDB case class Logs s
  • XMLHttpRequest 和 http 流

    我的目标是从浏览器读取 HTTP MP3 音频流并访问原始音频数据 HTML5 让我可以轻松播放流 但据我所知 不允许访问原始音频数据 它只是播放它 JS XMLHTTP请求可以通过HTTP下载文件并处理原始音频数据 它似乎是一个很好的候选
  • 这个 MATLAB 循环是否有更优雅的替代方案?

    我想更好地在 MATLAB 中对循环进行矢量化 目前 我正在尝试计算整数列表中值的出现次数 我的代码与此类似 list 1 2 2 3 1 3 2 2 2 1 5 occurrence list zeros 1 max list for x
  • 为什么 uglify-js 会报告“警告:输出超过 32000 个字符”?

    构建管道是 Typescript browserify browserify css uglify 运行时库 react bootstrap 到目前为止 我的应用程序功能很少 这就是为什么我问这是否会在以后困扰我 即使它现在看起来可以工作
  • 析构函数与 IDisposable?

    我读过有关在 C 中处置对象 IDisposable 接口和析构函数的内容 但对我来说 它们似乎做了同样的事情 两者有什么区别 我为什么要使用其中一种而不是另一种 事实上 在这个示例 下面的链接 中 这段代码同时使用了 IDisposabl
  • 语音识别和语音合成入门

    我想开始语音识别和语音合成 在基于语音识别的原型 https stackoverflow com questions 3865351 prototype based on speech recognition有人告诉我使用微软语音服务器 s
  • 显示相同项目的放大弹出窗口

    参考这个question https stackoverflow com questions 26151953 magnific popup showing first item only 它有一个有用的答案 但它是部分答案 因为它只显示三
  • Ajax 调用返回整个页面

    我有以下页面 其中包含一些随机提示 http www javaexperience com tips 我只想在网站的其他页面上显示提示 因此我进行 ajax 调用并将 ajax 响应返回的任何内容添加到 Div 的 HTML 中 DIV h
  • 使用 tidyverse 或 dplyr 进行简单 mutate 引发的错误

    我在使用 tidyverse 包时遇到了严重的问题 无法调试 例如 即使在我过去已经制作的项目中 mutate 也无法正常工作 这一切都是从我安装以下软件包时开始的 library pdftools library tm library s
  • 我不小心删除了 Android 密钥库,如何恢复?

    好吧 我的动作很顺利 我现在无法更新市场中的任何应用程序 因为我不小心删除了我的 Android 密钥库 有谁知道我怎样才能把它拿回来 我尝试过运行恢复程序 但由于某种原因它没有出现 如果您丢失了私钥 它将永远消失 除非您有备份 如果您可以
  • 在asp.net 3.5中导出为pdf

    我正在开发一个 asp net 3 5 应用程序 并且有一个包含表格表单数据的页面 我需要将其导出为 pdf 并进行一些额外的格式化 该页面还有一些图像位于同一表格内 一些图像位于表格外 我也希望将这些图像导出为 pdf 我怎样才能在asp
  • 如何查看php字节码文件

    我这样做是为了学习目的 我读过很多文章 PHP 首先将其源代码转换为字节码 但我无法找到一种方法来查看字节码格式 它是什么样子的 在java和C中有很多方法可以查看字节码文件 但无法在 php 中找到任何文章来查看转换后的字节码 要将 PH
  • 运行集成测试时,构建在 Jetty 启动时等待

    我正在尝试运行一些集成 验收测试 我只想在传递环境变量时运行这些测试 因此我使用以下命令 mvn clean install Denv acceptance 但构建停止于 2015 09 28 18 56 19 273 INFO oejsh
  • 在 C# 中获取网络摄像头的当前状态

    我试图弄清楚如何检查网络摄像头 视频捕获设备是否已被另一个应用程序使用 而无需实际激活它 我当前的方法是使用 AForge NET 库并使用 VideoCaptureDevice 对象的 IsRunning 属性 如下所示 var vide
  • PHP 合并具有相同键和一个相同值的数组

    我需要合并一个 PHP 数组 这个数组有 2 个名为 targetXX 的数组 我可以有 2 个或更多 每个目标都有相同的键 对于每个键 我有一个包含 2 个值 a 和 b 的数组 a 在两个目标中始终相同 但我需要像这样合并两个 B 值
  • 如何从 ASCII 文件写入/读取带有 MultiIndex 的 Pandas DataFrame?

    我希望能够创建一只熊猫DataFrame使用 MultiIndexes 为行和列索引并从 ASCII 文本文件中读取它 我的数据如下所示 col indx MultiIndex from tuples A B C A B C2 A B C3
  • Nodejs child_process.exec :禁用控制台上的标准输出打印

    我正在通过nodejs child process exec执行图像magick识别命令 并在我的脚本中使用从 stdout 返回的字符串 一切正常 但调用会在控制台上打印标准输出消息 如果服务器未重新启动并且控制台一段时间内未清除 则控制
  • 绘制可翻转的矩形

    我得到了代码http support microsoft com kb 314945 http support microsoft com kb 314945绘制一个可翻转 橡皮筋矩形 我向其中添加了代码 这样当我离开鼠标左键时 也会在图像