Математика управления изменением размера

Итак... Итак, у меня есть эта довольно убойная система скриншотов, которую я использую некоторое время... Она в значительной степени включает в себя создание несколько прозрачной формы, которая автоматически подгоняется под все мониторы... Что дает экран ( s) эффект "затемнения"... Затем у меня есть скрытая "кнопка", позиция которой устанавливается при нажатии кнопки мыши... Затем, пока мышь не будет поднята, размер кнопки будет изменяться в режиме реального времени, чтобы создать своего рода область "выбора"... Кнопке предоставляется полная прозрачность для реализации этого эффекта.

Пример источника: http://db.tt/LWxfDB6 [Также опубликовано ниже]

Я полагаю, что у меня есть две проблемы, которые напрямую связаны между собой.

1.) Координаты отключены для мультимониторов, он правильно возвращает координаты, на которые нажали (выделены), но окно выделения (эффект) часто находится не на том мониторе.

2.) Вы можете выбрать только из верхнего левого ---> нижнего правого, а не универсального.

Извините, если я не объяснил это хорошо, источник должен объяснить лучше. Заранее спасибо за любую полученную помощь. :)

:MarkRect.cs:


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

namespace TW_Media_Chat_ { public partial class MarkRect : Form { Point Point1; Point Point2; public MarkRect() { InitializeComponent(); // Programatically maximize to all monitors Screen[] Screens = Screen.AllScreens; int AllWidth = 0; int AllHeight = 0; for (int index = 0; index < Screens.Length; index++) { AllWidth += Screens[index].Bounds.Width; AllHeight += Screens[index].Bounds.Height; } this.Width = AllWidth; this.Height = AllHeight;

    }

    private void Transparency_MouseDown(object sender, MouseEventArgs e)
    {
        button1.Visible = true;
        button1.Location = Cursor.Position;
        Point1 = Cursor.Position;
    }
    private void Transparency_MouseUp(object sender, MouseEventArgs e)
    {
        this.Visible = false;
        Point2 = Cursor.Position;
        AjaxChatBridge.AjaxVars.Point1 = Point1;
        AjaxChatBridge.AjaxVars.Point2 = Point2;
        this.Close();
    }

    private void MarkRect_MouseMove(object sender, MouseEventArgs e)
    {
        this.button1.Width = Cursor.Position.X - this.button1.Left;
        this.button1.Height = Cursor.Position.Y - this.button1.Top;
    }
}

}

:MarkRect.Designer.cs:


namespace TW_Media_Chat_
{
    partial class MarkRect
    {
        /// 
        /// Required designer variable.
        /// 
        private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.button1 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // button1
        // 
        this.button1.BackColor = System.Drawing.Color.Lime;
        this.button1.ForeColor = System.Drawing.Color.Lime;
        this.button1.Location = new System.Drawing.Point(220, 172);
        this.button1.Name = "button1";
        this.button1.Size = new System.Drawing.Size(19, 18);
        this.button1.TabIndex = 0;
        this.button1.Text = "button1";
        this.button1.UseVisualStyleBackColor = false;
        this.button1.Visible = false;
        // 
        // MarkRect
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.Black;
        this.ClientSize = new System.Drawing.Size(490, 406);
        this.Controls.Add(this.button1);
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.Name = "MarkRect";
        this.Opacity = 0.5D;
        this.Text = "Transparency";
        this.TopMost = true;
        this.TransparencyKey = System.Drawing.Color.Lime;
        this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Transparency_MouseDown);
        this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MarkRect_MouseMove);
        this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Transparency_MouseUp);
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.Button button1;
}

}


person BinaryBrother    schedule 26.03.2011    source источник


Ответы (1)


  1. Вы должны реализовать логику изменения размера элемента управления проще:

    void MarkRect_MouseMove(...) { var mouseX = Cursor.Position.X; var originalMouseX = Point1.X;

    button1.Left = Math.Min(mouseX, originalMouseX);
    button1.Width = Math.Abs(mouseX - originalMouseX);
    
    // the same for Y
    

    }

  2. Вы должны опубликовать этот код здесь. Нам лень заходить в ваш дропбокс, чтобы увидеть код. Здесь проще ответить на вопросы.

person Snowbear    schedule 26.03.2011
comment
Я бы сказал, что DropBox лучше служит моей цели; Чтобы загрузить исходный код для тестирования, так как большая его часть представляет собой код конструктора, но ради других, которые разделяют ваше мнение, он был отредактирован в вопросе. [Или будет через 30 секунд]. - person BinaryBrother; 27.03.2011
comment
P.S. Ваше решение-решение устранило проблему универсального выбора. У меня нет нескольких мониторов для тестирования на банкомате, но я прокомментирую, когда получу доступ к набору. :) А теперь вернуть координаты кнопки? Это полностью свело на нет структуру, которую я использовал раньше, и я не могу ее понять. :/ - person BinaryBrother; 27.03.2011
comment
@BinaryBrother, мое решение не было нацелено на проблему многоэкранного режима, поскольку у меня нет опыта в таких вещах. - person Snowbear; 27.03.2011
comment
@BinaryBrother, о какой структуре вы говорите? - person Snowbear; 27.03.2011
comment
Извините за задержку ответа. Я имел в виду метод, который использовал ранее... Чтобы вернуть координаты мыши вниз и вверх, чтобы дать мне хорошее представление о прямоугольнике выбора, чтобы я мог передать эти координаты в функцию снимка экрана. Теперь координаты могут быть перевернуты, что устраняет проблему с инвертированным выбором и математикой управления изменением размера, но полностью сломало мою функцию снимка экрана. Я мог бы пересмотреть свой вопрос и отметить его как ответ, а затем задать другой вопрос в другом вопросе (ветке). (так как это 2 разные проблемы). Было бы лучше? - person BinaryBrother; 31.03.2011