Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 26.08.2010, 21:47   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию [C# + WPF] Выделение области экрана. Способ жуткий тормоз.

Привет всем. Написал класс для выделения области на экране, всё работает но как мне кажется жутко тормозит. Подозреваю это из за перерисовки всего экрана, то есть надо бы переделать вообще это. И мне хотелось бы узнать как это можно сделать? Что то на ум ничего толкового не приходит. Может кто, что нибудь посоветует? Я ещё не закончил с этим классом, поэтому там пока полный хаос, я аж сам иногда путаюсь, что к чему, мне главное сделать, чтобы работало как надо, а красоту и удобство навести можно потом.


Я имею ввиду, какими классами для работы с изображениями можно воспользоваться и хотябы в общих словах, как сделать, чтобы не так тормозило?

Можно скачать проект с этим классом (72.5 кб)

Код огромный для этого форума. Так что приведу лишь небольшую часть кода из класса:
Код:
        private static void DrawLightRegtangle(Int32Rect rectForDraw)
        {
            if (rectForDraw.Width > 0 && rectForDraw.Height > 0)
            {
                Rect imgRect = new Rect(new Point(0, 0), new Point(bmpImageOriginal.Width, bmpImageOriginal.Height));
                drawingContext = drawingVisual.RenderOpen();
                drawingContext.DrawImage(imgSourceShaded, imgRect);

                CroppedBitmap cb = new CroppedBitmap((BitmapSource)image.Source, rectForDraw);
                Rect rectForLosso = new Rect((double)rectForDraw.X, (double)rectForDraw.Y,
                    (double)rectForDraw.Width, (double)rectForDraw.Height);
                drawingContext.DrawRectangle(solidColorBrush, null, rectForLosso);
                drawingContext.DrawImage(cb, rectForLosso);
                drawingContext.Close();

                renderTargetBitmap = new RenderTargetBitmap((int)bmpImageOriginal.Width, (int)bmpImageOriginal.Height, 96, 96,
                    System.Windows.Media.PixelFormats.Pbgra32);
                renderTargetBitmap.Render(drawingVisual);
                ImageBrush imgBrush = new ImageBrush();
                imgBrush.AlignmentX = AlignmentX.Left;
                imgBrush.AlignmentY = AlignmentY.Top;
                imgBrush.Stretch = Stretch.None;
                imgBrush.TileMode = TileMode.None;
                imgBrush.ImageSource = renderTargetBitmap;
                windowBackground.Background = imgBrush;
            }
        }

Последний раз редактировалось Casper-SC; 26.08.2010 в 21:52. Причина: Нечайно создал тему с названием - ыыыыыыыыыыыыы
Casper-SC вне форума   Ответить с цитированием
Старый 26.08.2010, 21:55   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Сам когда только начала использовать WPF тоже начал ручками рисовать )) сглупил. Выбросьте этот код и используйте компонент Rectangle или тот же Border. Прозрачность окна где надо и не надо все настраивается в Blend или ручками в xaml in VS пробуйте
BOBAH13 вне форума   Ответить с цитированием
Старый 26.08.2010, 22:20   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Что-то я не совсем понимаю как это сделать. В этом коде я просто делаю скриншот всего экрана, записываю в BitmapImage, потом просто закрашиваю скриншот кистью с сплошным цветом и с прозрачностью. Получается затенённый скриншот:

Короче 2 скриншота одинаковых, только один затенённый из них.
А так я использую Rectangle.
Casper-SC вне форума   Ответить с цитированием
Старый 27.08.2010, 14:50   #4
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Так что, знает кто нибудь как это сделать? Вот набросал я примерно так как было посоветовано. И как теперь выделять область так, чтобы внутри выделения картинка была видна нормально? Что-то я не понимаю, много перепробовал всего, не выходит и всё. В результате надо то, что на скриншоте выше в прошлом моём сообщении.
Код:
<Window x:Class="Wpf_Рисование.BackgroundWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="BackgroundWindow" Height="516" Width="670" Name="winBack" ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True" WindowStyle="None" WindowState="Maximized" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <Canvas Name="canvasMain">        
        <Image Source="/Wpf_Рисование;component/bin/Debug/AquaCool.jpg"
             Width="{Binding ElementName=canvasMain, Path=ActualWidth}" 
             Height="{Binding ElementName=canvasMain, Path=ActualHeight}"
             HorizontalAlignment="Left" 
             VerticalAlignment="Top">
        </Image>
        <Rectangle Fill="#7C000000" Width="{Binding ElementName=winBack, Path=Width}"
             Height="{Binding ElementName=winBack, Path=Height}" 
             Canvas.Left="0" Canvas.Top="0" OpacityMask="Aqua" />
        <Rectangle Name="rectLosso" Fill="Crimson" Width="395" Height="221" 
            Canvas.Left="151" Canvas.Top="75" 
            Stroke="Red" OpacityMask="Aqua"
            MouseDown="Rectangle_MouseDown" />
    </Canvas>
</Window>
Народ ну подскажите, что нибудь. Хоть вообще напишите, что кто сказать по этому поводу может? А то вопрос задал, пару человек, что-то написали, всё тема умерла (не конкретно про эту тему речь). Ответ не найден. Если сам нахожу стараюсь всегда сюда отписать, для тех у кого будут подобные вопросы в будущем.
Casper-SC вне форума   Ответить с цитированием
Старый 28.08.2010, 21:17   #5
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Короче это не реально, что только я не пробовал. Ну никак не делается по другому. И OpacityMask использовал и прямоугольники заливал разными способами, вообще ничего толкового не вышло, тупо разными цветами заливается 2 прямоугольника, один которым выделяешь, а второй растянутый по верх формы, типа затеняющий картинку. Уже терпения нет. Пожалуй заброшу эту идею.
Casper-SC вне форума   Ответить с цитированием
Ответ
Опции темы