Структура простейшего оконного приложения 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; просмотров: 1934;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.046 сек.