Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не рисуется ничего. BufferedGraphics, Уже нет сил, всё что можно пробовал 
:(
    Опции темы
CasperSC
Дата 25.3.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
CasperSC
Дата 26.3.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Вот сам решил проблему:
Код

        /// <summary>
        /// Отрисовываем всё в буфере
        /// </summary>
        public void DrawTOBuffer()
        {   //выставляем размер буфера "весь экран"
            bufferGraphicsContext.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
            
            bufferGraphics = bufferGraphicsContext.Allocate(gr,
                 new Rectangle(0, 0, this.Width + 1, this.Height + 1)); //создаём буфер

            bufferGraphics.Graphics.FillRectangle(brushBack, rectBack); //стераем прошлый рисунок
            bufferGraphics.Graphics.DrawRectangle(pen, rectSelected); //рисуем новый прямоугольник
            bufferGraphics.Graphics.FillRectangle(br, rectSelected); //заливаем его цветом
        }


Вызываем метод в событии MouseMove (в моём случае)
Код

        /// <summary>
        /// Движение мыши по форме
        /// </summary>
        /// <param name="sender">Отправитель</param>
        /// <param name="e">Аргументы</param>
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                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;
               
                DrawTOBuffer(); //Производим отрисовку в буфере
                bufferGraphics.Render(); //выводим, то что отрисовалось в буфере
            }
        }


Ну и это можно запихать в конструктор, я в событие нажатия кнопки, которая запускала вообще весь процесс создания места на котором выделяешь область иначе была ошибка, особо пока не вникал, сделал работает, пока и этому рад:
Код

            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            gr = Graphics.FromHwnd(this.Handle);
            bufferGraphicsContext = new BufferedGraphicsContext();
            bufferGraphicsContext = BufferedGraphicsManager.Current;



Мне интересно, неужели никто не знал как рисовать сначала в буфере, а потом выводить на экран? Или мож я слишком много кода в первом посту выложил, что всем было лень читать его?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0416 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.