Управление растровым изображением. Альтернативные способы перерисовки динамического прямоугольника. Работа с растровыми изображениями, страница 2

¨  Замените содержимое стандартного файла заголовков stdafx.h. Дополняйте его директивами по мере надобности? берегите его и переносите из проекта в проект.

#pragma once

#pragma comment (lib, "msimg32.lib")

#include <locale.h>

#include <math.h>

#include <time.h>

#include <string.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

#include <limits>

#include <vector>

#include <deque>

#include <iterator>

#include <list>

#include <string>

#include <algorithm>

#include <iostream>

#include <functional>

using namespace std; // Обеспечивает доступ к именам std без префикса std::

¨  Переименуйте файл API.cpp в Step01.cpp, удалите все его содержимое и введите коды стартовой заготовки.

#include "stdafx.h"  // Файл заголовков, содержимое которого вы должны тщательно собирать и оберегать

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

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)  // Переход по коду сообщения

{

case WM_DESTROY: PostQuitMessage(0); break;   // Сообщаем системе, что поток (thread) требует закрытия

default: return DefWindowProc(hWnd, message, wParam, lParam); // Процедура по умолчанию (удаляет сообщение из очереди)

}

return 0;

}

//======== Главная функция. С нее начинается выполнение Windows приложения

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)

{

WNDCLASSEX wcex;  // Структура атрибутов класса обслуживания

ZeroMemory(&wcex, sizeof(WNDCLASSEX)); // Обнуляем все поля структуры (важный момент, так как иначе там будет мусор)

wcex.cbSize = sizeof(WNDCLASSEX);      // Заполняем лишь некоторые поля структуры

wcex.style = CS_HREDRAW | CS_VREDRAW;     // Стиль окна (resizable)

wcex.lpfnWndProc = WndProc;                                // Имя (адрес) функции, которая будет обрабатывать сообщения о событиях

wcex.hInstance = hInst;                                           // Адрес экземпляра приложения в памяти

wcex.lpszClassName = "MyClass"; // Текст, хеш-код которого используется системой для запоминания атрибутов окна приложения

if (!RegisterClassEx(&wcex)) // Попытка зарегистировать заказ (настройки, записанные в wcex)

return FALSE;

HWND hWnd = CreateWindow(wcex.lpszClassName, "My First Window", WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0);

if (!hWnd)

return FALSE;

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

MSG msg;   // Цикл прокачки сообщений (работа с очередью сообщений). Сердце Windows-приложения.

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

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return (int) msg.wParam;

}

¨  Запустите стартовую заготовку (Ctrl+F5) и убедитесь, что она создает окно довольно странного вида. Возьмите наше дефективное окно за заголовок и "встряхните" его, резко перемещая вверх-вниз и влево-вправо. Наблюдайте за трансформацией клиентской области окна. Попробуем разобраться в том, что происходит.Структура Windows-приложения

Рассмотренная выше модель выработки и прохождения сообщений поможет вам понять структуру, принятую для всех Windows-приложений. Последние два блока в приведенной на рисунке схеме определяют особенности строения любого Windows-приложения. Поэтому даже простейшее из них должно состоять из двух функций:

¨  WinMain, с которой начинается выполнение программы и которая «закручивает» цикл ожидания сообщений,

¨  Оконной процедуры, которую вызывает система, направляя ей соответствующие сообщения.

Коротко алгоритм работы WinMain может быть сформулирован так. После выполнения инициализирующих действий (оформления заказа на класс обслуживания) функция WinMain создает окно и входит в цикл обработки сообщений. После выхода из этого цикла работа приложения завершается. Выход происходит, когда придет сообщение WM_QUIT. Обычно его посылает оконная процедура, когда пользователь закрывает главное окно.