Структура простейшего оконного приложения Windows
Типы данных Windows. Простейшее оконное приложение.
Типы данных
Исходные тексты любого приложения Windows должны включать файл windows.h
Этот файл содержит большое количество определений типов данных, макросов, прототипов и так далее. Для создания переносимых приложений в любую среду, поддерживающую 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 является механизм сообщений. Сообщения могут передаваться оконной процедуре немедленно, а могут помещаться в очередь сообщений.
// --- Обязательный включаемый файл
#include <windows.h>
// --- Описание функции главного окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
// --- Глобальные переменные
HINSTANCE hInst; // Дескриптор экземпляра приложения
char ClassName[]="Window"; // Название класса окна
char AppTitle[]="Application Win32"; // Заголовок главного окна
// --- Функция WinMain
int WINAPI WinMain( HINSTANCE hInstance,
// Дескриптор экземпляра приложения
HINSTANCE hPrevInstance, // В Win32 всегда равен NULL
LPSTR lpCmdLine,
// Указатель на командную строку. Он // позволяет
// приложению получать данные из командной строки.
int nCmdShow
// Определяет, как приложение первоначально
// отображается на дисплее: пиктограммой
// (nCmdShow = SW_SHOWMINNOACTIVE)
// или в виде открытого окна (nCmdShow = SW_SHOWNORMAL).
)
{
WNDCLASS wc; // Структура для информации о классе окна
HWND hWnd; // Дескриптор главного окна приложения
MSG msg; // Структура для хранения сообщения
// Сохраняем дескриптор экземпляра приложения в глобальной
// переменной, чтобы при необходимости воспользоваться им в
// функции окна.
hInst=hInstance;
// --- Проверяем, было ли приложение запущено ранее.
// Воспользуемся функцией FindWindow, которая позволяет
// найти окно верхнего
// уровня по имени класса или по заголовку окна:
// HWND FindWindow(LPCTSTR lpClassName,
// LPCTSTRlpWindowName);
// Через параметр lpClassName передается указатель на
// текстовую строку, в которую необходимо записать имя
// класса искомого окна. На базе одного и того же класса
// можно создать несколько окон. Если необходимо найти
// окно с заданным заголовком, то имя заголовка следует
// передать через параметр lpWindowName. Если же подойдет
// любое окно, то параметр lpWindowName может иметь
// значение NULL.
if((hWnd=FindWindow(ClassName, NULL))!=NULL)
{
// Пользователь может не помнить, какие приложения уже
// запущены, а какие нет. Когда он запускает приложение,
// то ожидает, что на экране появится его главное окно.
// Поэтому, если приложение было запущено ранее,
// целесообразно активизировать и выдвинуть на передний
// план его главное окно. Это именно то, к чему приготовился
// пользователь.
if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);
SetForegroundWindow(hWnd);
// Найдена работающая копия - работа новой копии
// прекращается.
return FALSE;
}
// --- Работающая копия не найдена - функция WinMain
// приступает к инициализации. Заполнение структуры
// WNDCLASS для регистрации класса окна.
memset(&wc, 0, sizeof(wc));
wc.lpszClassName=ClassName; // Имя класса окон
wc.lpfnWndProc=(WNDPROC)WndProc;
// Адрес оконной функции
wc.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса
wc.hInstance=hInstance; // Экземпляр приложения
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
// Пиктограмма для окон
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
// Курсор мыши для окон
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
// Кисть для окон
wc.lpszMenuName=NULL; // Ресурс меню окон
wc.cbClsExtra=0; // Дополнительная память
wc.cbWndExtra=0; // Дополнительная память
// Pегистрация класса окна.
RegisterClass(&wc);
// Создаем главное окно приложения.
hWnd=CreateWindow(
ClassName, // Имя класса окон
AppTitle, // Заголовок окна
WS_OVERLAPPEDWINDOW, // Стиль окна
CW_USEDEFAULT, // X-координаты
CW_USEDEFAULT, // Y-координаты
CW_USEDEFAULT, // Ширина окна
CW_USEDEFAULT, // Высота окна
NULL, // Дескриптор окна-родителя
NULL, // Дескриптор меню окна
hInst, // Дескриптор экземпляра приложения
NULL); // Дополнительная информация
if(!hWnd)
{
// Окно не создано, выдаем предупреждение.
MessageBox(NULL,
"Create: error",AppTitle,MB_OK|MB_ICONSTOP);
return FALSE;
}
// Отображаем окно.
ShowWindow(hWnd, nCmdShow);
// Обновляем содержимое клиентской области окна.
UpdateWindow(hWnd);
// Запускаем цикл обработки очереди сообщений.
// Функция GetMessage получает сообщение из очереди,
// выдает false при выборке из очереди сообщения WM_QUIT
while(GetMessage(&msg, NULL, 0, 0))
{
// Преобразование некоторых сообщений,
// полученных с помощью клавиатуры
TranslateMessage(&msg);
// Отправляем сообщение оконной процедуре
DispatchMessage(&msg);
}
return msg.wParam;
}
// --- Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
char *str="First Windows aplication";
switch(msg)
{
// Необходимо обновить содержимое клиентской области окна.
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hWnd,&ps);
// Получить контекст окна
TextOut(hDC,20,20,str,strlen(str));
// Нарисовать текст
EndPaint(hWnd,&ps);
// Освободить контекст окна
}; break;
// Нажата левая клавиша мыши в клиентской области окна.
case WM_LBUTTONDOWN:
{
MessageBox(hWnd, "32-bit aplication", "Window",
MB_OK|MB_ICONINFORMATION);
}; break;
// Пользователь удалил окно.
case WM_DESTROY:
{
// Если данная функция является оконной функцией
// главного окна, то следует в очередь сообщений
// приложения послать сообщение WM_QUIT
PostQuitMessage(0);
}; break;
// Необработанные сообщения передаем в стандартную
// функцию обработки сообщений по умолчанию.
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0l;
}
Точкой входа программы для 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; просмотров: 2045;