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

Дата: 23.12.2009
Категории: Visual Studio (C#) WPF

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

Ссылки на готовое приложение и его исходный код вы найдете в конце статьи. Писать будем 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. Разместите его так, чтобы он занимал все место формы. Форма проекта с размещенным Image 3. Добавьте подготовленное изображение елки, кликнув правой кнопкой по названию проекта в Solution Explorer и выбрав Add -> Existing Item… Выберите файл и нажмите ADD. Добавить ресурс в проект 3. Укажите в свойстве Source у Image имя добавленного файла, например, FirTree.png. Это можно сделать либо в окне Properties, либо в XAML коде:

<Image Name="image1" Stretch="Fill" Source="FirTree.png" />

Все, изображение загрузили, но возможно у вас елочка получилась сплюснутой. У меня изображение елки имеет размеры: высота=438; ширина=303. Точно такие же размеры нужно установить форме. Размеры формы

Убираем фон

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

<Window x:Class="FirTree.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="438" Width="303" AllowsTransparency="True"
    Background="Transparent" WindowStyle="None">
    <Grid>
        <Image Name="image1" Stretch="Fill" Source="FirTree.png" />
    </Grid>
</Window>

Перемещение формы мышкой

Итак, елочка появилась, но переместить ее нельзя. Нам понадобится 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 выглядит так:

<Image Name="image1" Stretch="Fill" Source="FirTree.png" MouseDown="image1_MouseDown"
       MouseMove="image1_MouseMove" />

Теперь осталось только запустить программу (F5) и проверить её работу.

Убрать с TaskBar

Как вы могли заметить, программа показывается на панели задач. Чтобы убрать приложение с панели задач просто установите у формы свойство ShowInTaskbar в False.

Убрать из Alt+Tab

С 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».

Что не сделано

Да, приложение конечно же еще очень и очень «сырое» — нет многих необходимых вещей, например, добавление в автозапуск, кнопка «закрыть», сохранение положения елочки при повторном запуске, нет никакой анимации, и вообще нет изюминки.

Скачать исходный код приложения можно здесь. Кстати, я добавил несколько функций в программу, сделал елочку более красочной и интересной. Вы ее можете ее скачать. Также, как только наступит новый год, под елкой появятся подарки — Дедушка Мороз принесет 🙂

Итоги

Ну вот и все, вы сами можете украсить свой рабочий стол, установив собственную елочку, сделав ей анимацию, и все все что захотите. Хочется заметить, что это будет куда приятнее, чем если бы вы скачали из сети такую программку. Также можете сделать программу-подарок и подарить. Можно сделать очень интересно и оригинально. Остается только найти какие-нибудь праздничные обои для рабочего стола и дополнительно украсить его. Сегодня, когда интернет это уже необходимость и есть практически у всех, найти картинку на рабочий стол совершенно не сложно.

Коментарии:

  1. 27.08.2010 в 12:08

    Спасибо большое! Все понятно и не сложно.

  2. 27.08.2010 в 12:22

    Уважаемый автор, можно ли сделать «Окно позади всех окон» в WidowsFormApplication?

  3. 27.08.2010 в 12:25

    И еще вопрос, можно ли как нибудь предотвратить сворачивание окна при нажатии сервисной кнопки Windows «Свернуть все окна»?

  4. 27.08.2010 в 19:20

    Можно, посмотрите тут http://delphidevelop.ru/publ/2-1-0-239
    Там правда на Delphi, но не думаю что возникнут особые проблемы.

  5. 11.11.2010 в 17:15

    >>Создаем обработчик Activated. В нем пишем:

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

  6. MAry:
    16.01.2011 в 18:19

    У меня была йолочка,что сияэт. А ета сияет?

  7. 17.01.2011 в 13:37

    Да, сияет

  8. 04.03.2011 в 01:44

    Уважаемый автор, как сделать сияние? это изображения, у которых меняется Opacity св-во или анимированная gif’ка или что-то еще? просто погда я делаю свечение у какого-нибудь объекта, и применяю DoubleAnimation, но проц сильно грузится..

  9. 04.03.2011 в 09:03

    Это изменение свойства Opacity. Делал через Expression Blend.

  10. 17.11.2011 в 18:24

    Перемещение формы мышкой

    Достаточно написать

    private void image1_MouseDown(object sender, MouseButtonEventArgs e)
    {
    DragMove();//или this.DragMove();
    }
    не определяя image1_MouseMove;

  11. 19.12.2011 в 21:52

    Подскажите пожалуйста как создать эффект мерцания фонариков на ёлке

  12. 19.12.2011 в 21:54

    и возможно поместить чуть выше ёлки .gif изображение в виде часов и как это реализовать, заранее спасибо

  13. 20.12.2011 в 10:17

    Чтобы создать мерцание вам потребуется (так на много удобнее) Expression Blend. Он позволяет в удобной форме создавать пользовательский интерфейс приложения. Может создать анимацию. Я просто с течением времени менял прозрачность «огоньков». Вот и все мерцание. Сразу скажу, что Expression Blend достаточно сложен и придется много разбираться.

  14. 20.12.2011 в 13:08

    Можно по подробней об изменении прозрачности «огоньков»

  15. 20.12.2011 в 14:53

    если не трудно можешь выложить исходники доработаной версии программы

  16. 20.12.2011 в 14:53

    Есть свойство Opacity. Вот его и меняем. В Expression Blend там это очень просто. Меняем свойство, меняем текущее время, меняем на другое. Таким образом, прозрачность будет меняться из одного состояния до другого.

  17. 20.12.2011 в 17:50

    если не затруднит можно всё таки выложить исходники доделаной программы, заранее спасибо

  18. 21.12.2011 в 09:17
  19. 21.12.2011 в 11:42

    Выложите пожалуйста исходники последней версии программы

  20. nik:
    17.04.2012 в 11:24

    Что такое Expression Bland? Вы просто очень настойчиво пишете именно Bland, а не Blend, если, конечно, вы говорите именно об одноименном продукте от Microsoft.

  21. 17.11.2012 в 00:06

    К сожалению, исходники у меня не открываются, а когда пишу сам — окно ни в какую не хочет лезть под значки, хотя все делаю верно(

  22. 19.11.2012 в 20:54

    Под какие значки? Под значки на рабочем столе? Мы так не делали…

  23. 17.12.2012 в 08:48

    Здравствуйте! не могли бы выложить исходники последней версии программы , буду очень признателен.

  24. 19.12.2012 в 20:07

    Евгений, я отправил их вам на почту

  25. 20.12.2012 в 16:38

    а как удалить эту ёлку теперь? подскажите пожалуйстаа

  26. 20.12.2012 в 18:35

    Если вы наведете на нее курсор и внимательно посмотрите, то там есть крестик. Вот он и позволяет закрыть приложение.

  27. 06.01.2013 в 16:34

    сделайте сами и пришлите на E-mail zanfirov_v@mail.ru

  28. 21.12.2013 в 17:13

    А можно пожалуйста ещё раз исходники.

  29. 28.11.2014 в 13:05

    Если не трудно пришлите мне на почту исходник переделанной версии

  30. 30.12.2014 в 03:27

    А под Linux никак? Почему все под винду кругом и винда кругом?

  31. 17.05.2018 в 16:31

    мне понаравилось отличная картинка

  32. 05.02.2019 в 23:48

    Вау!
    Самый наикрутейший урок!
    Всех благ автору! и огромная благодарность!