Модераторы: PILOT
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пожалуйста, помогите!Катастрофа! Не успеваю !!Осталось чуть-чуть!!! 
:(
    Опции темы
Finder Adventuries
Дата 5.11.2002, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 13.9.2002

Репутация: нет
Всего: нет



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

В эту программу (вывод окна) -

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
#pragma argsused
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
    {
    static char szAppName[] = "Лабораторная № 3" ;
    HWND        hwnd ;
    MSG         msg ;
//-------------Процедура Register , сообщает Windows характеристики класса окна
//-------------определяет общий класс окна ---------------------------------

    WNDCLASSEX  wndclass ;

    wndclass.cbSize        = sizeof (wndclass) ;
    wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc   = WndProc ;
    wndclass.cbClsExtra    = 0 ;
    wndclass.cbWndExtra    = 0 ;
    wndclass.hInstance     = hInstance ;
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ; // Иконка
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ; //Курсор  обычный
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName  = NULL ;
    wndclass.lpszClassName = szAppName ;
    wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;

      RegisterClassEx (&wndclass) ;
 //----------------------------------------------------------
 //--------------создание окна -----------------------------
 //----процедура Create определяет - конкретный экземпляр класса окна
       hwnd = CreateWindow (szAppName,
    "Лабораторная № 3",
                  WS_OVERLAPPEDWINDOW,     // window стиль
                  CW_USEDEFAULT,           //  x position
                  CW_USEDEFAULT,           // y position
                  CW_USEDEFAULT,           //  x size
                  CW_USEDEFAULT,           // y size
                  NULL,                    //текущий window  handle
                  NULL,                    // меню handle
                  hInstance,
  NULL) ;   //параметр создания

    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
//-------------------------------------------------------
//-------Третья часть процедуры WinMain - цикл сообщения
    while (GetMessage (&msg, NULL, 0, 0))
         {
         TranslateMessage (&msg) ;
         DispatchMessage (&msg) ;
         }

    return msg.wParam ;
    }
//-----------------------------------------------------------
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    HDC         hdc ;
    PAINTSTRUCT ps ;
    RECT        rect ;

    switch (iMsg)
         {

         case WM_PAINT :
      hdc = BeginPaint (hwnd, &ps) ;

              GetClientRect (hwnd, &rect) ;

//               DrawText (hdc, "ТЕСТ", -1, &rect,
 //                       DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;

      EndPaint (hwnd, &ps) ;
               return 0 ;

         case WM_DESTROY :
              PostQuitMessage (0) ;
              return 0 ;
         }
     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }

Используя функцию sprintf ,создайте программу, которая выписывает координаты мыши в момент выполнения щелчков левой и правой кнопками мыши и печатает координаты мыши в момент нажатия клавиши
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!





//--------------------------------------------------------------------------
Для справки :


Лабораторная работа №5
Тема: Мышь и клавиатура.
Цель:  Исследование управления мышью и клавиатурой в Windows программе.
Теоретические сведения.
С помощью системы сообщений можно установить немедленный и относительно полный контроль над мышью и клавиатурой.

Рассмотрим функцию отклика на сообщение WM_MOUSEMOVE.

// Эта функция вызывается при любом перемещении мыши
void KeyMouse_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
{
char S[100];
HDC PaintDC = GetDC(hwnd) ;
sprintf(S, "WM_MOUSEMOVE ==> x = %d y = %d keyFlags = %d ",
x, y, keyFlags) ;
SetBkColor(DC, GetSysColor(COLOR_HINDOW));
TextOut(PaintDC, XVal, YVal + 80, S, strlen(S));
ReleaseDC(hwnd, PaintDC);
}
Когда окно получает сообщение WM_MOUSEMOVE, информация прячется в параметры hwnd, wParam и lParam. Последний из этих параметров в своем младшем слове несет информацию о столбце, на котором находив курсор мыши, а в старшем — информацию о строке. Но благодаря взломщикам сообщений эта информация переводится в координаты х и y видимые в заголовке KeyMouse_OnMouseMove.
Функция KeyMouse_OnMouseMove делает параметры х, у и keyFlags видимьми на экране, сначала транслируя их посредством функции sprintf в символьную строку, а затем визуально отображая их с помощью функции TextOut. Это та же самая система, с которой вы уже встречались при изучении отклика на нажатие клавиши.
Всякий раз, когда на экране появляется новый набор координат мыши, очередное сообщение было обработано WndProc.
Помимо координат мыши, с каждым сообщением WM_MOUSEMOVE посылается и другая информация, содержащаяся в аргументе keyFlags. Этот параметр может иметь одно из следующих значений:

Константа             Значение
MK_CONTROL Нажата клавиша Control
MK_LBUTTON Нажата левая кнопка мыши
MK_RBUTTON Нажата правая кнопка мыши
MK_MBUTTON Нажата средняя кнопка мыши
MK_SHIFT Нажата клавиша Shift
Эти константы являются битовыми флажками. Следовательно, вы должны использовать битовые операторы, чтобы проверить, установлены они или нет. Сделать это очень просто. Например, если вы хотите узнать, нажата ли клавиша Control во время движения мыши, то достаточно соединить keyFlags и MK_CONTROL логическим «И», а затем проверить результат:

if ((keyFlag & MK_CONTROL) == MK_CONTROL)
DOSOMETHING

Что6ы увидеть, как именно происходит этот процесс, можно модифицировать функцию KeyMouseOnMouseMove введен вызов SetTextColor и RGB. Эти два вызова постоянно используются Windows-программах.
Макрос RGB возвращает 4-байтное значение, определяющее цвет. Возвращаемый цвет определяется тремя параметрами, передаваемыми в макрос, каждый из которых может принимать значение от 0 до 255. Если третий параметр устанавливается равным 255, а остальные нулю, результирующий цвет будет темно-синим. Если первый параметр равен 255, а остальные нулю, то цвет будет красным. Средний параметр управляет интенсивностью зеленого в цвете, возвращаемом макросом RGB.
В четвертом примере предыдущей функции синий и красный смешиваются в темно-бордовый. Чтобы получить серый цвет, то могли бы установить все значения, равными 127. Установка их всех в 0 дает густой черный, а в 255 — белый. Если одновременно включите зеленый и красный, то получите ярко-желтый.
Функция SetTextColor легче для понимания, нежели макрос RGB, поскольку она делает не более того, что означает ее имя. То есть устанавливает цвет текста, который выводится в передаваемый ей контекст устройства. Иначе говоря, она «копирует» результат функции RGB в контекст устройства.

Обработка одинарных и двойных щелчков кнопкой мыши

Программа KeyMouse использует функции KeyMousе_OnLButtonDown и KeyMouse_OnLButtonUp для записи случаев нажатия кнопки. Работа этих функций очень похожа на работу всех остальных программ.
Легче понять, что происходит, когда кнопку отпускают, нежели когда ее нажимают. Поэтому начнем с функции KeyMouse_OnLButtonUp.
void KeyMouse_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags)
{
char S[100] ;
HDC PaintDC = GetDC (hwnd) ;
sprintf(S, "WM_LBUTTONUP ==> x = %d y = %d F = %d ",x, y, keyFlags) ;
SetBkColor(DC, GetSysColor(COLOR_WINDOW)) ;
Text0ut(PaintDC, XVal, YVal + 120, S, strlen(S));
ReleaseDC(hwnd, PaintDC);
}

Обрабатывать двойные щелчки левой или правой кнопки мыши, то необходимо начать с установки стиля окна в CS DBLCLKS. Это делается в методе Register.

win. style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

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

Рассмотрим, как именно работает функция KeyMouse_OnLButtonDown.

void KeyMouse_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x,
                          int y, UINT keyFlags)
{
char S[100] ;
HDC PaintDC = GetDC(hwnd) ;
if (fDoubleClick)
sprintf(S,
"WM_LBUTTONDBLCLK ==> Db = %d x = %d y = %d Flags = %d ", fDoubleClick, x, у, keyFlags) ;
else
sprintf(S, "WM_LBUTTONDOWN ==> Db = %d x = %d у = %d Flags = %d ", fDoubleClick, x, y, keyFlags) ;
SetBkColor(DC, GetSysColor(COLOR_WINDOW)) ;
Text0ut(PaintDC, XVal, YVal + 100, S, strlen(S));
ReleaseDC(hwnd, PaintDC) ;
}
Завладев контекстом устройства, функция проверяет, был ли сделан двойной щелчок или одинарный. В первом случае параметр fDoubleClick будет равен TRUE. При этом функция печатает строку, сигнализирующую, что было послано сообщение WM_LBUTTONDBLCLK. Кроме того, функция информирует пользователя о текущем состоянии координат и об установках флажков.
Разумеется, если двойного щелчка не было, пользователь извещается о приходе сообщения WM LBUTTONDOWN. Тогда функция отображает текущее состояние всех параметров, включая координаты мыши в момент нажатия левой кнопки кнопки.
PM MAIL   Вверх
Baa
Дата 5.11.2002, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Во-первых, заголовок не отражает суть постинга.
Во-вторых, не вижу конкретного вопроса, вижу только желание, чтобы кто-то помог сделать.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Klin
  Дата 6.11.2002, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: нет
Всего: 25



В форме или во всём экране?


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Обсуждение работы | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.