Ёлочка на рабочий стол. Создай сам!

      Скоро новый год и конечно же на своем рабочем столе нужно создать новогоднее настроение. Этим мы сейчас и займемся — создадим новогоднюю ёлку. Я подробно опишу создание приложения «Новогодняя ёлочка».


В итоге будет примерно так

         Ссылки на готовое приложение и его исходный код вы найдете в конце статьи. Писать будем WPF приложение в Visual Studio 2008 на языке C#. Я не буду рассказывать, что такое WPF и зачем это нужно, приведу лишь ссылку на небольшую статью Нвоое в WPF 4.0 в которой рассказывается только малая часть из всего нового в WPF 4.0. Хотя статья и не сильно поможет понять, всю суть WPF, но все же… Если вы не знаете, что такое .NET Framework, то я немного про это расскажу. Это очень мощная и перспективная технология разработанная корпорацией Microsoft, предназначенная для создания обычных программ и веб-приложений. Для работы приложения написанного на .NET в системе обязательно должен быть установлен .NET Framework не ниже, используемой программой версии. .NET Framework сразу установлен в Windows Vista и Windows 7, и в будущих версиях ОС будет обязательно обновляться. В Vista установлен .NET Framework 3.0, в Windows 7 — .NET Framework 3.5 SP1. Вобщем, если у вас установлена Vista или Windows 7, то нет необходимости что-то устанавливать. Как определить какая версия .NET установлена читаем тут. Как уже говорил, я буду стараться как можно более подробно описывать ход работы, в некоторых местах даже очень подробно. Приложение не сложное и написать его самому не составит особого труда, даже человеку не знакомого с Visual Studio. Главное чтобы был хоть какой-то опыт в программировании, чтобы человек представлял себе, как пишутся программы, и знал основы синтаксиса C# или C++.
Создание проекта и загрузка изображения елки
      Итак, загружаем Visual Studio выбираем File -> New -> Project или жмем Ctrl+Shift+N. В поле Name пишем имя проекта, например FirTree. Ставим галочку Create Directory for solution, если она еще не стоит, указываем путь в поле Location если это необходимо, и жмем «ОК».
      Создался пустой проект. Теперь, необходимо на форму загрузить изображение нашей новогодней елочки. Для этого:
1. Подготовьте или найдите в сети изображение елочки в PNG с прозрачным фоном. Этот формат поддерживает альфа-каналы и тем самым у елочки не будет фона.
2. Добавьте компонент Image на форму приложения. Окно Toolbox. Разместите его так, чтобы он занимал все место формы.

3. Добавьте подготовленное изображение елки, кликнув правой кнопкой по названию проекта в Solution Explorer и выбрав Add -> Existing Item… Выберите файл и нажмите ADD.
4. Укажите в свойстве Source у Image имя добавленного файла, например, FirTree.png. Это можно сделать либо в окне Properties, либо в XAML коде:

      Все, изображение загрузили, но возможно у вас елочка получилась сплюснутой. У меня изображение елки имеет размеры: высота=438; ширина=303. Точно такие же размеры нужно установить форме.
Убираем фон
      Если сейчас запустить программу, то будет белый фон и елочка будет в обычном окне Windows. Для того, чтобы убрать рамку окна и его фон делаем следующее:
1. Свойство WindowsStyle устанавливаем в None, тем самым убираем рамку;
2. AllowsTransparency = True;
3. Background = Transparent. В итоге XAML код окна будет примерно следующим:


    
        
    

Перемещение формы мышкой
      Итак, елочка появилась, но переместить ее нельзя. Нам понадобится 2 обработчика компонента Image: MouseDown и MouseMove. 1. В первом будет проверяться, нажата ли левая кнопка мыши, и если нажата, то получаем координаты курсора относительно левого верхнего края формы. Затем высчитываем новые координаты формы, прибавляя к текущему положению формы разницу между полученными координатами и координатой, сохраненной в момент нажатия на форму (в обработчике MouseDown). 2. В обработчике MouseDown будем просто сохранять координаты мыши относительно левого верхнего края формы. Выглядит все немного сложно, но если разобраться, то это просто. Создайте обработчик MouseDown, как показано на рисунке ниже (щелкните по нему, чтобы увеличить). Также можно создать и через окно Properties в разделе Events.

Затем нужно объявить глобальную переменную:

Point old;

В созданном обработчике пишем:

old = e.GetPosition(null);

      Таким образом, в момент клика мы «запомним» координаты мыши (не путайте с координатами мыши относительно левого верхнего угла экрана). Затем, аналогичным образом создаем обработчик MouseMove. В нем пишем:

if (e.LeftButton == MouseButtonState.Pressed)
{
    Point cur = e.GetPosition(null);

    this.Left += cur.X - old.X;
    this.Top += cur.Y - old.Y;
}
В условии производится сравнение, нажата ли левая кнопка мыши. В итоге получится такой код:
Point old;

private void image1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Point cur = e.GetPosition(null);

        this.Left += cur.X - old.X;
        this.Top += cur.Y - old.Y;
    }
}

private void image1_MouseDown(object sender, MouseButtonEventArgs e)
{
    old = e.GetPosition(null);
}
XAML код Image выглядит так:
Теперь осталось только запустить программу (F5) и проверить её работу.
Убрать с TaskBar
      Как вы могли заметить, программа показывается на панели задач. Чтобы убрать приложение с панели задач просто установите у формы свойство ShowInTaskbar в False.

      С Alt+Tab немного посложнее. Я писал уже об этом в предыдущих постах. Нам понадобятся две WinAPI функции: SetWindowLong и GetWindowLong. Но к сожалению C# почему-то сразу их не «знает», их необходимо перед использованием импортировать из соответствующих библиотек. Делается это так:


[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr window, int index, int value);

[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr window, int index);
Ну и добавить пространство имен:
using System.Runtime.InteropServices;
Далее напишем функцию и необходимые константы. Функция будет убирать форму из Alt+Tab.

private const int GWL_EXSTYLE = -20;
private const int WS_EX_TOOLWINDOW = 0x00000080;

public static void HideFromAltTab(IntPtr Handle)
{
    SetWindowLong(Handle,
                  GWL_EXSTYLE,
                  GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_TOOLWINDOW);
}
      Но в качестве единственного входного параметра в эту функцию необходимо подать дескриптор, который не так просто (по сравнению с WinForms приложением) получить у формы приложения на WPF. Для этого напишем свойство, предоставляющее дескриптор формы:

private IntPtr Handle
{
    get
    {
        return new WindowInteropHelper(this).Handle;
    }
}

       Теперь все готово, осталось вызвать написанную функцию. Создадим обработчик формы Loaded, как делали это раньше (создается атрибут не у объекта Image, как делали раньше, а у Window).


HideFromAltTab(Handle);

В качестве параметра в функцию передаем то самое, написанное выше свойство. Запускаем программу, смотрим и пробуем.

Окно позади всех окон
      Еще хочется сделать так, чтобы елочка всегда была позади всех окон и не мешала при работе. Для этого потребуется WinAPI функция SetWindowPos() и несколько констант.

[DllImport("user32.dll")]
public static extern bool SetWindowPos(int hWnd, int hWndInsertAfter, int X, int Y,
    int cx, int cy, uint uFlags);

public const int HWND_BOTTOM = 0x1;
public const uint SWP_NOSIZE = 0x1;
public const uint SWP_NOMOVE = 0x2;
public const uint SWP_SHOWWINDOW = 0x40;
Теперь пишем функцию, устанавливающую форму позади всех окон:

private void ShoveToBackground()
{
    SetWindowPos((int)this.Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE |
        SWP_NOSIZE | SWP_SHOWWINDOW);
}

      Теперь ее нужно вызвать. Вызов будет происходить каждый раз при активации формы, тем самым при активации она сразу же окажется позади всех окон. Создаем обработчик Activated. В нем пишем:


ShoveToBackground();
Запускаем и не теряем форму — она окажется позади Visual Studio.
Автозагрузка
      Я не буду подробно описывать, как это делается, приведу лишь ссылку на статью, где это очень подробно описано — Добавить в автозагрузку. За исключением того, что путь к исполняемому файлу приложения получается так:

string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
Остальное можете сделать сами.
Иконка приложения
      Конечно же у приложения должна быть красивая иконка. Иконку вы можете подготовить самостоятельно, а вот как ее установить я расскажу. Необходимо кликнуть правой кнопкой по названию проекта в Solution Explorer, и выбрать Properties, как показано на рисунке ниже.

Откроется окно настроек приложения. В разделе Resources укажите в поле Icon иконку приложения.
Теперь осталось только перекомпилировать приложение, выбрав в главном меню Build -> Rebuild Solution.
Где найти исполняемый файл приложения?
      Возможно кто-то не знает где найти EXE программы, например начинающий программист, хотя в этом нет ничего сложного. Хранится он в «Папка_проекта\bin\Debug».
Что не сделано
       Да, приложение конечно же еще очень и очень «сырое» — нет многих необходимых вещей, например, добавление в автозапуск, кнопка «закрыть», сохранение положения елочки при повторном запуске, нет никакой анимации, и вообще нет изюминки.
Скачать
        Скачать исходный код приложения можно здесь. Кстати, я добавил несколько функций в программу, сделал елочку более красочной и интересной. Вы ее можете скачать здесь. Также, как только наступит новый год, под елкой появятся подарки — Дедушка Мороз принесет.
Итоги
      Ну вот и все, вы сами можете украсить свой рабочий стол, установив собственную елочку, сделав ей анимацию, и все все что захотите. Хочется заметить, что это будет куда приятнее, чем если бы вы скачали из сети такую программку. Также можете сделать программу-подарок и подарить. Можно сделать очень интересно и оригинально. Остается только найти какие-нибудь праздничные обои для рабочего стола и дополнительно украсить его. Сегодня, когда интернет это уже необходимость и есть практически у всех, найти картинку на рабочий стол совершенно не сложно.
Источник www.techweek.ru

Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!