Создание простого окна в VS 2008 с использованием WinAPI

Функции

1. Введение

Функции ­- это строительные элементы языка С и то место, в котором выполняется вся работа программы. Функции позволяют структурировать программу на языке C и обеспечить повторное использованиеисходного кода программы.

В данной работе мы попробуем написать графическое приложение на C -будем рисовать часы (cо стрелками), показывающие системное время. Для реализации этой задачи нам не хватит стандартной библиотеки языка C (так как там нет графической подсистемы). Поэтому будем использоватьWindowsAPIи библиотека GDI+.

API (applicationprogramminginterface) программный интерфейс приложения – это набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) или операционной системой для использования во внешних программных продуктах. Используется программистами при написании всевозможных приложений.

Разные системы имеют API. APIоперационных систем позволяют приложениям использовать возможности операционных систем (создавать окна, создавать и читать файлы, прослушивать сокеты, выполняться в несколько потоков и т.д.). В данной работе WindowsAPI(далее по тексту ­– WinAPI)будет играть вспомогательную роль – с помощью него мы создадим окно, внутри которого будем рисовать анимацию.

Библиотека GDI+ – это часть операционной системы Windows, которая позволяет создавать графические объекты и передавать их на устройства отображения, такие, как мониторы и принтеры. GDI+ отвечает за отрисовку графических примитивов, отображение шрифтов и обработку палитр. Она не отвечает за отрисовку окон, меню и т. п., эта задача закреплена за WinAPI.GDI+ позволяет нам использовать такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой, градиентная заливка, возможность работы с такими графическими форматами, как JPEG и PNG, возможность использовать координаты с плавающей точкой (а не 16-битные целые), преобразование графических объектов с помощью двумерных матриц и т. п. GDI+ использует ARGB-цвета (т.е. 4 цветовых канала: прозрачность, красный, зеленый и синий).

GDI+ также имеет свой API. Отметим, чтоон написан не на C, а на С++ - в нем используются классы. Однако, это не должно нас останавливать.Мы будем использовать отдельные его классы и функции в по ходу решения задачи. С подробным описанием GDI+ можно ознакомитьсяна официальной странице
Microsoft: https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms533799(v=vs.85).aspx


Создание простого окна в VS 2008 с использованием WinAPI

Создайтеновыйпроекттипа «Win32 Project» сименемlab_05 (FileàNewàProject… àWin32 Project)

Рисунок 1

 

Рисунок 2

Вокне «Win32 ApplicationWizard…» нажмитекнопку «Next», оставить настройки проекта такими, как на рисунке 3, затем нажать кнопку «Finish».

Рисунок 3

Среда MSVisualStudio 2008 сгенерировала для вас готовый проект, содержащий несколько файлов исходного текста и ресурсных файлов. Нас интересует файл lab_05.cpp – в нем мы будем писать свой код. Остальные вспомогательныефайлы нас не интересуют. Файл lab_05.cpp содержит довольно сложный текст вызова функций WinAPI, необходимый для создания оконного интерфейса программы.

Рисунок 4

Собрав и запустив данный проект (кнопка ), вы получите (почти) пустое окно нового приложения.

Рисунок 5

Можете полюбоваться на него немного, закрыть и перейти к следующему действию.

3. Подключение GDI+ и отрисовка циферблата часов

В этом окне мы запланировали нарисовать анимированные часы с использованием библиотеки GDI+. Для этого сначала необходимо её подключить и инициализировать.

Сначала подключим саму библиотеку GDI+ в наш проект. Перейдите в настройки проекта, вызвав пункт «Properties»в контекстном меню проекта (рисунок 6).

Рисунок6

Добавьтебиблиотеку «gdiplus.lib» всписокдополнительныхподключаемыхбиблиотек (ConfigurationPropertiesàLinkeràInputàAdditionalDependencies), какпоказанонарисунке 6. Обратите внимание, что мы не прописываем полный путь к библиотеке, а только её имя, благодаря тому, что она находится в стандартных каталогах поиска библиотек Windows.

Рисунок 7

Нажимаем кнопку «Применить», затем «OK». «Физически» библиотека подключена. Чтобы использовать её функции в начале файла lab_05.cppдобавьте строки:

#include<gdiplus.h>

 

usingnamespace Gdiplus;

и в файле stdafx.hзакоментрируйте строку:

#define WIN32_LEAN_AND_MEAN

Примечание: наличие этой строки означает, что будут отброшены большинство редко используемых функций, макросов и типов Windows (за счет этого возрастает скорость компиляции). Нам это будет мешать.

Рассмотрим функцию _tWinMain(). Это аналог функции main()в нашей графической программе на WinAPI. В начало этой функции вставьте обязательный код инициализации GDI+:

GdiplusStartupInputgdiplusStartupInput;

ULONG_PTR      gdiplusToken;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Авконце (разумеется, перед return):

GdiplusShutdown(gdiplusToken);

Без инициализации функции GDI+ работать не будут.

Функция WndProc() (так называемая «оконная функция») вызывается WinAPI при получении окном сообщения от операционной системы. Нас интересует сообщение WM_PAINT, которое посылается при необходимости перерисовки окна.

Выше функции WndProc()определите функцию:

void myDraw(const HDC & hdc)

{

int x = 10; // Положение циферблата по горизонтали

int y = 10; // Положение циферблата по вертикали

 

constint radius = 250; // Радиус циферблата

const Color clock_border_color(255,0,0,255); // Цвет границы циферблата

const Color clock_background_color(255,255,200,255); // Цветфонациферблата

 

Graphics graphics(hdc);

graphics.SetSmoothingMode(SmoothingModeAntiAlias);

 

Pen pen(clock_border_color, 2);

SolidBrush brush(clock_background_color);

     

graphics.FillEllipse(&brush, x, y, 2*radius, 2*radius);

graphics.DrawEllipse(&pen, x, y, 2*radius, 2*radius);

}

ВызовитефункциюmyDraw()вобработчикесообщенияON_PAINTвфункцииWndProc() (наместестроки// TODO: Add any drawing code here...):

Рисунок 8

Пересоберите и запустите проект на выполнение. Вы должны увидеть результат, изображенный на рисунке 9.

Рисунок 9

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: