Назад | Начало урока | Вперед
Содержание

День 4 (продолжение 1)

  • Перехват событий клавиатуры
  • Изменение указателя мыши
  • Библиотека MFC Функция AfxGetApp()

    Вверх

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

    События клавиатуры перечислены в нижеследующей таблице :

    WM_KEYDOWN Клавиша нажата
    WM_KEYUP Клавиша отпущена
    WM_SYSKEYDOWN Нажата F10 или Alt в сочетании с другой клавишей
    WM_SYSKEYUP Отпущена F10 или Alt в сочетании с другой клавишей


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

    Вверх

    Изменение указателя мыши
    Как можно использовать в графическом приложении связанные с клавиатурой сообщения о событиях? Например можно по нажатию определенных клавиш клавиатуры менять форму указателя мыши. Попробуем сделать это.
    При нажатии на клавишу
    A -указатель будет в форме стрелки,
    B - текстовый указатель,
    C - песочные часы,
    X - выход из приложения.
    1. К объекту диалогового окна используюя Messages во вкладке Properties добавьте функцию, обрабатывающую сообщение от клавиатуры WM_KEYDOWN.
    2. Отредактируйте только что созданную функцию OnKeyDown() :
    Листинг 4.4
    void CMouseDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {

    char cChar;
    HCURSOR hCursor = 0;
    HCURSOR hPrevCursor = 0;
    cChar = char(nChar);

    if(cChar == 'A')
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
    hPrevCursor = SetCursor(hCursor);
    }
    if(cChar == 'B')
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_IBEAM);
    hPrevCursor = SetCursor(hCursor);
    }
    if(cChar == 'C')
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_WAIT);
    hPrevCursor = SetCursor(hCursor);
    }
    if(hPrevCursor)
    {
    DestroyCursor(hPrevCursor);
    }
    if(cChar == 'X')
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_WAIT);
    hPrevCursor = SetCursor(hCursor);
    if(hPrevCursor)
    DestroyCursor(hPrevCursor);
    OnOK();
    }
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
    }

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

    void CMouseDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

  • UINT nChar,-указывает какая клавиша была нажата.В нем содержится код символа, который следует преобразовать в соответствующий символ в первой строке программного кода. Преобразовав код символа в соответствующий символ, можно непосредственно определить какая клавиша была нажата

  • UINT nRepCnt, -указывает сколько раз была нажата клавиша.Обычно если клавиша была нажата а затем отпущена,то его значение равно 1.

  • UINT nFlags -комбинированный флаг. Он позволяет определить была ли одновременно с клавишей нажата клавиша Alt или была ли нажата одна из дополнительных клавиш. С помощью данного аргумента нельзя определить была ли нажата клавиша Shift или Ctrl.

    Как только вы определили что нажата одна из указанных вами клавиш, следует соответвтсующим образом изменить указатель мыши

    if(cChar == 'A')

    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
    hPrevCursor = SetCursor(hCursor);
    }

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


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

    После того как указатель мыши загружен в память,

    hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);

    его дескрипторр передается функции SetCursor(),

    hPrevCursor = SetCursor(hCursor);

    которая соответствующим образом меняет текущую форму указателя мыши.

    Возвращаемым значением функции SetCursor() является дескриптор предыдущего указателя мыши.

    Вызвав функцию DesytroyCursor(), предыдущий указатель мыши можно удалить.

    if(hPrevCursor)
    {
    DestroyCursor(hPrevCursor);
    }
    Скомпилируйте и запустите программу.Форма курсора мыши будет меняться по нажатию клавиши клавиатуры.


    Вверх

    Библиотека MFC Функция AfxGetApp()


    Из предыдущего листинга вы видите что вместе с функцией LoadStandardCursor() вызывается фукцния AfxGetApp()

    hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);

    Поскольку данная функция для вызова функции LoadStandardCursor() использует указатель, можно предположить что она возвращает указатель на некоторый класс.

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

    AfxGetApp. - Эта функция возвращает указатель на объект приложения класса CWinApp .Используйте эту функцию для успешного доступа к любой функциональной возможности класса CWinApp

    Если вы покопаетесь в вашем исходном коде, вы найдете глобальную переменную класса приложения : CMouseApp theApp; Не смотря на то, что эта переменная объявлена в коде,непосредственно ее использовать или ссылаться на нее нельзя.Чтобы вызвать объект приложения или сослаться на него, вы должны использовать функцию AfxGetApp().

    АВ:В этой программе использована функции класса CWinApp

    HCURSOR LoadStandardCursor(LPCTSTR lpszCursorName) const; // for IDC_ values

    Назад | Вверх | Вперед
    Содержание

    Hosted by uCoz