¨ Замените содержимое стандартного файла заголовков 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. Обычно его посылает оконная процедура, когда пользователь закрывает главное окно.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.