Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/88: Рейтинг темы: голосов - 88, средняя оценка - 4.83
82 / 9 / 1
Регистрация: 31.05.2016
Сообщений: 336
.NET 6

Как в WPF сделать окно на весь экран в XAML (как игру)

26.11.2021, 18:31. Показов 19382. Ответов 29

Студворк — интернет-сервис помощи студентам
Добрый Вечер, Форумчане!

Я стал разбираться с WPF и убедился что не один правильный ответ,
у меня не работает у меня стоит Windows 11 и я так и не добился чтобы при запуске
моего приложения оно выводилось в полноэкранный режим без заголовка окна и без таск бара,
если кто-то желает помочь, пожалуйста помогите в решении этого вопроса на StackOverflow уже ходил,
С Уважением, Segeja

вот XAML:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<Window x:Class="PageViewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PageViewer"
        mc:Ignorable="d"
        Title="PageViewer" Height="800" Width="1280">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" Background="Blue">
            <Button x:Name="PrevPage" Content="&lt;&lt;" Height="35" MinWidth="100" Margin="5,5,5,5" Click="PrevPage_Click" Background="Orange"></Button>
            <Button x:Name="NextPage" Content="&gt;&gt;" Height="35" MinWidth="100" Margin="5,5,5,5" Click="NextPage_Click" Background="Orange"></Button>
        </StackPanel>
        <Frame x:Name="MyFrame" Grid.Row="1" NavigationUIVisibility="Hidden">
            <Frame.Background>
                <ImageBrush ImageSource="/2.jpg"/>
            </Frame.Background>
        </Frame>
    </Grid>
</Window>
Это главный файл:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
 
namespace PageViewer
{
    public partial class MainWindow : Window
    {
 
        List<Page> list; // список хранящий страницы
        int index; // индекс страницы
 
        public MainWindow()
        {
            InitializeComponent();
            this.list = new List<Page>();
            index = 0;
 
            list.Add(new Page());
            list.Add(new Page1());
            list.Add(new Page2());
            list.Add(new Page3());
        }
 
        private void PrevPage_Click(object sender, RoutedEventArgs e)
        {
            if (MyFrame.Content!=null && index!=0)
            {
                index--;
                MyFrame.Content = list[index];
            }
        }
 
        private void NextPage_Click(object sender, RoutedEventArgs e)
        {
            if (MyFrame.Content == null)
            {
                MyFrame.Content = list[index];
            }
            else
            {
                index++;
                if (index < list.Count)
                {
                    MyFrame.Content = list[index];
                }
                else
                {
                    index--;
                }
            }
        }
    }
}
Добавлено через 46 минут
Я сам решил свою задачу нашёл страничку в интернете
и там решение моего вопроса, короче должно быть так:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<Window x:Class="PageViewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PageViewer"
        mc:Ignorable="d"
        Title="PageViewer" //здесь
 удалить разрешение экрана
        WindowStyle="None" ResizeMode="NoResize" WindowState="Maximized"> // и поставить вот эту строчку
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" Background="Blue">
            <Button x:Name="PrevPage" Content="&lt;&lt;" Height="35" MinWidth="100" Margin="5,5,5,5" Click="PrevPage_Click" Background="Orange"></Button>
            <Button x:Name="NextPage" Content="&gt;&gt;" Height="35" MinWidth="100" Margin="5,5,5,5" Click="NextPage_Click" Background="Orange"></Button>
        </StackPanel>
        <Frame x:Name="MyFrame" Grid.Row="1" NavigationUIVisibility="Hidden">
            <Frame.Background>
                <ImageBrush ImageSource="/2.jpg"/>
            </Frame.Background>
        </Frame>
    </Grid>
</Window>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2021, 18:31
Ответы с готовыми решениями:

Как сделать окно на весь экран?
Как сделать так чтобы окно всегда было на весь экран? Попробовал сделать через WindowState = FormWindowState.Maximized; В итоге из...

Как сделать окно GUI (JDialog) на весь экран
Мне нужно чтобы при запуске программы открывалось окно на весь экран(к примеру в 1280x720). Как это сделать?

Как сделать окно вывода во весь экран на Pascalabcnet
Добрый день! скажите пжлста--Как сделать окно вывода во весь экран на Pascalabc nри выполнении shift-f9 или выполнения exe файла во весь...

29
83 / 27 / 2
Регистрация: 02.09.2019
Сообщений: 276
31.05.2022, 17:37
Студворк — интернет-сервис помощи студентам
Элд Хасп,
Ещё, так сказать, две вариации на тему и усвоение пройденного
Попробовал Behavior. получилось следующее
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class IsFullBehavior : Behavior<WebView2>
    {
        private WebView2? _webView2;
        private Window? _window;
      
        protected async override void OnAttached()
        {
            _webView2 = AssociatedObject as WebView2;
            await _webView2.EnsureCoreWebView2Async();
            AssociatedObject.CoreWebView2.ContainsFullScreenElementChanged +=
                CoreWebView2_ContainsFullScreenElementChanged;
            _window = Window.GetWindow(AssociatedObject);
        }
        protected override void OnDetaching()
        {
            AssociatedObject.CoreWebView2.ContainsFullScreenElementChanged -=
                CoreWebView2_ContainsFullScreenElementChanged;
        }
        private WindowState _windowState;
        private void CoreWebView2_ContainsFullScreenElementChanged(object? sender, object e)
        {
            if (_webView2 != null && _window != null)
            {
                if (_webView2.CoreWebView2.ContainsFullScreenElement)
                {
                    // Повтор ранее приводимого в этой теме кода
                }
            }
        }
    }
И подключение в XAML
XML
1
2
3
4
5
<wv2:WebView2 x:Name="WebView" Grid.Row="1" Source="https://www.youtube.com/watch?v=DbHFRnyET-g">
            <i:Interaction.Behaviors>
                <local:IsFullBehavior/>
            </i:Interaction.Behaviors>
        </wv2:WebView2>
Понравилось: Простота использования.
Не понравилось: Необходимость загрузки соотв. пакета с помощью NuGet, использование большого объёма инфраструктурного кода (если я правильно выражаюсь) для решения данной задачи. Даже мне, любителю, пришёл в голову довольно простой способ решения конкретной задачи без привлечения дополнительных библиотек. Да, понимаю, пакет гораздо универсальней, разработанный самим Microsoft, но для решения не сложной задачи...

И ещё вариация и с AP и с DP, с наследованием класса, без Behavior
Класс с AP для перехода в полноэкранный режим
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 public class IsFullAP
    {
        public static bool GetIsFull(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsFullProperty);
        }
        public static void SetIsFull(DependencyObject obj, bool value)
        {
            obj.SetValue(IsFullProperty, value);
        }
        public static readonly DependencyProperty IsFullProperty =
            DependencyProperty.RegisterAttached("IsFull", typeof(bool), 
                typeof(IsFullAP), new PropertyMetadata(IsFullChanged));
        private static Window _window;
        private static WindowState _windowState;
        private static void IsFullChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (!(d is Window))
                throw new ArgumentException("Должен быть Window", nameof(d));// Позаимствовал из ваших примеров
            _window = (Window)d;
            if ((bool)e.NewValue)
            {
                // Повтор кода
            }
        }
    }
Класс - наследник WebView2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class MyWebView2: WebView2
    {
        public MyWebView2()
        {
            InitCore();
        }
        private async void InitCore()
        {
            await EnsureCoreWebView2Async();
            CoreWebView2.ContainsFullScreenElementChanged += (s, e) =>
            {
                IsFull = CoreWebView2.ContainsFullScreenElement;
            };
        }
        #region IsFull
        public bool IsFull
        {
            get { return (bool)GetValue(IsFullProperty); }
            set { SetValue(IsFullProperty, value); }
        }
 
        public DependencyProperty IsFullProperty = DependencyProperty.Register("IsFull",
            typeof(bool), typeof(MyWebView2),
                new PropertyMetadata());
        #endregion
    }
и XAML
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<Window x:Class="WindIsFull.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindIsFull"
        mc:Ignorable="d"
        x:Name="MyWin"
        Title="MainWindow" Height="450" Width="800"
        local:IsFullAP.IsFull = "{Binding ElementName=MyWebView, Path=IsFull}"
        >
    <Window.Resources>
        <Style TargetType="StackPanel">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=MyWin, Path=WindowStyle}"
                        Value="None">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackPanel x:Name="SP" Orientation="Horizontal" Height="35" VerticalAlignment="Top">
            <TextBox x:Name="TextUri" Width="300" />
            <Button Content="Перейти"   />
        </StackPanel>
        <local:MyWebView2 Grid.Row="1" x:Name="MyWebView" Source="https://youtu.be/FRIQ3u_vYf4"/>
    </Grid>
</Window>
А в класс - наследник можно добавить другие DP, которые могут понадобится в реальном проекте
Да, ещё хочу всё время добавить, но забываю. Вроде сразу напрашивается вариант типа

XML
1
local:IsFullAP.IsFull = "{Binding ElementName=WebView2, Path=CoreWebView2.ContainsFullScreenElement}"
Без наследования WebView2, но он не даёт никакого эффекта
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
31.05.2022, 19:09
Цитата Сообщение от Усталый путник Посмотреть сообщение
Понравилось: Простота использования.
Не понравилось: ...
Это (Interactivity) разработка MS и была сделано очень давно? возможно, даже одновременно с WPF.
По этим причинам Interactivity используется широка и считается одним типовых инструментов в WPF.
Большинство разработчиков с лёгкость понимают как создавать и использовать Behavior.
Согласен, что было бы лучше включить его в состав .Net, тем более что кода там совсем мало.
Но по каким-то причинам MS решили так не делать и даже отделили этот пакет от себя, пустим его "в свободное плавание".
Но с другой стороны, они по сути поступили также и с самой платформой .Net.

Цитата Сообщение от Усталый путник Посмотреть сообщение
И ещё вариация и с AP и с DP, с наследованием класса, без Behavior
Behaviors - это тоже AP свойство.
И понятно, что вместо него можно создать своё кастомное.
Вопрос больше в трудозатратах как для реализации, так и для последующего сопровождения.
1
83 / 27 / 2
Регистрация: 02.09.2019
Сообщений: 276
31.05.2022, 19:56
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Согласен, что было бы лучше включить его в состав .Net, тем более что кода там совсем мало.
Может я что не понимаю... Щёлкаю на класс предок Behavior, перехожу к определению. Там вижу заголовок класса
C#
1
public abstract class Behavior<T> : Behavior where T : DependencyObject с небольшим телом
Снова в этом окне щёлкаю на класс предок Behavior, перехожу к определению
Там уже довольно много кода и класс в свою очередь наследуется от Animatable и реализует интерфейс IAnimatable
Может авторы переработали реализацию, но как-то сложновато. Посмотрел свойства этого пакета в NuGet, дата публикации 18 ноября 2021 г
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
31.05.2022, 20:03
Цитата Сообщение от Усталый путник Посмотреть сообщение
Может авторы переработали реализацию, но как-то сложновато.
Behavior используется во многих различных сценариях.
В том числе может использоваться и в анимации.
Некая палочка выручалочка на все случаи жизни.

Для 99% случаев реальных задач было бы достаточно наследования от Freezable.
1
83 / 27 / 2
Регистрация: 02.09.2019
Сообщений: 276
31.05.2022, 20:47
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И тогда можно будет в XAML привязать визуальное состояние кнопки к этому свойству, а не обрабатывать его в логике свойства.
Как вариант можно привязать визуальное состояние так
XML
1
2
3
4
5
6
7
8
<Style TargetType="StackPanel">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=MyWebView, Path=IsFull}"
                        Value="True">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
Добавлено через 21 минуту
Элд Хасп,
Раз вы стимулируете меня к изучению WPF, в первую очередь, развёрнутыми, доброжелательными ответами, следующий вопрос
Прочитал статью WPF: использование Attached Property и Behavior
Среди прочего:
само по себе использование события PropertyChanged для Attached Property уже повод задуматься: а все ли я правильно делаю? Он необходим только в очень редких случаях. Например, так мы может запоминать историю изменения этого свойства, чтобы при необходимости провести более глубокий анализ и взаимодействовать более интеллектуально. Но это из разряда задач “делал один раз в жизни”
В то же врем я в примерах кода, в том числе в блогах разработчиков Microsoft видел, что авторы часто используют PropertyChanged для изменения свойств контроллов, обработки событий, генерации команд Ну и как быть? Отнестись как к частному мнению автора статьи?
Вообще, иногда голова кругом идёт от обилия мнений и противоречивых рекомендаций
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
31.05.2022, 21:03
Цитата Сообщение от Усталый путник Посмотреть сообщение
в том числе в блогах разработчиков Microsoft видел, что авторы часто используют PropertyChanged для изменения свойств контроллов
?? В WPF?
Ни один дефолтный UI элемент не реализует INotifyPropertyChanged.
Вернее, мне такой не попадался.
Может и есть, но как единичный, исключительный случай.

Добавлено через 8 минут
Цитата Сообщение от Усталый путник Посмотреть сообщение
WPF: использование Attached Property и Behavior
На мой взгляд, пытается излишне провести чёткое разделение между ними.
Пример AP-свойства влияющего на поведение элемента: Сохранение пропорций WPF элементом.

С точки зрения реализации Behaviors - это списочное AP-свойство.
См. Освоение Attached Properties: Списочное свойство.
А Behavior - это элемент этой коллекции.

Сравнивать свойство с элементом коллекции, как-то не совсем корректно.
1
83 / 27 / 2
Регистрация: 02.09.2019
Сообщений: 276
31.05.2022, 21:04
Элд Хасп,
само по себе использование события PropertyChanged для Attached Property
Упс. Извините, сам напутал, думал речь идёт о PropertyChangedCallback в регистрации Attached Property
0
83 / 27 / 2
Регистрация: 02.09.2019
Сообщений: 276
01.06.2022, 15:13
Элд Хасп,
У меня небольшая каша в голове образовалась. Попробую с ней что-то сделать. Как можно чётче сформулировать для себя. А вы, если что, поправите
Итак, есть объект привязки, в данном случае AP или DP есть источник, к которому биндится AP В моём примере
XML
1
 local:IsFullAP.IsFull = "{Binding ElementName=MyWebView, Path=IsFull}"
Свойство IsFull AP - свойство объекта приёмника привязки т.е свойство класса, которому оно принадлежит, свойство IsFull элемента MyWebView -свойство объекта источника привязки (мне нужно было по разному назвать эти свойства)
Далее, если меняется свойство объекта источника привязки, соответственно меняется значения нашего AP, мы можем использовать делегат PropertyChangedCallback, для ссылки на соотв. обработчик Уф... коряво сформулировал, надеюсь, вы меня поймёте:-)
И в этом обработчике мы вольны менять свойства элементов UI, обращаться к их методам, подписываться на их события...
А вот использование INotifyPropertyChanged и соответствующего делегата PropertyChangedEventHandler будет выглядеть, мягко говоря, странно
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
01.06.2022, 15:39
Цитата Сообщение от Усталый путник Посмотреть сообщение
А вот использование INotifyPropertyChanged и соответствующего делегата PropertyChangedEventHandler будет выглядеть, мягко говоря, странно
Да.
У DependencyObject уже и так реализовано уведомление об изменении свойств (DP и AP) поэтому реализовывать в нём INPC в большинстве случаев бессмысленно.
ООООчень редко бывает необходимость для части свойств обеспечить возможность асинхронной работы.
Вот для них может использовать INPC, но это будут обычные CLR свойства.
И такие задачи крайне редки.
Большинство разработчиков за всю карьеру ни разу с таким не столкнутся.
1
83 / 27 / 2
Регистрация: 02.09.2019
Сообщений: 276
01.06.2022, 15:48
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У DependencyObject уже и так реализовано уведомление об изменении свойств (DP и AP) поэтому реализовывать в нём INPC в большинстве случаев бессмысленно.
Я так себе это и представлял. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2022, 15:48

Как сделать чтоб окно было развернуто на весь экран?
Какой стиль менять? Я добавил wcex.style= CS_HREDRAW | CS_VREDRAW | WS_MAXIMIZE; В рез-те компилируется, но окно сразу закрывается,...

Как сделать, чтобы невозможно было развернуть окно на весь экран?
как сделать так что бы невозможно было развернуть окно на весь экран либо что бы кнопка свернуть/развернуть окно была не активна?

Как сделать, чтобы при загрузке автоматически окно разворачивалось на весь экран?
Как сделать, чтобы при загрузке автоматически окно разворачивалось на весь экран , а затем в, зависимости от разрешения, переменной...

Как сделать чтобы окно не открывалось на весь экран при его премещении в верхнюю крайнюю часть монитора?
При работе с окнами бывает необходимость их сдвигать вверх или вбок и в Windows 10 окно открывается на весь экран когда оно выходит за...

Нестандартное окно WPF. Разворачивание на весь экран
Доброго времени суток, форумчане. Начала осваивать технологию WPF. И первым делом при попытке создания нестандартного окна столкнулся со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru