КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Налаштування клавіатуриПерша можливість налаштування клавіатури відноситься до встановлення часу затримки для автоповтору. Для цього використовується системна функція SystemParametersInfo з параметром SPI_SETKEYBOARDDELAY. Другий аргумент функції повинен вказувати на час затримки за 4-ма параметрами: 0 - 250 мс, 1 - 500 мс, 2 - 750 мс, 3 - 1000 мс. Існує також можливість отримання текучого значення часу затримки через параметр SPI_GETKEYBOARDDELAY. Наведемо приклад по їх використанню. Покроковий хід роботидля написання програми на мові С++ функції для встановлення часу затримки: 1. Функція SetDelay типу bool для встановлення часу затримки з параметром iDelay типу int. 2. Задаємо змінну iOldDelay = -1 типу int. 3. Перевіряєм діапазон аргументу 0-3: 4. Тобто, якщо iDelay < 0 і iDelay > 3, повертаємо значення falce. 5. Отримуємо текучий час затримки: 6. Задаємо функцію SystemParametersInfo з чотирма параметрами: SPI_GETKEYBOARDDELAY- для старого часу затримки, 0, взяття адреси параметра iOldDelay і 0. 7. Якщо значення змінної iOldDelay помилкове або рівне установлюваному, виходимо з програми, повертаючи значення falce. 8. Встановлюємо нове значення часу затримки: 9. Задаємо функцію SystemParametersInfo з чотирма параметрами: SPI_SETKEYBOARDDELAY – для нового часу затримки, 0, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE – для зміни і обновлення файла ініціалізації по часу затримки. 10. Повертаємо значення функції true. Існує можливість зміни частоти автоповтору символів. Для цього потрібно надати функції SystemParametersInfo перший аргумент SPI_SETKEYBOARDSPEED, а другий – нове значення частоти (від 0 до 31), де 0- 2,5 символів в секунду, а 31 – це 30 символів в секунду. Інші параметри значень наведені в табл.3.7. Для отримання текучого значення частоти автоповтору використовують параметр SPI_GETKEYBOARDSPEED. Наведемо приклад. Покроковий хід роботидля написання програми на мові С++ функції для встановлення частоти автоповтору. 1. Функція SetFreq типу bool для встановлення частоти автоповтору з параметром iFreq типу int. 2. Задаємо змінну iOldDelay = -1 типу int. 3. Перевіряєм діапазон аргументу 0-31: 4. Тобто, якщо iFreq < 0 і iFreq > 31, повертаємо значення falce. 5. Отримуємо текучу частоту затримки: 6. Задаємо функцію SystemParametersInfo з чотирма параметрами: SPI_GETKEYBOARDSPEED- для отримання старої частоти автоповтору, 0, взяття адреси параметра iOldFreq і 0. 7. Якщо значення iOldFreq помилкове або рівне iFreq - установлюваному, виходимо і повертаємо значення функції falce. 8. Встановлюємо нове значення частоти автоповтору: 9. Задаємо функцію SystemParametersInfo з чотирма параметрами: SPI_SETKEYBOARDDELAY – для встановлення нової частоти, 0, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE – для зміни і обновлення файлу ініціалізації. 10. Повертаємо значення функції truе. Ще одна інтересна функція – це прояв мигання текстового курсору та його зміна. Для цієї функції використовується системна функція SetCaretBlinkTime. Єдиний аргумент функції задає проміжок часу (в мілісекундах) між двома появами текстового курсору на екрані. Існує також функція, яка дозволяє отримати текуче значення часу мигання курсора GetCaretBlinkTime. Змінена частота мигання буде застосовуватися до всіх програм. Наведемо програмний приклад зміни частоти мигання курсора. Покроковий хід роботидля написання програми на мові С++ функції для зміни частоти мигання курсора: 1. Функція SetFreqCart типу bool для зміни частоти мигання курсора з параметром iFreq типу int. 2. Задаємо змінну iOldFreq = 200 типу int. 3. Перевіряєм діапазон аргументу 200-1200: 4. Тобто, якщо iFreq < 200 і iFreq > 1200, повертаємо значення falce. 5. Отримуємо текуче значення частоти: 6. Застосовуємо системну функцію GetCaretBlinkTime () і передаємо значення змінній iOldFreq. 7. Якщо значення рівне установлюваному або неотримане, виходимо і повертаємо значення falce. 8. Повертаємо значення функції true. При успішному завершенні функція SetCaretBlinkTime повинна повертати ненульове значення. Якщо функція повернула 0, це значить, що виникла помилка, розширений опис якої можна виявити, застосувавши виклик GetLastError. Те ж саме стосується функції GetCaretBlinkTime. Використання гарячих клавіш Використовуючи редактор ресурсів потрібно добавити в свою програму ресурс акселератора, присвоїти йому ідентифікатор (наприклад, MY_ACCEL) і призначити комбінації клавіш. Далі в цім же редакторі потрібно відкрити ресурс меню і добавити до необхідних пунктів опис закріплених за ними клавіш (наприклад, "&Відкрити \t Ctrl O"). Представимо код-опис програми. Покроковий хід роботидля написання макету програми на мові С++ для використання акселераторів: 1. В функцію WinMain добавляємо наступний код. 2. …. 3. Завантажуємо таблицю акселераторів з ідентифікатором MY_ACCEL HACCEL hAccel = LoadAccelerators ( hInst, MAKEINTRESOURCE (MY_ACCEL )). 4. …. 5. Додаємо в цикл обробки повідомлень перехоплювач акселераторних клавіш. 6. Цикл з використанням функції GetMessage з параметрами: взяття адреси на параметр msg і NULL, 0, 0 . 7. Якщо функція TranslateAccelerator з параметрами hWnd, hAccel і взяттям адреси параметра msg не нульова, то: 8. Застосовуємо функцію TranslateMessage з параметром, взяттям адреси на структуру msg для перехоплення всіх оперативних клавіш. 9. Застосовуємо функцію DispatchMessage з параметром, взяттям адреси на структуру msg для диспетчеризації. Отже, для завантаження таблиці акселераторів використовується функція LoadAccelerators. Перший аргумент функції вказує на дескриптор додатка, а другий – для імені ресурсів таблиці акселераторів. Замість імені можна використовувати ідентифікатор, обробивши ідентифікатором MAKEINTRESOURCE. Потім необхідно встановити перехоплювач для всіх оперативних клавіш (функцію TranslateAccelerator). Перший аргумент функції вказує на дескриптор головного вікна програми. Другий повинен зберігати дескриптор таблиці акселераторів (HACCEL). Третій – вказує на структуру MSG. Тепер натиснення клавіш <Ctrl> <O> викличе виконання необхідної команди. Якщо ж програма втратила фокус, то краще використовувати "гарячі" клавіші, програмування яких вимагає дотримання 2 правил: 1. Кожна "гаряча" клавіша реєструється в системі окремо і повинна мати унікальний глобальний ідентифікатор. 2. Після завершення роботи з програмою потрібно видалити зареєстровані "гарячі" клавіші з системи. Для реєстрації гарячої клавіші використовується функція RegisterHotKey. Перший аргумент функції вказує на дескриптор вікна, яке відкриває спеціальне повідомлення WM_HOTKEY, другий вказує на ідентифікатор "гарячої" клавіші, призначений розробником (значення в межах 0х0000 до 0хBFFF, для бібліотеки DLL - 0хС000 до 0хFFFF). Щоб запобігти конфліктів з іншими аналогічними значеннями, для бібліотеки DLL потрібно використовувати функцію GlobalAddAtom. Третій аргумент визначає модифікатор для комбінації клавіш, можливі значення для якого приведені в табл.3.20.
Таблиця 3.20. Типи модифікатора клавіш Четвертий аргумент задає код віртуальної клавіші (табл.3.19). При успішному виконанні функції буде повернуте значення 0. Якщо комбінація клавіш була зареєстрована в іншій програмі, то функція повідомить про помилку. Після реєстрації всіх клавіш потрібно додати обробник повідомлень WM_HOTKEY. Після завершення роботи потрібно визвати функцію UnregisterHotKey, яка видалить реєстрацію клавіш із системи. Наведемо приклад: Покроковий хід роботидля написання макету програми на мові С++ для використання «гарячих» клавіш. 1. Спочатку описуємо свої клавіші. 2. Через макрос #define створюємо першу гарячу клавішу MY_HOT_KEY_1 (дескриптор) і WM_USER + 5001 (ідентифікатор). Значення 5001 – для уникнення конфліктів в системі. 3. Так же створюємо другу гарячу клавішу MY_HOT_KEY_2 (дескриптор) і WM_USER + 5002 (ідентифікатор). 4. Так же створюємо третю гарячу клавішу MY_HOT_KEY_3 (дескриптор) і WM_USER + 5003 (ідентифікатор). 5. У головну функцію вікна додаємо підтримку своїх клавіш: 6. Застосувавши макрос LRESULT CALLBACK для функціонального результату повернення, використовуємо функцію MyMainProc з параметрами hWnd типу HWND, message і wParam типу UINT, lParam типу LONG. 7. Формуємо конструкцію вибору switch за значенням параметра message. 8. Здійснюємо програмою вибір по значеннях параметра: 9. Вибір WM_CREATE під час створення вікна реєстрації клавіш: 10. Для 1-ї клавіші призначуємо комбінацію «Ctrl+F2». Застосовуємо функцію RegisterHotKey з параметрами: hWnd, MY_HOT_KEY_1, MOD_CONTROL, VK_F2. 11. Для 2-ї клавіші призначуємо «Home». Застосовуємо функцію RegisterHotKey з параметрами: hWnd, NULL, VK_HOME. 12. Для 3-ї клавіші призначуємо комбінацію «Ctrl+ Shift+F5». Застосовуємо функцію RegisterHotKey з параметрами: hWnd, MY_HOT_KEY_3, MOD_CONTROL | MOD_SHIFT, VK_F5. 13. Закінчуємо блок вибору за значенням WM_CREATE. 14. Вибір WM_HOTKEY - обробка гарячих клавіш: 15. Організовуємо розгалуження вибору у цьому виборі: 16. Формуємо конструкцію вибору switch за значенням параметра wParam, який має ідентифікатор. 17. Здійснюємо програмою вибір по значеннях параметра: 18. Вибір MY_HOT_KEY_1- для 1-ї гарячої клавіші. 19. Виконуємо якусь свою команду. 20. Закінчуємо блок вибору за значенням MY_HOT_KEY_1. 21. Вибір MY_HOT_KEY_2- для 2-ї гарячої клавіші. 22. Виконуємо якусь свою команду. 23. Закінчуємо блок вибору за значенням MY_HOT_KEY_2. 24. Вибір MY_HOT_KEY_3- для 3-ї гарячої клавіші. 25. Виконуємо якусь свою команду. 26. Закінчуємо блок вибору за значенням MY_HOT_KEY_3. 27. Закінчуємо блок вибору за значенням WM_HOTKEY. 28. Вибір WM_DESTROY – для завершення програми. 29. Завершуємо програму і видаляємо реєстрацію клавіш: 30. Застосовуємо функцію UnregisterHotKey з параметрами 0 і MY_HOT_KEY_1 – для видалення 1-ї гарячої клавіші. 31. Застосовуємо функцію UnregisterHotKey з параметрами 0 і MY_HOT_KEY_2 – для видалення 2-ї гарячої клавіші. 32. Застосовуємо функцію UnregisterHotKey з параметрами 0 і MY_HOT_KEY_3 – для видалення 3-ї гарячої клавіші. 33. Закінчуємо блок вибору за значенням WM_DESTROY. 34. Вибір default по замовчуванню. 35. Повертаємо всі використані значення: hWnd, message, wParam, lParam за допомогою функції DefWindowProc. 36. Закінчуємо блок вибору за значенням default. 37. Повертаємо значення нуль для успішного виконання функції.
|