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

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

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


Ответ
 
Опции темы
Старый 26.08.2010, 21:47   #1
Casper-SC
Участник клуба
 
Регистрация: 04.07.2007
Адрес: Россия
Сообщений: 549
Репутация: 134

icq: 438116304
По умолчанию [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
Адрес: Los Angeles, USA
Сообщений: 3,710
Репутация: 1457
По умолчанию

Сам когда только начала использовать WPF тоже начал ручками рисовать )) сглупил. Выбросьте этот код и используйте компонент Rectangle или тот же Border. Прозрачность окна где надо и не надо все настраивается в Blend или ручками в xaml in VS пробуйте
__________________
Home | Android for food | XWindows Dock | github
BOBAH13 вне форума   Ответить с цитированием
Старый 26.08.2010, 22:20   #3
Casper-SC
Участник клуба
 
Регистрация: 04.07.2007
Адрес: Россия
Сообщений: 549
Репутация: 134

icq: 438116304
По умолчанию

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

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

icq: 438116304
По умолчанию

Так что, знает кто нибудь как это сделать? Вот набросал я примерно так как было посоветовано. И как теперь выделять область так, чтобы внутри выделения картинка была видна нормально? Что-то я не понимаю, много перепробовал всего, не выходит и всё. В результате надо то, что на скриншоте выше в прошлом моём сообщении.
Код:

<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
Репутация: 134

icq: 438116304
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


21:06.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru