Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО.docx
Скачиваний:
4
Добавлен:
03.08.2019
Размер:
1.14 Mб
Скачать
  1. Простейшее win32 приложение. Архитектура приложения.

Win32 приложение:

  • Главная функция WinMain;

  • оконный класс. Описание, регистрация, создание экземпляра оконного класса;

  • стили класса, стили окна;

  • создание экземпляра оконного класса.

Архитектура приложения(в данном случае какого-то конкретного содержащего обработчики )

  1. Главная функция win32 процесса

Главной функцией win32 процесса является функция потока. Точно так же как каждое приложение C и C++ должно иметь в качестве начальной точки функцию main, каждое приложение на базе Win32 должно иметь функцию WinMain. WinMain имеет следующий синтаксис.

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow);

hInstance – дескриптор текущего экземпляра приложения

hPrevInstance - Дескриптор предыдущего экземпляра приложения. Этот параметр всегда NULL.

lpCmdLine – командная строка приложения.

nCmdShow – средства управления, т.е. как следует показывать окно.

  1. Оконный класс. Описание

Структурой оконного класса является структура WNDCLASSEX, которая содержит атрибуты класса окна.

WNDCLASSEX 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_LAB1));

wcex.hCursor= LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = CreateSolidBrush(RGB(192,192,192));//дескриптор кисти, используемой для закраски фона окна

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_LAB1);// указатель на строку, содержащую имя меню, применяемого по умолчанию для этого класса

wcex.lpszClassName = szWindowClass;//указатель на строку, содержащую имя класса окна

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

  1. Стили класса. Стили окна.

Стили класса определяют дополнительные элементы класса окна. Два или больше стиля могут быть объединены при использовании оператора поразрядного ИЛИ (|). Чтобы присвоить стиль классу окна, присвойте стиль элементу style структуры WNDCLASSEX. Стили класса следующие:

CS_BYTEALIGNCLIENT - Выравнивает рабочую область окна по границе байта (по направлению x). Этот стиль влияет на на ширину окна и его горизонтальное размещение при выводе на экран.

CS_BYTEALIGNWINDOW - Выравнивает окно по границе байта (по x направлению). Этот стиль влияет на на ширину окна и его горизонтальное размещение при выводе на экран.

CS_CLASSDC - Назначает единый контекст устройства, который совместно используется всеми окнами в классе.

CS_DBLCLK - Отправляет сообщение о двойном щелчке оконной процедуре

CS_DROPSHADOW - Windows XP: Создает эффект падающей тени на окно.

CS_GLOBALCLASS - Устанавливает, что класс окна - класс глобальной переменной приложения.

CS_HREDRAW - Перерисовывает все окно, если перемещение или регулировка размера изменяют ширину рабочей области.

CS_NOCLOSE - Отключает кнопку Закрыть (Close) на системном меню окна.

CS_OWNDC - Назначает уникальный контекст устройства для каждого окна в классе.

CS_PARENTDC - Устанавливает прямоугольник отсечения дочернего окна его родительского окна так, чтобы дочерний элемент мог рисовать родителя.

CS_SAVEBITS - Сохраняет, как точечный рисунок, часть экранного изображения, затененного окном этого класса

CS_VREDRAW - Перерисовывает все окно, если перемещение или регулировка размера изменяют высоту рабочей области.

Стили окна

WS_BORDER - Окно с рамкой

WS_CAPTION - Окно с заголовком.

WS_CHILD - Дочернее окно.

WS_CHILDWINDOW -То же самое, что и WS_CHILD

WS_CLIPCHILDREN - Этот стиль используется при создании родительского окна. При его использовании родительское окно не перерисовывает свои внутренние области, занятые дочерними окнами

WS_CLIPSIBLINGS - При указании этого стиля дочерние окна не перерисовывают свои области, перекрытые "братьями", то есть другими дочерними окнами, имеющими тех же родителей

WS_DISABLED - Вновь созданное окно сразу становится

WS_DLGFRAME - Окно с двойной рамкой без заголовка. Несовместим со стилем

WS_GROUP - Определяет первый орган управления в группе органов управления.

WS_HSCROLL- В окне создается горизонтальная полоса просмотра

WS_ICONIC- То же самое, что и WS_MINIMIZE

WS_MAXIMIZE- Создается окно максимально возможного размера

WS_MAXIMIZEBOX- Окно содержит кнопку для увеличения его размера до максимально возможного.

WS_MINIMIZE- Создается окно, уменьшенное до предела (свернутое в пиктограмму).

WS_MINIMIZEBOX - Окно содержит кнопку для сворачивания окна в пиктограмму (минимизации размеров окна).

WS_OVERLAPPED - Создается перекрывающееся окно, имеющее заголовок и рамку

WS_OVERLAPPEDWINDOW - Создается перекрывающееся окно, имеющее заголовок, рамку для изменения размера окна, системное меню, кнопки для изменения размеров окнаWS_POPUP - Создается временное (pop-up) окно

WS_POPUPWINDOW - Комбинация стилей WS_POPUP, WS_BORDER и WS_SYSMENU. WS_SYSMENU - Окно должно иметь системное меню

WS_TABSTOP - Этот стиль указывает орган управления, на который можно переключиться при помощи клавиши <Tab>.

WS_THICKFRAME - Окно должно иметь толстую рамку для изменения размера окна

WS_VISIBLE - Создается окно, которое сразу становится видимым.

WS_VSCROLL - В окне создается вертикальная полоса просмотра

WS_TILED - Устаревший стиль, аналогичен WS_OVERLAPPED

WS_SIZEBOX - Устаревший стиль, аналогичен WS_THICKFRAME

WS_TILEDWINDOW -Устаревший стиль, аналогичен WS_OVERLAPPEDWINDOW

MDIS_ALLCHILDSTYLES - Этот стиль используется при создании дочерних MDI-окон и определяет окна, которые могут иметь любые комбинации стилей.

  1. Создание экземпляра оконного класса

Экземпляр оконного класса создается при помощи функции CreateWindow:

HWND hWnd;

hWnd = CreateWindow(

szWindowClass,// имя зарегистрированного класса

szTitle,//имяокна

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

250,150, //горизонтальная и вертикальная позиция

800, 450,//ширина и высота окна

NULL, //дескриптор родительского окна

NULL,//дескриптор меню окна или идентификатора дочернего окна

hInstance,//дескриптор приложения

NULL//указатель на значение, передаваемое окну структурой CREATESTRUCT

);

После успешного завершения данной функции в hWnd хранится дескриптор нового окна.

  1. Динамическое изменение свойств экземпляра оконного класса

Для динамического изменения свойств экземпляра оконного класса используется функция SetClassLong.

SetClassLong(

HWND hWnd; //дескриптор окна

ind nIndex; //свойство которое необходимо поменять

LONG NewVal; //новое значение

)

  1. Обработка сообщений

Механизм обработки сообщений:

Сообщения обрабатываются в обработчике сообщений. Для каждого окна он свой.

typedef struct TagMsg

(

HWND hWnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

)

  1. Программирование клавиатуры

Механизм обработки сообщений от клавиатуры

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

Присвоенное для каждой клавиши на клавиатуре уникальное значение, называемое скэн-кодом (scan code), аппаратно-зависимый идентификатор для клавиши на клавиатуре. Клавиатура генерирует два скэн-кода, когда пользователь манипулирует клавишей - первый, когда пользователь нажимает клавишу, а второй, когда пользователь отпускает клавишу.

Драйвер устройства клавиатуры интерпретирует скэн-код и переводит его в код виртуальной клавиши (virtual-key code), в не зависящее от устройства значение, определяемое Windows, которое идентифицирует целевую клавишу. После трансляции скэн-кода, раскладка символов на клавиатуре создает сообщение, которое включает в себя скэн-код, код виртуальной клавиши и другую информацию о нажатии клавиши, а затем помещает сообщение в системную очередь сообщений. Windows удаляет сообщение из системной очереди сообщений и посылает его в очередь сообщений соответствующего потока. В конечном счете, цикл сообщения потока удаляет сообщение и посылает его соответствующей оконной процедуре для обработки.

  1. Коды ОЕМ, ANSI, Виртуальные коды.

  1. Символьные сообщения

Оконная процедура принимает символьное сообщение тогда, когда функция TranslateMessage транслирует код виртуальной клавиши соответствующий клавише знака. Символьными сообщениями являются WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, и WM_SYSDEADCHAR. Типичная оконная процедура игнорирует все символьные сообщения кроме WM_CHAR. Функция TranslateMessage генерирует сообщение WM_CHAR тогда, когда пользователь нажимает любую символьную клавишу.

Когда оконная процедура принимает сообщение WM_CHAR, она должна проверить код буквы, который сопровождает сообщение, чтобы установить, как обрабатывать символ. Код буквы находится в параметре wParam сообщения.

  1. Обработка сообщений от мыши

Для обработки сообщений от мыши используются WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONUP,WM_MBUTTONUP. Также для обработки сообщений от мыши если действие происходит вне клиентской области окна используются WM_NCLBUTTONDOWN WM_NCRNUTTONDOWN и т.д.

  1. Программирование таймера

Для установки таймера используется функция SetTimer(). В качестве параметров она принимает дескриптор окна, идентификатор таймера, время(в миллисекундах) и имя функции таймера(если нужно).

case WM_CREATE:

SetTimer (hWnd, 1, 1000, 0);

SetTimer (hWnd, 2, 2000, TimerFunc);

break;

Если четвёртый параметр равен 0, то необходимо в WM_TIMER описать события, которые будут происходить по истечении таймера.

Для снятия таймера используется функция KillTimer(). В качестве параметров она принимает дескриптор окна и идентификатор таймера.

  1. Диалоговые окна. Общие сведения.

Диалоговые окна используются для получения от пользователя дополнительной информации сверх той, которую может обеспечить меню. Окно диалога обычно имеет вид всплывающего окна с разнообразными дочерними окнами элементов управления внутри. Окна диалога бывают модальными (modal) и немодальными (modeless).

Создание и отображение диалогового окна на экране.

Создание и уничтожение немодального диалогового окна.

Создание немодального диалогового окна производится вызовом функции CreateDialog:

CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)DlgNonModal);

При закрытии диалога вызывается функция EndDialog, в которую вторым параметром передается результат работы:

EndDialog(hWndDlgNonMod, LOWORD(wParam));

Создание и уничтожение немодального диалогового окна.

Создание модального диалогового окна производится вызовом функции DialogBox:

DialogBox(hInst, MAKEINTRESOURCE(IDD_MODAL_DIALOG), hWnd, (DLGPROC)DlgModal);

При закрытии диалога вызывается функция EndDialog, в которую вторым параметром передается результат работы:

EndDialog(hWndDlgMod, LOWORD(wParam));