Бывалый

Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009
Репутация: нет Всего: 1
|
| Код | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading;
namespace WindowsFormsApplication8 { public partial class Form1 : Form { Bitmap bmp; Rectangle rectSelected; //прямоугольник которым выделяют Rectangle rectBack; //прямоугольник для заливки всего окна Size size; Point clickPoint; Point nowPoint; Graphics gr; Pen pen; SolidBrush brushWhite, brushBack; //кисти Form formBack; //форма, которая будет содержать на себе скриншот public BufferedGraphics bufferedGraphics; public BufferedGraphicsContext bufferedGraphicsContext;
public Form1() { InitializeComponent(); gr = Graphics.FromHwnd(this.Handle); this.bufferedGraphicsContext = BufferedGraphicsManager.Current; this.bufferedGraphicsContext.MaximumBuffer = new Size(this.Width, this.Height); this.bufferedGraphics = bufferedGraphicsContext.Allocate(gr, new Rectangle(new Point(rectSelected.X, rectSelected.Y), new Size(rectSelected.Width + 1, rectSelected.Height + 1))); }
/// <summary> /// Загрузка формы /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void Form1_Load(object sender, EventArgs e) { size = new Size(0, 0); clickPoint = new Point(0, 0); nowPoint = new Point(0, 0); rectSelected = new Rectangle(nowPoint, size); // this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | // ControlStyles.AllPaintingInWmPaint, true); formBack = new FormBackground(); //форма для скриншота, позади жёлтой формы находиться brushWhite = new SolidBrush(Color.White); //для заполнения внутренней части выделяемого прямоугольника, чтобы //жёлтое окно стало прозрачным внутри прямоугольника brushBack = new SolidBrush(Color.FromArgb(255, 255, 192)); //для заливки всего окна (типа стёрка, чтобы не мигало как в Clear())
pen = new Pen(Color.Blue, 2); //то чем рисуется выделяемая область rectBack = Screen.PrimaryScreen.Bounds; }
/// <summary> /// Перейти в режим выделения области на экране для последующего её сохранения в файл /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void button1_Click(object sender, EventArgs e) {
this.WindowState = FormWindowState.Minimized; formBack.WindowState = FormWindowState.Minimized; formBack.FormBorderStyle = FormBorderStyle.None; formBack.TopMost = true; formBack.ControlBox = false;
this.TransparencyKey = Color.White; this.BackColor = Color.FromArgb(255, 255, 192); this.FormBorderStyle = FormBorderStyle.None; this.TopMost = true; this.button1.Visible = false; this.btnClose.Visible = true; this.Opacity = 0.3; this.contextMenuStrip1.Items[0].Enabled = true; this.Cursor = Cursors.Cross; //заменяет курсор крестиком for (int i = 0; i < 1; i++) { Thread.Sleep(500); } CreateScreenshot(); formBack.BackgroundImage = bmp;
formBack.WindowState = FormWindowState.Maximized; this.WindowState = FormWindowState.Maximized; this.Visible = true; formBack.Visible = true; this.Activate();
// bmpScreenshot.Save(Application.StartupPath + "\\" + "ScreenShot.png", ImageFormat.Png); }
/// <summary> /// Отпускание кнопки мыши на форме /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void Form1_MouseUp(object sender, MouseEventArgs e) { //Bitmap bmp = new Bitmap(rectSelected.Width, rectSelected.Height); //Graphics gfxScreenshot; //gfxScreenshot = Graphics.FromImage(bmp); //gfxScreenshot.CopyFromScreen(rectSelected.Location, Point.Empty, bmp.Size); //bmp.Save(Application.StartupPath +"\\"+ "image.bmp", ImageFormat.Bmp);
this.Cursor = Cursors.Default; //восстановить курсор по умолчанию }
/// <summary> /// Зажатие кнопки мыши на форме /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) //если нажата левая кнопка мыши { clickPoint.X = e.Location.X; clickPoint.Y = e.Location.Y; } }
/// <summary> /// Движение мыши по форме /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void Form1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { //gr.DrawRectangle(pen, rectSelected); //рисуем прямоугольник которым выделяем область
nowPoint.X = e.X; nowPoint.Y = e.Y; if (nowPoint.X > clickPoint.X) { size.Width = nowPoint.X - clickPoint.X; //вычитаем из места где был первый клик текущее rectSelected.X = clickPoint.X; } else { size.Width = clickPoint.X - nowPoint.X; rectSelected.X = clickPoint.X - size.Width; }
if (nowPoint.Y > clickPoint.Y) { size.Height = nowPoint.Y - clickPoint.Y; rectSelected.Y = clickPoint.Y; } else { size.Height = clickPoint.Y - nowPoint.Y; rectSelected.Y = clickPoint.Y - size.Height; }
rectSelected.Width = size.Width; rectSelected.Height = size.Height;
this.bufferedGraphicsContext.MaximumBuffer = new Size(size.Width + 1, size.Height + 1); this.bufferedGraphics = bufferedGraphicsContext.Allocate(gr, new Rectangle(new Point(clickPoint.X, clickPoint.Y), new Size(size.Width + 1, size.Height + 1)));
Rectangle rectSel = new Rectangle(rectSelected.X, rectSelected.Y, rectSelected.Width, rectSelected.Height); Rectangle rectBackground = new Rectangle(0, 0, formBack.Width, formBack.Height); bufferedGraphics.Graphics.DrawRectangle(Pens.Red, rectSel); bufferedGraphics.Graphics.FillRectangle(brushWhite, rectSelected); bufferedGraphics.Graphics.FillRectangle(brushBack, rectBackground); bufferedGraphics.Render(gr); } }
/// <summary> /// Нажатие по кнопке "Закрыть" /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void btnClose_Click(object sender, EventArgs e) { this.Close(); }
/// <summary> /// Восстановить вид окна на начальный /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void вернутьОбратноToolStripMenuItem_Click(object sender, EventArgs e) { this.FormBorderStyle = FormBorderStyle.FixedSingle; this.TopMost = false; //сделать НЕ поверх всех окон this.WindowState = FormWindowState.Normal; //стиль окна "Нормальный" this.button1.Visible = true; this.btnClose.Visible = false; this.contextMenuStrip1.Items[0].Enabled = false; }
/// <summary> /// Выйти из приложения /// </summary> /// <param name="sender">Отправитель</param> /// <param name="e">Аргументы</param> private void выходToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); //выход из приложения }
public void CreateScreenshot() { Bitmap bmpScreenshot; Graphics gfxScreenshot; bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); gfxScreenshot = Graphics.FromImage(bmpScreenshot); gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); bmp = new Bitmap(bmpScreenshot);
//return bmpScreenshot; } } }
|
Вот такое приложение, долно отрисовывать прямоугольник под скриншот, но не рисует. Рисовал по другому, всё мигало бешено, поэтому решил так сделать, нашёл пример тут на форуме, но всё равно не работает. Могу даже исходники скинуть, если надо, помогите кто нибудь, уже 2 дня не могу проблему решить. Вообще это типа как "Ножницы" в Windows 7. Это сообщение отредактировал(а) CasperSC - 25.3.2010, 17:49
|