Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Структура программы для ОС Windows






В предыдущих разделах рассмотрены отдельные компоненты программы, использующей библиотеку Win32 API. Приведем текст стандартной простейшей программы, использующей библиотеку Win32 API.

Программа отображает на экране главное окно с заголовком, кнопками управления окном и текстом «Привет!» (рис. 20.2):

Рис. 20.2. Главное окно

//Подключение библиотеки Win32 API

#include < windows.h>

//прототип оконной процедуры

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//главная функция

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nCmdShow)

{

static char szAppName[]=" Hello";

HWND hwnd;

MSG msg;

WNDCLASSEX ws; //заполнение структуры оконного

//класса

ws.cbSize = sizeof(ws); //размер структуры

ws.style = CS_HREDRAW | CS_VREDRAW; //стиль окна

//перерисовка окна при изменении горизонтальных

//(CS_HREDRAW)

//и вертикальных(CS_VREDRAW) размеров окна

ws.lpfnWndProc = WndProc; //Указатель на оконную

//процедуру

ws.cbClsExtra = 0; //доп. поле для данных класса

ws.cbWndExtra = 0; //доп. поле для данных окна

ws.hInstance = hInstance; //дескриптор приложения

ws.hIcon = LoadIcon(NULL, IDI_APPLICATION); //дескриптор //иконки

ws.hCursor = LoadCursor(NULL, IDC_ARROW); //дескриптор //курсора

ws.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); //кисть

//(цвет фона)

ws.lpszMenuName = NULL; //имя меню или NULL

ws.lpszClassName = szAppName; //имя класса окна

ws.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

//маленькая иконка

//регистрация оконного класса в системе

RegisterClassEx(& ws);

//создание окна – получение дескриптора окна

hwnd = CreateWindow(szAppName,

" Привет, мир! ",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL);

//отображение окна на экране и перерисовка

//элементов управления

ShowWindow(hwnd, nCmdShow);

UpdateWindow(hwnd);

//Цикл обработки сообщений

while (GetMessage(& msg, NULL, 0, 0))

{

TranslateMessage(& msg);

DispatchMessage(& msg);

}

 

return 0;

}

//оконная процедура

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg,

WPARAM wParam, LPARAM lParam)

{

HDC hdc; //дескриптор контекста устройства

PAINTSTRUCT ps; //структура для хранения

//атрибутов рисования

int x=100;

int y=100;

char str[]=" Привет! ";

switch (iMsg)

{

//перерисовка окна

case WM_PAINT:

hdc = BeginPaint(hwnd, & ps); //начало

//рисования в контексте hdc

SetBkColor(hdc, RGB(0, 0, 255)); //установка

//цвета фона

SetTextColor(hdc, RGB(200, 200, 10));

//установка цвета текста

TextOut(hdc, x, y, (LPCTSTR)str, strlen(str)); //вывод текста на экран

EndPaint(hwnd, & ps); //завершение рисования

//в контексте hdc

return (0);

//завершение работы программы

case WM_DESTROY:

PostQuitMessage(0);

return (0);

}

 

return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

Как видно из текста программы, в оконную процедуру включена обработка двух сообщений – WM_PAINT и WM_DESTROY. Остальные сообщения обрабатываются по умолчанию.

Рассмотрим обработку сообщения WM_PAINT. Так как перерисовка окна связана с обращением к устройству вывода – дисплею, а в Windows приложениям запрещен прямой доступ к устройствам, формирование новой картинки сначала происходит в специальной области памяти, называемой контекстом устройства, а затем Windows сформированную программой в контексте устройства картинку выводит на экран. Для работы с контекстом устройства создается специальная переменная типа HDC – дескриптор контекста устройства hdc. Функция BeginPaint() для окна hwnd создает контекст устройства, возвращая значение дескриптора контекста устройства, и заполняет структуру типа PAINTSTRUCT информацией, требуемой для обновления рабочей области окна. Функции SetBkColor() и SetTextColor() устанавливают цвеа фона и текста для указанного контекста, используя функцию RGB(). Параметры функции RGB() задаются числами в диапазоне от 0 до 255 и представляют собой интенсивность базовых компонентов цвета – красного, зеленого и синего. Функция TextOut() выводит в заданную координатами x и y область контекста устройства строку текста фиксированной длины. Для определения длины выводимой строки используется функция strlen(). Завершает перерисовку функция EndPaint(), которая освобождает дескриптор контекста устройства. Для следующей перерисовки потребуется заново создавать контекст устройства.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.