В отчет по лабораторной работе следует включить программный код (в соответствии с пунктами задания) с текстовым описанием и подробными комментариями

Лабораторная работа №2

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

 

Выполнил: Снигирев Никита

Группа:    А-05-14

Введение

1). Тип данных TCHAR, переключение режима кодировки символов, функции для работы со строками (strlen, strcpy, strcat, itoa, atoi).

#ifdef _UNICODE

typedefwchar_t TCHAR;

#elsetypedefchar TCHAR;

#endif

Макрос _UNICODE будетвключенесливыукажите «Use Unicode Character set» и тогдатип TCHAR будетопределенкакwchar_t. Когдажевыукажите «Use Multi-byte character set» TCHAR будетопределенкак char.

size_t _tcslen(const TCHAR* );

#ifdef _UNICODE#define _tcslenwcslen #else#define _tcslenstrlen#endif

_tcscpy, _tcscat, _itot

#ifdef _UNICODE#define _ttoi _wtoi#else #define _ttoi atoi#endif

 

2). LOWORD, HIWORD

   WORD LOWORD( DWORD dwValue); // Получает слово низкого порядка от заданного значения    WORD HIWORD(   DWORD dwValue ); // Получает слово высокого порядка из указанного 32-битового значения.

3). Функция SendMessage

Например, передатьсообщениеглавномуокнуSendMessage(hWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(100,100));

илисообщениедлякнопкиSendMessage(hBut1,BM_SETSTATE,TRUE,0);

LRESULT WINAPI SendMessage( _In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam,_In_ LPARAM lParam);

 

4). Стильокна: CS_DBLCLKS, сообщениеWM_LBUTTONDBLCLK.

Окно будет получать сообщения о двойном щелчке (DBLCLK) только в том случае, если стиль соответствующего класса окна содержит флаг CS_DBLCLKS.

style = GetClassLong(hWnd,GCL_STYLE);

SetClassLong(hWnd, GCL_STYLE, style | CS_DBLCLKS):

ЕсликлассокнаопределенбезфлагаCS_DBLCLKSипользовательделаетдвойнойщелчоклевойкнопкоймыши, тооконнаяпроцедурапоследовательнополучаетсообщенияWMJ.BUTT0ND0WN, WM_LBUTTONUP, WM_LBUTT0ND0WNиWM_LBUTTONUP.
ЕсликлассокнаопределенсфлагомCS_DBLCLKS, топоследвойногощелчкаоконнаяпроцедураполучитсообщенияWM_LBUTT0ND0WN, WM_LBUTTONUP, WM_ LBUTTON-DBLCLKиWM_LBUTTONUP.

5). СообщениеWM_NCHITTEST, процедураDefWindowProc.

WM_NCHITTESTУведомляетокно, пpинимающеевводотмыши, отом, чтомышьпеpеместилась, либобыловыполненоодноизсобытийWM_LBUTT0ND0WN, WM_LBUTTONUP,WM_RBUTT0ND0WN, WM_RBUTTONUP.

lParamLo: локальная х кооpдинатакуpсоpа мыши.

lParamHi: локальная у кооpдинатакуpсоpа мыши.

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

LRESULT DefWindowProc - базовый обработчик окна( HWND hWnd, // указатель окна UINT Msg,         // идентификатор сообщения WPARAM wParam, // первый параметр сообщения LPARAM lParam // второй параметр сообщения);

 

 

6). SetCapture(hWnd); ReleaseCapture();

Функция SetCapture устанавливает захват мыши в заданном окне, принадлежащем текущему потоку. SetCaptureзахватывает ввод данных от мыши или когда мышь находится над захватывающим окном, или когда нажималась кнопка мыши, в то время, когда мышь была над захватывающим окном, а кнопка все еще находилась в нажатом состоянии. Только одно окно одновременно может захватить мышь.

Когда окно больше не требует всего ввода данных от мыши, поток, который создавал окно, должен вызвать функциюReleaseCapture, чтобыосвободитьмышь.

 

Задание

1. СоздатьприложениеWin32 Project (вMicrosoft Visual Studio). Запустив приложение, убедиться в том, что оно работает, а окно с помощью мыши перемещается по экрану (курсор мыши находится в заголовке окна).

2. В окно приложения добавить две кнопки, поля ввода и вывода. Первая кнопка должна возводить в квадрат целоечисло введенное пользователем, вторая кнопка должна заставить первую кнопку “нажаться” и выполнить код

 

//создание главного окна и присвоение стиля, разрешающего обработку сообщенийдаблклика

hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | CS_DBLCLKS,

25, 25, 600, 300, nullptr, nullptr, hInstance, nullptr);

DWORD style = GetClassLong(hWnd,GCL_STYLE); SetClassLong(hWnd, GCL_STYLE,style | CS_DBLCLKS);

//созданиекнопки 1

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

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

//созданиекнопки 2

hButton2 = CreateWindowW(TEXT("BUTTON"), TEXT("Press button above"), WS_CHILD | WS_VISIBLE,

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

//созданиеполяввода

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

  190, 25, 100, 25, hWnd, (HMENU)IdEdit, hInstance, nullptr);

//создание поля вывода для результата возведения в квадрат

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

  190, 50, 100, 25, hWnd, (HMENU)IdStatic, hInstance, nullptr);

//создание поля вывода для отслеживания событий

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

  50, 80, 400, 50, hWnd, (HMENU)IdMessageBox, hInstance, nullptr);

//создание поля для вывода количества срабатыванеи WM_NCHITTEST

TCHAR TMP_STR[MAX_LOADSTRING];

_itot(i, TMP_STR, 10);

hCHT = CreateWindowW(TEXT("STATIC"), TMP_STR, WS_CHILD | WS_VISIBLE,

  50, 140, 100, 25, hWnd, (HMENU)IdCHT, hInstance, nullptr);

 

case IdButton1:

                      //возведение в квадрат int значения из поля ввода и вывод в поле вывода

                      GetDlgItemText(hWnd, 150, TMP_STR, MAX_LOADSTRING);

                      tmp_value = _tstoi(TMP_STR);

                      tmp_value *= tmp_value;

                      _itot(tmp_value,TMP_STR,10);

                      SetDlgItemText(hWnd, 151, TMP_STR);

                      break;

               case IdButton2:

                      //сообщения полного нажатия кнопки 1

                      SendMessage(hButton1,WM_LBUTTONDOWN,NULL,NULL);

                      SendMessage(hButton1, WM_LBUTTONUP, NULL, NULL);

                      break;

По щелчку на правой кнопке мыши определить и вывести координаты курсора.

caseWM_RBUTTONDOWN:

        _itot(x, TMP_STR, 10);

        TCHARtmp_y[MAX_LOADSTRING];

        _itot(y, tmp_y, 10);

        _tcscat(TMP_STR,(wchar_t*)",");

        _tcscat(TMP_STR,tmp_y);

        SetDlgItemText(hWnd, 151, TMP_STR);

        _tcscat_s(MB_txt, _T("RBD "));

        break;

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

WM_LBUTTONDBLCLK: какие события и сколько раз срабатывают при двойном щелчке

caseWM_LBUTTONDOWN:

        _tcscat_s(MB_txt, _T("LBD "));

        is_wnd_holded = true;

        RECTnRect;

        GetWindowRect(hWnd, &nRect);

        vx = nRect.left-x;

        vy = nRect.top-y;

        break;

      

  caseWM_LBUTTONUP:

        _tcscat_s(MB_txt, _T("LBU "));

        is_wnd_holded = false;

        break;

  caseWM_LBUTTONDBLCLK:

        _tcscat_s(MB_txt, _T("LBDBLCLCK "));

break;

WM_NCHITTEST: сколько раз возникает данное событие при работе с мышью.

caseWM_NCHITTEST:

        if (is_wnd_holded) {

               MoveWindow(hWnd,x+vx,y+vy,600,300,true);

        }

        i++;

        TCHARtmp_it[MAX_LOADSTRING];

        _itot(i, tmp_it, 10);

        SetDlgItemText(hWnd,153,tmp_it);

        SetDlgItemText(hWnd, 152, MB_txt);

        returnDefWindowProc(hWnd, message, wParam, lParam);

break;

5. Разработать программный код, который позволит пользователю с помощью мыши перемещать окно, но мышь при этом нажимается и перемещается в клиентской области окна.

BOOLis_wnd_holded=false;

intvx;

intvy;

caseWM_NCHITTEST:

        if (is_wnd_holded) {

               MoveWindow(hWnd,x+vx,y+vy,600,300,true);

        }

        returnDefWindowProc(hWnd, message, wParam, lParam);

  break;

caseWM_MOUSEMOVE:

        GetCursorPos(&cp);

        x = cp.x;

        y = cp.y;

break;

 

caseWM_LBUTTONDOWN:

        is_wnd_holded = true;

        RECTnRect;

        GetWindowRect(hWnd, &nRect);

        vx = nRect.left-x;

        vy = nRect.top-y;

break;

 

caseWM_LBUTTONUP:

        is_wnd_holded = false;

  break;

 

6. Сохранить разработанное приложение так, чтобы его можно было использовать в программных экспериментах следующей лабораторной работы.

В отчет по лабораторной работе следует включить программный код (в соответствии с пунктами задания) с текстовым описанием и подробными комментариями.

 


Дата добавления: 2018-04-05; просмотров: 125; Мы поможем в написании вашей работы!

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




Мы поможем в написании ваших работ!