Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Практический пример на элементы управления.

Данное приложение реализует экранную заставку Windows. Создайте исполняемый файл, затем дайте ему расширение .scr и положите его в каталог Windows\System32. После этого его название отобразится в выпадающем списке заставок Windows (свойства экрана). Программа также предоставляет возможность настройки параметров экранной заставки и ее препросмотр.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
// Для класса ArrayList
using System.Collections;
// Для работы с реестром
using Microsoft.Win32;
using System.Diagnostics;

// Класс, реализующий экранную заставку

namespace CSharpApplication.ScreenSaverExample
{
    class ScreenSaver : Form
    {
        // Позиция курсора на момент запуска программы
        Point StartCursorPosition = Control.MousePosition;
        // Таймер для смены изображений
        Timer tm = new Timer();
        // Изображение
        Image im = null;
        // Список путей к изображениям
        ArrayList PathList;
        // Размеры графической поверхности
        RectangleF ScreenRect;
        // Объект класса, который предоставляет методы
        // для рисования объектов на графическом устройстве
        Graphics gr = null;

        // Мютекс для предотвращения запусков
        // нескольких экземпляров данного приложения
        static System.Threading.Mutex mutex;

        // Путь к каталогу с изображениями
        static string Path;

        // Дескриптор окна препросмотра экранных
        // заставок Windows
        static IntPtr handle = IntPtr.Zero;

        static void Main(string [] args /* параметры командной строки */)
        {           
            // Заходим в ветку реестра HKEY_CURRENT_USER
            RegistryKey rk = Registry.CurrentUser;
            // Создаем или открываем подраздел реестра
            rk = rk.CreateSubKey(@"Software\CSharpApplications\ScreenSaver");
            // Считываем данные из подраздела или null по умолчанию
            Path = (string)rk.GetValue("PathToImages", null);
            // Закрываем ветку
            rk.Close();

            // Если присутствуют аргументы командной строки      
            if(args.Length > 0)
            {
                // Настройка экранной заставки
                if(args[0].StartsWith("/c"))
                {
                    // Создаем и показываем диалог настройки
                    Settings set = new Settings(Path);
                    set.ShowDialog();
                    return;
                }
                // Препросмотр экранной заставки
                if(args[0].StartsWith("/p"))
                {
                    // Создаем мютекс
                    mutex = new System.Threading.Mutex(false, "ScreenSaver.MyMutex");
                    // Проверяем не запущен ли уже экземпляр этого процесса
                    if(mutex.WaitOne(0, false) == false)
                    {
                        // Уже запущен
                        return;
                    }
                    // Записываем дескриптор окна, на котором
                    // Windows осуществляет препросмотр
                    // экранных заставок
                    handle = (IntPtr)Convert.ToInt32(args[1]);
                }
            }

            // Запуск приложения
            Application.Run(new ScreenSaver());

            // Освобождаем мютекс
            if(mutex != null)
                mutex.ReleaseMutex();
        }

        // Конструктор
        ScreenSaver()
        {
            // Цвет фона формы
            this.BackColor = Color.Black;
            // Убираем у формы рамку
            this.FormBorderStyle = FormBorderStyle.None;
            
            // Прячем курсор
            Cursor.Hide();

            // Растягиваем форму на весь экран
            this.ClientSize = Screen.GetBounds(this).Size;
            // Установка расположения формы
            this.Location = new Point(0, 0);
            
            // Режим препросмотра
            if(handle != IntPtr.Zero)
            {
                // Убираем приложение из панели задач
                this.ShowInTaskbar = false;
                // Делаем форму прозрачной
                this.TransparencyKey = Color.Black;
            }
         
            // Обработчик таймера
            tm.Tick += new EventHandler(tm_Tick);
            tm.Interval = 1000;
        }

        // Обработчик нажатия клавиш
        protected override void OnKeyDown(KeyEventArgs e)
        {
            // Закрываем приложение
            Application.Exit();
            base.OnKeyDown (e);
        }

        // Обработчик движения мыши
        protected override void OnMouseMove(MouseEventArgs e)
        {
            // Если с момента запуска приложения мышь дернулась
            if(StartCursorPosition != Control.MousePosition)
            {
                // Закрываем приложение
                Application.Exit();
            }

            base.OnMouseMove (e);
        }

        // Обработчик отрисовки поверхности формы
        protected override void OnPaint(PaintEventArgs e)
        {   
            if(handle == IntPtr.Zero)
            {
                // Графическая поверхность формы
                gr = e.Graphics;            
            }
            else
            {
                try
                {
                    // Получаем графическую поверхность
                    // окна препросмотра экранных заставок Windows
                    gr = Graphics.FromHwnd(handle);
                }
                catch
                {
                    // Не сложилось
                    Application.Exit();
                    return;
                }
            }

            // Определяем размеры видимой поверхности
            ScreenRect = gr.VisibleClipBounds;

            // Режим препросмотра
            if(handle != IntPtr.Zero)
            {
                // Создаем черную кисть
                Brush br = new SolidBrush(Color.Black);
                // Заливаем поверхность 
                // (стираем предыдущее изображение)
                gr.FillRectangle(br, ScreenRect);
            }
            // Если список файлов пуст
            if(PathList != null && PathList.Count == 0)
            {
                // Создаем синюю кисть
                Brush br = new SolidBrush(Color.Blue);
                // Создаем шрифт
                Font font = new Font("Times New Roman", 12);
                // Отрисовываем строку
                gr.DrawString("Каталог\n" + Path + "\nпуст!!!", font, br, 0, 0);
            }
            else if(PathList != null)
            {
                // Вычисляем коэффициент пропорциональности
                // для показа изображения на весь экран
                SizeF sizef = new SizeF(im.Width / im.HorizontalResolution,
                                        im.Height / im.VerticalResolution);
                float Scale = Math.Min(ScreenRect.Width / sizef.Width,
                                       ScreenRect.Height / sizef.Height);
                // Пропорционально изменяем размер изображения
                sizef.Width *= Scale;
                sizef.Height *= Scale;

                // Отрисовываем изображение
                gr.DrawImage(im, 
                   ScreenRect.X + (ScreenRect.Width - sizef.Width) / 2,
                   ScreenRect.Y + (ScreenRect.Height - sizef.Height) / 2,
                   sizef.Width, sizef.Height);
                 
                tm.Interval = 3000;
            }            

            base.OnPaint (e); 

            // Запуск таймера
            tm.Start();
        }

        // Обработчик таймера
        private void tm_Tick(object sender, EventArgs e)
        {          
            // Останавливаем таймер
            tm.Stop();

            // Если режим препросмотра, обновляем данные из реестра
            if(handle != IntPtr.Zero)
            {
                string temppath;
                RegistryKey rk = Registry.CurrentUser;
                rk = rk.CreateSubKey(@"Software\CSharpApplications\ScreenSaver");
                temppath = (string)rk.GetValue("PathToImages", null);
                rk.Close();

                // Если данные изменились
                if(Path != temppath)
                {
                    Path = temppath;
                    PathList = null;
                }
            }
    
            // Запускаем поиск изображений в указанном 
            // пользоателем каталоге
            if(PathList == null)
                SearchPictures();

            // Текущее изображение
            string picture = null;         
            
            // Если каталог существует
            if(PathList != null)
            {
                // Если в каталоге присутствуют изображения
                if(PathList.Count == 0)
                {
                    // Перерисовываемся (на экран выводится строка текста)
                    Invalidate();
                    return;
                }

                // Инициализируем генератор случайных чисел
                Random rand = new Random();
                // Выбираем случайное изображение из списка
                picture = (string)PathList[rand.Next(PathList.Count)];
            }
            else  // Указанный каталог не доступен
            {
                // Подставляем стандартный каталог Windows
                // для хранения изображений
                Path = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
                tm.Interval = 100;
                // Запуск таймера
                tm.Start();
                return;
            }

            try
            {
                // Считываем картинку из файла
                im = Image.FromFile(picture);
            }
            catch
            {
                // Неудача
                im = null;
                tm.Interval = 100;
                // Запуск таймера (повторный вызов функции)
                tm.Start();
                return;
            }

            // Перерисовываемся
            Invalidate();
        }

        // Функция поиска изображений
        void SearchPictures()
        {
            try
            {
                // Ищем в каталоге картинки
                string [] files1 = Directory.GetFiles(Path, "*.jpg"); 
                string [] files2 = Directory.GetFiles(Path, "*.bmp"); 
                
                // Создаем общий список найденных файлов
                // и сгружаем в него найденный пути
                PathList = new ArrayList(files1.Length + files2.Length);
                PathList.AddRange(files1);
                PathList.AddRange(files2);
            }
            catch
            {
                // Проблемы
                PathList = null;
            }
        }
    }

    // Диалог настроек
    class Settings : Form
    {
        Button Browse = new Button();
        TextBox PathToImages = new TextBox();
        Label Prompt = new Label();

        FolderBrowserDialog fbd = new FolderBrowserDialog();

        public Settings(string Path /* Предыдущий путь из реестра */)
        {
            this.ClientSize = new Size(260, 90);
            this.MaximizeBox = false;
            this.MinimizeBox = false;

            Browse.Parent = this;
            Browse.Dock = DockStyle.Top;           
            Browse.Text = "Выбор каталога";

            Browse.Click += new EventHandler(Browse_Click);

            PathToImages.Parent = this;
            PathToImages.Dock = DockStyle.Top;
            PathToImages.ReadOnly = true; 
            PathToImages.Size = new Size(0, 50);
            PathToImages.Multiline = true;
            PathToImages.Text = Path;

            Prompt.Parent = this;
            Prompt.Dock = DockStyle.Top;
            Prompt.AutoSize = true;
            Prompt.Text = "Введите путь к каталогу с изображениями:";

            fbd.SelectedPath = Path;

            this.Text = "Настройки";
            this.ShowInTaskbar = false;
            this.CenterToScreen();
        }

        // Обработчик нажатия кнопки
        private void Browse_Click(object sender, EventArgs e)
        {
            // Если пользователь нажал OK
            if(fbd.ShowDialog() == DialogResult.OK)
            {
                // Записываем в реестр новый путь
                RegistryKey rk = Registry.CurrentUser;
                rk = rk.CreateSubKey(@"Software\CSharpApplications\ScreenSaver");
                // Установка нового значения параметра
                rk.SetValue("PathToImages", fbd.SelectedPath);
                rk.Close();
                // Отображаем выбранный путь в текстовом поле
                PathToImages.Text = fbd.SelectedPath;
            }
        }
    }
}

Домашнее задание

Реализовать игру "Питон". По форме бегает змея, основная задача которой - поглотить заданное количество яблок за определенный интервал времени. Количество появляющихся на поле яблок задается пользователем . Змея не может выйти за пределы игрового поля, не может проходить через расставленные на поле препятствия, и наезжать на собственный хвост.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru