Этот файл содержит большое количество определений типов данных, макросов, прототипов и так далее. Для создания переносимых приложений в любую среду, поддерживающую 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.
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, которая всегда определяется следующим образом:
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!» выводятся как надпись на кнопке, занимающей всю клиентскую область окна (они также появляются в строке заголовка окна).
Рис. 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