Структура простейшей Windows программы

Этот файл содержит большое количество определений типов данных, макросов, прототипов и так далее. Для создания переносимых приложений в любую среду, поддерживающую Windows, необходимо пользоваться не стандартными типами данных предоставляемых языком программирования, а данными, определенными в файле windows.h

В следующей таблице представлено подавляющее большинство типов данных описанных в файле windows.h.

(Дескриптор — программно или аппаратно-поддерживаемая структура данных, описывающая другую

Тип Значение
ATOM atom (ссылка на символьную строку в таблице атома).
BOOL Булева переменная (может принимать значения TRUE или FALSE).
BYTE Байт (8 битов).
CCHAR символ Windows.
CHAR Символ Windows.
COLORREF Красный, зеленый, синий. Значения (RGB) цвета (32 бита).
CONST Константа.
DLGPROC Указатель, на определенную в приложении, процедуру вызова диалога.
DWORD Двойное слово (32 бита).
DWORDLONG Двойной (64 бита).
FARPROC Указатель на функцию.
FLOAT Переменная с плавающей запятой.
GLOBALHANDLE Ссылка на глобальный блок памяти.
HACCEL Дескриптор таблицы акселераторов.
HANDLE Дескриптор объекта.
HBITMAP Дескриптор растра.
HBRUSH Дескриптор кисти.
HCURSOR Дескриптор курсора.
HDC Дескриптор контекста устройства (DC).
HDWP Дескриптор структуры определяющей положение окна.
HENHMETAFILE Дескриптор расширенного метафайла.
HFILE Дескриптор файла.
HFONT Дескриптор шрифта.
HGDIOBJ Дескриптор GDI объекта.
HGLOBAL Дескриптор глобального блока памяти.
HICON Дескриптор иконки.
HINSTANCE Дескриптор образца. ‘
HKEY Дескриптор клавиши.
HLOCAL Дескриптор локального блока памяти.

Основы программирования: структура программ

HMENU Дескриптор меню.
Н МЕТА FILE Дескриптор метафайла.
HMODULE Дескриптор модуля.
HPALETTE Дескриптор палитры.
HPEN Дескриптор пера.
HRSRC Дескриптор ресурса.
HWND Дескриптор окна
INT Целое число со знаком.
LOCALHANDLE Дескриптор локального блока памяти.
LONG 32-разрядное знаковое целое.
LONGLONG Переменная с плавающей точкой двойной длинны (64 бита).
LPARAM 32-разрядный параметр сообщения.
LPBOOL Указатель на Булеву переменную.
LPBYTE Указатель на байт.
LPCCH Указатель на постоянный символ Windows.
LPCH Указатель на символ Windows.
LPCOLORREF Указатель на значение COLORREF.
LPCSTR Указатель на постоянную строку символов Windows с нулевым символом в конце.
LPCTSTR Указатель на постоянную строку Unicode с нулевым символом в конце или строку символов
Windows
LPDWORD Указатель на двойное слово без знака (32 бита).
LPHANDLE Дескриптор.
LPINT Указатель на целое число со знаком.
LPLONG Указатель на знаковое целое размером (32 бита).
LPSTR Указатель на строку символа Windows с нулевым символом в конце.
LPTCH Указатель на символ Unicode или символ Windows.
LRESULT Результат обработки сообщения, со знаком.
LPV0ID Указатель на любой тип.
LPWORD Указатель на слово без знака (16 битов).
LPWSTR Указатель на символьную строку Unicode с нулевым символом в конце.
PBOOL Указатель на Булеву переменную. ‘ , —
PBYTE Указатель на байт.
PCCH Указатель на постоянный символ Windows.
PCHAR Указатель на символ Windows.
PCSTR Указатель на постоянную строку символов Windows с нулевым символом в конце.
PDWORD Указатель на двойное слово без знака (32 бита).
PFLOAT Указатель на переменную с плавающей запятой.
PFNCALLBACK Указатель на функцию.
PHANDLE Указатель на идентификатор
PINT Указатель на целое число со знаком.
PLONG Указатель на знаковое целое длинной (32 бита).
PROC Указатель на функцию.
PSHORT Указатель на знаковое целое длинной (16 битов).
PSTR Указатель на строку символов Windows с нулевым символом в конце.
PTBYTE Указатель на символ Windows или Unicode.
PTCH Указатель на символ Windows или Unicode.
PTCHAR Указатель на символ Windows или Unicode.
PTSTR Указатель на символьную строку Windows или Unicode с нулевым символом в конце.
PUCHAR Указатель на символ Windows без знака.
PDINT Указатель на целое число без знака.
PULONG Указатель на беззнаковое целое длинной (32 бита).
PUSHORT Указатель на беззнаковое целое длинной (16 битов).
PVOID Указатель на любой тип.
PWORD Указатель на слово без знака (16 битов).
PWSTR Указатель на символьную строку Unicode с нулевым символом в конце.
SHORT Короткое целое число.
SPHANDLE Идентификатор.
TCHAR Символ Unicode или Windows.
TIMERPROC Указатель на определенную приложением функцию вызова таймера.
UCHAR Символ Windows без знака.
UCHAR UINT ULONG USHORT VOID WCHAR WNDENUMPROC WNDPROC WORD WPARAM Символ Windows без знака. Целое число без знака. Длинное целое число без знака (32 бита). Целое число без знака (16 битов). Любой тин, Символ Unicode. Указатель на определенную в приложении функцию, которая перечисляет окна. Указатель на определенную к приложении процедуру окна. Слово без знака (16 битов). 32-разрядый параметр сообщения.

Имена типов как правило начинаются с префикса

Архитектура ПО. Введение

• LP (Long Pointer) — дальний указатель

• NP (Near Pointer) — ближний указатель

• Р (Pointer) -указатель без определения типа

• Для константных типов (определенных с ключевым словом CONST) после префикса добавляется буква «С», напримерLPCSTR.

Читайте также:
Как сменить иконку программы в Windows 10

3.2 Имена переменных

Огромное количество типов данных обычно присутствующих в приложениях Windows, будет приводить к вполне серьезным трудностям для программистов. Чтобы свести их к минимуму следует пользоваться венгерской формой записи переменных, которая предполагает наличие перед каждой переменной определенного префикса. Фирма Microsoft рекомендует к использованию следующие префиксы:

Префикс Тип данных Префикс Тип Аицчых
Atm ATOM hwnd HWND
F BOOL n INT
b BYTE l LONG
digprc DLGPROC lParam LPARAM
dw DWORD lpb LPBYTE
hacci HACCEL lpsz LPCSTR
hbm HBITMAP lpn LP1NT
hbr HBRUSH lpl LPLONG
hcur HCURSOR lpzs LPSTR
hdc HDC lpv LPVOID
hdrv HDRVR tpw LPWORD
hdwp HDWP ;Rczult LREZULT
hf HFILE npsz NPSTR
hfont HFONT npb PBYTE
hgdiobj HCDiOBJ tmprc TIMERPROC
hgib HGLOBAL u UINT
hicon HICON wndcnmprc WNDENUMPROC
hinst H1NSTANCE wndprc WNDPROC
bloc HLOCAL u или w WORD
hmcnu HMENU wParam WPARAM
hmf H METAFILE hpcn HPEN
hmod HMODULE hrgn HRGN
Hkprc HOOKPROC hrstr HRSTR
Hpal HPALETTE htask HTASK

Структура простейшего оконного приложения Windows

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

Основой оконного графического пользовательского интерфейса Windows является механизм сообщений. Сообщения могут передаваться оконной процедуре немедленно, а могут помещаться в очередь сообщений.

// — Обязательный включаемый файл

// — Описание функции главного окна

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

HINSTANCE hInst; // Дескриптор экземпляра приложения

char ClassName[]=»Window»; // Название класса окна

int WINAPI WinMain( HINSTANCE hInstance,

// Дескриптор экземпляра приложения

HINSTANCE hPrevInstance, // В Win32 всегда равен NULL

// Указатель на командную строку. Он // позволяет

// приложению получать данные из командной строки.

// Определяет, как приложение первоначально

// отображается на дисплее: пиктограммой

// или в виде открытого окна (nCmdShow = SW_SHOWNORMAL).

WNDCLASS wc; // Структура для информации о классе окна

HWND hWnd; // Дескриптор главного окна приложения

MSG msg; // Структура для хранения сообщения

// Сохраняем дескриптор экземпляра приложения в глобальной

// переменной, чтобы при необходимости воспользоваться им в

// — Проверяем, было ли приложение запущено ранее.

// Воспользуемся функцией FindWindow, которая позволяет

// найти окно верхнего

// уровня по имени класса или по заголовку окна:

// HWND FindWindow(LPCTSTR lpClassName,

// Через параметр lpClassName передается указатель на

// текстовую строку, в которую необходимо записать имя

// класса искомого окна. На базе одного и того же класса

// можно создать несколько окон. Если необходимо найти

// окно с заданным заголовком, то имя заголовка следует

// передать через параметр lpWindowName. Если же подойдет

// любое окно, то параметр lpWindowName может иметь

// Пользователь может не помнить, какие приложения уже

// запущены, а какие нет. Когда он запускает приложение,

// то ожидает, что на экране появится его главное окно.

// Поэтому, если приложение было запущено ранее,

// целесообразно активизировать и выдвинуть на передний

// план его главное окно. Это именно то, к чему приготовился

if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);

// Найдена работающая копия — работа новой копии

// — Работающая копия не найдена — функция WinMain

// приступает к инициализации. Заполнение структуры

// WNDCLASS для регистрации класса окна.

wc.lpszClassName=ClassName; // Имя класса окон

// Адрес оконной функции

wc.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса

wc.hInstance=hInstance; // Экземпляр приложения

// Пиктограмма для окон

// Курсор мыши для окон

wc.lpszMenuName=NULL; // Ресурс меню окон

wc.cbClsExtra=0; // Дополнительная память

wc.cbWndExtra=0; // Дополнительная память

// Pегистрация класса окна.

// Создаем главное окно приложения.

ClassName, // Имя класса окон

WS_OVERLAPPEDWINDOW, // Стиль окна

CW_USEDEFAULT, // Ширина окна

CW_USEDEFAULT, // Высота окна

NULL, // Дескриптор окна-родителя

NULL, // Дескриптор меню окна

hInst, // Дескриптор экземпляра приложения

NULL); // Дополнительная информация

// Окно не создано, выдаем предупреждение.

// Обновляем содержимое клиентской области окна.

// Запускаем цикл обработки очереди сообщений.

// Функция GetMessage получает сообщение из очереди,

// выдает false при выборке из очереди сообщения WM_QUIT

while(GetMessage(First Windows aplication»;

// Необходимо обновить содержимое клиентской области окна.

// Получить контекст окна

// Освободить контекст окна

// Нажата левая клавиша мыши в клиентской области окна.

MessageBox(hWnd, «32-bit aplication», «Window»,

// Пользователь удалил окно.

// Если данная функция является оконной функцией

// главного окна, то следует в очередь сообщений

// приложения послать сообщение WM_QUIT

// Необработанные сообщения передаем в стандартную

// функцию обработки сообщений по умолчанию.

default: return DefWindowProc(hWnd, msg, wParam, lParam);

Точкой входа программы для Windows является функция WinMain, которая всегда определяется следующим образом:

Читайте также:
Лучшие программы антивирусы для Windows 10

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

Эта функция использует последовательность вызовов WINAPI (паскалевское соглашение о передаче аргументов при вызове функций) и по завершению, возвращает операционной системе Windows целое число.

Параметры функции WinMain:

  • ПараметрhInstance называется дескриптором экземпляра приложения. Дескриптор экземпляра приложения — это уникальное число, идентифицирующее программу, когда она работает под Windows. Каждая копия одной и той же запущенной несколько раз программы называется “экземпляром” и у каждой свое значение hInstance.
  • Параметр hPrevInstance в настоящее время устарел и в Win32 всегда равен NULL.
  • Параметр lpCmdLine является указателем на оканчивающуюся нулем строку, в которой содержатся параметры, переданные программе из командной строки.
  • Параметр nCmdShow определяет, как приложение первоначально отображается на дисплее: пиктограммой (nCmdShow = SW_SHOWMINNOACTIVE) или в виде открытого окна (nCmdShow = SW_SHOWNORMAL).

В области стека функции созданы переменные с именами hwnd, msg и wc.

Дата добавления: 2017-01-26 ; просмотров: 1792 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Источник: poznayka.org

1. Структура приложения Windows Простейшая программа с главным окном

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

Вывод программы 1-1, запущенной с рабочего стола Windows /*Пример 1-1. Простейшая программа с главным окном*/ /*Операторы препроцессора*/ #include //Два файла с определениями, макросами #include //и прототипами функций Windows /*Прототип используемойв программе функциипользователя*/ LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); /*Главная функция WinMain*/ int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int) char szClassName[]=»MainWindow»;//Имя класса главного окна char szTitle[]=»Программа 1-1″;//Заголовок окна MSG msg;//Структура msg для получения сообщений Windows WNDCLASS wc;//Структура wc для задания характеристик окна /*Зарегистрируем класс главного окна*/ ZeroMemory(//Обнуление всех членов wc wc.lpfnWndProc=WndProc;//Определяем оконную процедуру wc.hInstance=hInst;//Дескриптор приложения wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);//Пиктограмма wc.hCursor=LoadCursor(NULL,IDC_ARROW);//Курсор мыши wc.hbrBackground=GetStockBrush(WHITE_BRUSH);//Белый фон wc.lpszClassName=szClassName;//Имя класса окна RegisterClass(//Собственно регистрация класса окна /*Создадим главное окно и сделаем его видимым*/ HWND hwnd=CreateWindow(szClassName,//Класс окна szTitle, WS_OVERLAPPEDWINDOW,//Заголовок, стиль окна 10,10,300,100, //Координаты, размеры HWND_DESKTOP,NULL,//Родитель, меню hInst,NULL);//Дескриптор приложения, параметры ShowWindow(hwnd,SW_SHOWNORMAL);//Покажем окно /*Организуем цикл обработки сообщений*/ while(GetMessage(msg);//вызвать WndProc return 0;//После выхода из цикла вернуться в Windows >//Конец функции WinMain /*Оконная функция WndProcглавного окна*/ LRESULT CALLBACK WndProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam) switch(msg)Переход по значению msg – номеру сообщения case WM_DESTROY://При закрытии приложения пользователем PostQuitMessage(0);//Завершим приложение return 0;//Возврат в Windows default://Остальные сообщения обработать по умолчанию return(DefWindowProc(hwnd,msg,wParam,lParam)); >//Конец оператора switch >//Конец функции WndProc

Структура программы

  • группы операторов препроцессора;
  • раздела прототипов используемых в программе прикладных функций;
  • главной функции WinMain();
  • оконной функции главного окна.
  • вложенные директивы #include, с помощью которых в программу включаются дополнительные системные заголовочные файлы (winuser.h, wingdi.h, winnt.h и др.);
  • определения констант, используемых функциями Windows;
  • определения новых типов данных Windows;
  • прототипы функций Windows;
  • макросы разного рода.

Источник: studfile.net

Лекция 2. Структура приложения Windows

Приложение (программа 2.1), которое выводит на экран диалоговое окно, показанное на рис. 2.1, вполне можно считать аналогом классической программы «Hello, World!».

Рис. 2.1. Простейшее Windows-приложение «Hello, World!»

int WINAPI WinMain(HINSTANCE d1, HINSTANCE d2, LPSTR d3, int d4)

MessageBox(NULL, «Hello, World!», «», MB_OK);

Программа 2.1. Простейшее Windows-приложения «Hello, World!».

C точки зрения программирования у этого «приложения» довольно сложное поведение. Традиционная консольная версия «Hello, World!» выводит сообщение на экран и заканчивает работу. Windows-приложение после вывода сообщения продолжает работать. На экране присутствует диалоговое окно, которое можно переместить по экрану мышью.

Мышью можно нажать кнопку OK для завершения работы приложения. Если нажать мышью кнопку OK, но не отпускать левую кнопку мыши, то на экране будет видна кнопка OK, нарисованная в нажатом состоянии. Если, не отпуская кнопку мыши, перемещать указатель то на кнопку OK, то вне ее, эта кнопка будет менять свой внешний вид. У окна приложения есть небольшое меню (с единственной командой Переместить), которое можно вызвать нажатием комбинации Alt+Пробел или щелчком правой кнопки на заголовке окна. Приложение можно завершить клавишей Enter, Escape или пробел.

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

Приложение с циклом обработки сообщений

В программе 2.1 практически вся функциональность приложения сосредоточена (и скрыта) внутри функции MessageBox. Для лучшего понимания структуры приложения сделаем реализацию поведения видимой, другими словами, создадим окно, которым будем управлять сами, а не доверять это функции MessageBox.

Окно новой версии hello.cpp показано на рис. 2.2. Теперь слова «Hello, World!» выводятся как надпись на кнопке, занимающей всю клиентскую область окна (они также появляются в строке заголовка окна).

Читайте также:
Виндовс 10 не устанавливает программы из Microsoft store

Рис. 2.2. Приложение «Hello, World!» с собственным циклом обработки сообщений.

«Типичное» приложение Windows в процессе инициализации сначала регистрирует новый оконный класс для своего главного окна. Затем приложение создает свое главное окно. Сейчас пока не будем регистрировать новый оконный класс, а используем один из стандартных оконных классов, BUTTON («Кнопка»). Поведение этого класса не позволит в точности повторить приложение из п.1. В данный момент это не важно, главное, что в приложении можно будет увидеть назначение цикла обработки сообщений (программа 2.2).

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE d2, LPSTR d3, int d4)

hwnd = CreateWindow(«BUTTON», «Hello, World!»,

WS_VISIBLE | BS_CENTER, 100, 100, 100, 80,

NULL, NULL, hInstance, NULL);

while (GetMessage(Hello, World!» с циклом обработки сообщений.

В данном примере виден цикл обработки сообщений. После создания окна программа входит в цикл while, в котором выполняется вызов функции Windows API для получения очередного сообщения – GetMessage. Эта функция возвращает значение FALSE только при получении сообщения WM_QUIT о завершении приложения. В цикле обрабатывается единственное сообщение, WM_LBUTTONUP, об отпускании левой кнопки мыши.

Функция DestroyWindow уничтожает окно приложения, а PostQuitMessage посылает приложению сообщение WM_QUIT. Поэтому при очередном вызове GetMessage цикл обработки сообщений завершится. Все сообщения, кроме WM_LBUTTONUP, передаются функции DispatchMessage.

Обратите внимание, что приложение из п.1 завершает работу, только если указатель в момент отпускания левой кнопки находится над кнопкой. В новой версии приложения выход из программы осуществляется по сообщению об отпускании левой кнопки, независимо от положения указателя.

Рассмотренный пример не продемонстрировал строение оконной процедуры. Поэтому еще раз усложним «Hello, World!», чтобы в этом приложении был виден и цикл обработки сообщений, и оконная процедура.

Приложение с циклом обработки сообщений и оконной процедурой

Новая версия hello.cpp (программа 2.3) регистрирует собственный оконный класс. Это делается частично для косметических улучшений (чтобы отказаться от неестественного применения класса BUTTON для вывода сообщения), но главным образом для того, чтобы установить собственную оконную процедуру.

Рис. 2.3. Версия приложения «Hello, World!» с собственным оконным классом.

void DrawHello(HWND hwnd)

HDC hDC = BeginPaint(hwnd,

DrawText(hDC, «Hello, World!», -1,

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg,

WPARAM wParam, LPARAM lParam)

case WM_PAINT: DrawHello(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR d3, int nCmdShow)

if (hPrevInstance == NULL)

wndClass.style = CS_HREDRAW | CS_VREDRAW;

wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

hwnd = CreateWindow(«HELLO», «HELLO», WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,

NULL, NULL, hInstance, NULL);

while(GetMessage(Hello, World!» с собственным оконным классом.

Новая версия приложения содержит примерно 60 строк исходного текста. Но оно выглядит как «полноценное» Windows-приложение (рис. 2.3), у которого есть системное меню, окно которого можно перемещать, изменять размер, сворачивать и разворачивать, оно умеет перерисовывать себя, реагировать на команду меню Закрыть и на комбинацию клавиш Alt+F4.

Как и раньше, выполнение программы начинается с функции WinMain. Сначала приложение проверяет, есть ли уже запущенный экземпляр данного приложения. Если есть, то оконный класс повторно регистрировать не надо. Иначе выполняется регистрация оконного класса, свойства и поведение которого описываются с помощью структуры WNDCLASS.

В переменную lpfnWndProc этой структуры помещается адрес оконной процедуры. В нашем примере это будет функция WndProc.

Далее, вызывается функция CreateWindow для создания окна. После вывода окна на экран WinMain входит в цикл обработки сообщений. Этот цикл завершится, когда GetMessage вернет FALSE в результате получения сообщения WM_QUIT.

Функция WndProc демонстрирует назначение и структуру оконной процедуры, которая не была видна в предыдущих версиях «Hello, World!». Типичная оконная процедура на языке Си состоит из большого оператора switch. В зависимости от полученного сообщения, из этого оператора вызываются различные функции для обработки конкретных сообщений. В нашем примере обрабатываются только два сообщения: WM_PAINT и WM_DESTROY.

Сообщение WM_PAINT требует от приложения частично или полностью перерисовать содержимое окна. Большинство приложений перерисовывают только те области окна, которые нуждаются в перерисовке. В нашем случае, для простоты, на каждое сообщение WM_PAINT всегда выполняется вывод всей строки «Hello, World!».

Сообщение WM_DESTROY поступает в результате действий пользователя, которые приводят к уничтожению окна приложения. В качестве реакции наше приложение вызывает функцию PostQuitMessage. Т.о. гарантируется, что функция GetMessage в WinMain получит сообщение WM_QUIT и главный цикл обработки сообщений завершится.

Сообщения, которые не обрабатываются нашей оконной процедурой, с помощью функции DefWindowProc передаются в оконную процедуру по умолчанию. Эта функция реализует поведение окна приложения и многих компонент его неклиентской области (например, строки заголовка).

Источник: infopedia.su

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru