
- •Базовые концепции
- •Графический интерфейс пользователя
- •Многозадачность
- •Управление памятью
- •Независимость от аппаратных средств
- •Объектно-ориентированное программирование
- •Архитектура приложения, управляемая событиями
- •Оконная процедура
- •Оконные классы
- •Цикл обработки сообщений
- •30. О чем уведомляет приложение сообщение wm_paint?
- •Проект firstApplication Файл firstApplication.Cpp
Проект firstApplication Файл firstApplication.Cpp
// firstApplication.cpp : определяет точку входа приложения
// Defines the entry point for the application.
#include "stdafx.h"
#include "firstApplication.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // current instance (дескриртор экземпляра приложения
TCHAR szTitle[MAX_LOADSTRING];// The title bar text (строка заголовка)
TCHAR szWindowClass[MAX_LOADSTRING];// the main window class name
//(строка имени оконного класса)
// Forward declarations of functions included in this code module:
// описания функций, используемых в этом модуле
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
// загружаем имя приложения в строку szTitle
LoadString(hInstance, IDC_FIRSTAPPLICATION, szWindowClass,
MAX_LOADSTRING); // загружаем имя класса в строку szWindowClass
MyRegisterClass(hInstance);
// создается и регистрируется класс главного окна
// Perform application initialization:
// создание окна как структуры на основе его класса
// и отображение окна на экране
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
// загрузка горячих клавиш Alt,Alt + /, Alt + F4
hAccelTable =LoadAccelerators(hInstance,AKEINTRESOURCE(IDC_FIRSTAPPLICATION));
// Main message loop:
// параметры GetMessage адрес структуры сообщ, деск. окна,
// принимающего сообщение, минимальный номер принимемого сообщения
while (GetMessage(&msg, NULL, 0, 0))// возвращает 0 только при извлечении
{ // сообщ. WM_QUIT
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);// функция преобразует пару сообщений
// WM_KEYDOWN,WM_KEYUP в WM_CHAR
DispatchMessage(&msg); // передает сообщение обратно Windows,
//для того чтобы Windows отправила это сообщение
// соответствующей оконной процедуре
//Следует обратить внимание, что сообщение передается
// оконной процедуре именно того
//окна, которому оно было адресовано
// После обработки сообщения в оконной процедуре Windows
// передает управление оператору, следующему
// за функцией DispatchMessage, т.е. в начало цикла while
}
}
return (int) msg.wParam;
}
// FUNCTION: MyRegisterClass()
// PURPOSE: Registers the window class.
// создается и регистрируется класс главного окна
// COMMENTS:
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this
// function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
// инициализируются данные структуры wcex
wcex.cbSize = sizeof(WNDCLASSEX); // размер данного объекта
wcex.style = CS_HREDRAW | CS_VREDRAW; // стиль окна –
// перерисовывается по горизонтали
// и вертикали, если изменяется размер окна
wcex.lpfnWndProc = WndProc; // имя функции окна
wcex.cbClsExtra = 0; // дополнительная информация
wcex.cbWndExtra = 0; // дополнительная информация
wcex.hInstance = hInstance; // дескриптор данного экземпляра
// приложения
wcex.hIcon = LoadIcon(hInstance,
MAKEINTRESOURCE(IDI_FIRSTAPPLICATION));
// большая пиктограмма
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // форма курсора
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // цвет фона окна
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_FIRSTAPPLICATION); // стиль меню
wcex.lpszClassName = szWindowClass; // имя класса окна
wcex.hIconSm = LoadIcon(wcex.hInstance,
MAKEINTRESOURCE(IDI_SMALL));//малая пиктограмма
return RegisterClassEx(&wcex); // регистрация оконного класса в Windows
}
// FUNCTION: InitInstance(HINSTANCE, int)
// PURPOSE: Saves instance handle and creates main window
// создание окна как структуры на основе его класса и прорисовывание
// окна на экране
// COMMENTS:
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
// имя зарегистрированного класса, имя окна, стиль окна
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
// x и y позиции, ширина и высота окна,
NULL, NULL, hInstance, NULL);
//дескр. род. окна, дескр. меню, дескр. экз. приложения,
// указатель на данные предаваемые в сообщении WM_CREATE
if (!hWnd)
{
return FALSE;
}
// nCmdShow определяет в каком виде будет показано окно
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); //посылает оконной процедуре сообщение WM_PAINT,
//заставляющее окно перерисовать свою клиентскую область
return TRUE;
}
//Реальная работа осуществляется в оконной процедуре
// здесь определяется, что будет выводиться в клиентское окно
// и то, как реагировать на пользовательский ввод
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
// Четыре параметра оконной процедуры идентичны первым полям структуры MSG
// 1 -Дескриптор окна, получаюещего сообщение, 2- Идентификатор сообщения
// (целые от 0 до 1024)
// 3 и 4 содержит дополнительную информацию, которая распознается системой в
// зависимости от полученного сообщения
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:// сообщение посылается, если пользователь выбирает
// команду меню или команду из элемента управления
wmId = LOWORD(wParam);
// макрос извлекает младшее слово из 32-разрядного аргумента
wmEvent = HIWORD(wParam);
// макрос извлекает старшее слово из 32-разрядного аргумента
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY: // Обработка этого сообщения не обязательна:
// если оно отсутствуе, то функция DefWindowProc вызовет по умолчанию
// функцию DestroyWindow
// но здесь хорошее место каки-либо предупреждащих сообщений
PostQuitMessage(0);// осуществляет корректное разрушение окна
// и посылает сообщение WM_QUIT
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
// Получает все сообщения, которые не обрабатываются этой оконной процедурой
}
return 0;// возвращает 0, если сообщение обрабатывалось в этой процедуре
}
///////////////////////////////////////////////////
// Message handler for about box.
// // FUNCTION: CALLBACK About()
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}