Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_Lab1.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
83.59 Кб
Скачать
  1. Описание событий мыши с параметрами, а также событий

wm_RButtonDown

wm_RButtonUP

wm_LButtonDown

wm_LButtonUp

сообщение посылается окну, когда на нем была нажата(Down) или отжата(Up) правая(R) или левая(L) кнопка мыши

WM_COMMAND посылается когда:

  • производится выбор пункта меню

  • элемент управления посылает уведомительное сообщение родительскому окну

  • происходит нажатие клавиши акселератора.

Обработка этого сообщения производится в главной функции окна.

Wparam - определяет источник сообщения: элемент управления или акселератор.

Lparam - идентификатор элемента, если это не акселератор.

WM_CREATE посылается тогда, когда программа запрашивает, вызовом какой функции CreateWindowEx или CreateWindow должно быть создано окно. Оконная процедура нового окна принимает это сообщение после того, как окно создано, но до того, как окно становится видимым. Сообщение посылается перед возвращением значения функцией CreateWindowEx или CreateWindow.

Синтаксис

WM_CREATE

lpcs = (LPCREATESTRUCT) lParam; // структура с данными создания

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

case WM_DESTROY:

PostQuitMessage( 0 );

break;

В ответ на это сообщение мы должны поместить в очередь сообщение WM_QUIT. Это и делает функция PostQuitMessage() посылая в очередь это сообщение и говоря, что процесс должен быть завершен.

VOID PostQuitMessage

(

int nExitCode // код возврата

);

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

Синтаксис

WM_QUIT

nExitCode = (int) wParam; // код завершения

Параметры nExitCode Значение wParam. Определяет код завершения, данный в функции PostQuitMessage.

Задание

1) Создать приложение Win32 Project (в Microsoft Visual Studio):

Файл -> Создать -> Проект -> VC++ -> Проект Win32

2) Работа с ресурсами приложения:

  • Изменить заголовок окна (в заголовке указать номер лабораторной работы и фамилию студента):

Двойной клик ЛКМ по файлу ресурсов («project_name.rc»)

Выбрать String Table и изменить IDC_APP_TITLE. Также можно добавить собственные строки путем загрузки их в приложение.

  • Изменить иконку приложения (создать собственную):

Сделать в редакторе или скачать файл .ico . В редакторе выбрать размер 32х32.

  • Добавить в меню новый пункт:

В редакторе меню в можно легко добавить новые пункты и подпункты.

3) Задать новые координаты (левый верхний угол, например, (100, 100)) и размеры запускаемого приложения

hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

0, 0, 500, 300, nullptr, nullptr, hInstance, nullptr);

Для изменения координат окна после его создания можно использовать функцию MoveWindow, описанную в введении.

4) Создать управляющие элементы пользовательского интерфейса: две кнопки (BUTTON), поле ввода (EDIT) и поле вывода (STATIC). Для кнопок задать идентификатор управляющего элемента.

HWND hButton1;

HWND hButton2;

HWND hEdit;

HWND hStatic;

const int IdButton1 = 100;

const int IdButton2 = 101;

const int IdEdit = 150;

const int IdStatic = 151;

hButton1 = CreateWindowW(TEXT("BUTTON"), TEXT("Action1"), WS_CHILD | WS_VISIBLE,

50, 25, 70, 25, hWnd, (HMENU)IdButton1, hInstance, nullptr);

hButton2 = CreateWindowW(TEXT("BUTTON"), TEXT("Action2"), WS_CHILD | WS_VISIBLE,

50, 50, 70, 25, hWnd, (HMENU)IdButton2, hInstance, nullptr);

hEdit = CreateWindowW(TEXT("EDIT"), TEXT("Put text"), WS_CHILD | WS_VISIBLE,

140, 25, 70, 25, hWnd, (HMENU)IdEdit, hInstance, nullptr);

hStatic = CreateWindowW(TEXT("STATIC"), TEXT("Text"), WS_CHILD | WS_VISIBLE,

140, 50, 70, 50, hWnd, (HMENU)IdStatic, hInst, nullptr);

5) Написать обработчики событий для кнопок, пункта меню и некоторых событий:

События: WM_CREATE, WM_DESTROY, нажатие левой кнопки мыши, нажатие правой кнопки мыши, щелчок на добавленном пункте меню должны выводить сообщения о том, какое именно событие произошло:

case WM_CREATE:

HRGN FormRgn1,FormRgn2,FormRgn;

RECT WRect;

GetWindowRect(hWnd, &WRect);

FormRgn = CreateEllipticRgn(0, 0, WRect.right - WRect.left, WRect.bottom - WRect.top);

FormRgn1 = CreateEllipticRgn(-100, -100, WRect.right - WRect.left+20, WRect.bottom - WRect.top);

FormRgn2 = CreateRectRgn(0, 0, WRect.right - WRect.left, WRect.bottom - WRect.top);

CombineRgn(FormRgn, FormRgn2, FormRgn1, RGN_AND);

FormRgn1 = CreateEllipticRgn(250,150,350,250);

CombineRgn(FormRgn, FormRgn, FormRgn1, RGN_XOR);

SetWindowRgn(hWnd, FormRgn, true);

hStatic = CreateWindowW(TEXT("STATIC"), TEXT("Text"), WS_CHILD | WS_VISIBLE,

140, 50, 70, 50, hWnd, (HMENU)IdStatic, hInst, nullptr);

break;

case WM_RBUTTONDOWN:

SetDlgItemText(hWnd, 151, _T("Right Button is pressed"));

SetParent(hButton1, hWnd);

KillTimer(hWnd,1);

MoveWindow(hButton1, 50, 25, 70, 25, true);

break;

case WM_LBUTTONDOWN:

SetDlgItemText(hWnd, 151, _T("Left Button is pressed"));

break;

case WM_MENUSELECT:

SetDlgItemText(hWnd, 151, _T("Menu is pressed"));

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

Первая кнопка BUTTON: текст введенный в поле EDIT должен появиться в поле STATIC:

TCHAR TMP_STR[MAX_LOADSTRING];

case IdButton1:

GetDlgItemText(hWnd, 150, TMP_STR, MAX_LOADSTRING);

SetDlgItemText(hWnd, 151, TMP_STR);

break;

Вторая кнопка BUTTON: в поле STATIC должен быть выведен заголовок окна приложения.

case IdButton2:

SetDlgItemText(hWnd, 151, szTitle);

break;

6)Обработчик пункта меню должен: сменить окно - родителя у первой кнопки, а затем заставить ее медленно перемещаться по экрану. Нажатие правой кнопки мыши должно обеспечить возвращение кнопки в окно программы.

int i = 0;

case ID_CUSTOMCLAUSE_CUSTOMITEM:

SetParent(hButton1, NULL);

i = 0;

//инициализация таймера

SetTimer(hWnd, 1, 35, NULL);

break;

//сообщение, срабатывающее при достижении времени таймером

case WM_TIMER:

i++;

MoveWindow(hButton1, i, i, 70, 25, true);

if (i >= 100)i = 0;

break;

//возвращение окна на место и отключение таймера

case WM_RBUTTONDOWN:

SetDlgItemText(hWnd, 151, _T("Right Button is pressed"));

SetParent(hButton1, hWnd);

KillTimer(hWnd,1);

MoveWindow(hButton1, 50, 25, 70, 25, true);

break;

7) Оформить окно приложения в форме региона: прямоугольник с эллипсом и вырезанным посередине кругом (расположить все управляющие элементы, чтобы они были видны). Проверить работоспособность приложения.

HRGN FormRgn1,FormRgn2,FormRgn;

RECT WRect;

GetWindowRect(hWnd, &WRect);

FormRgn = CreateEllipticRgn(0, 0, WRect.right - WRect.left, WRect.bottom - WRect.top);

FormRgn1 = CreateEllipticRgn(-100, -100, WRect.right - WRect.left+20, WRect.bottom - WRect.top);

FormRgn2 = CreateRectRgn(0, 0, WRect.right - WRect.left, WRect.bottom - WRect.top);

CombineRgn(FormRgn, FormRgn2, FormRgn1, RGN_AND);

FormRgn1 = CreateEllipticRgn(250,150,350,250);

CombineRgn(FormRgn, FormRgn, FormRgn1, RGN_XOR);

SetWindowRgn(hWnd, FormRgn, true);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]