Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Ввод с клавиатуры



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

Цветной текст | Все обучалки раздела | Ввод с клавиатуры часть 2

Описание

Объясняется, как получать ввод с клавиатуры с помощью WndProc().

Программа печатает в окне текст, цвет которого зависит от нажатой клавиши (R, G или B).

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

// Done by TheTutor -- 5/12/02
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

/*      Эта обучалка о том, как получать ввод с клавиатуры в приложениях Win32.
      Windows позволяет сделать это многими способами, но эта обучалка фокусируется
      на методе получения данных с клавиатуры внутри WndProc().

      То, что мы сделаем, будет очень простым. Если нажмете 'R', то напечатается 
      "RED" красным цветом. Если нажмете 'G', напечатается "GREEN" зеленым цветом.
      Думаю, вы сможете угадать, что будет для 'B'

      Итак, приступим.
*/


#include <windows.h>

#define WIN_WIDTH 640
#define WIN_HEIGHT 480

// Откуда будет рисоваться текст
#define TEXT_X 300 
#define TEXT_Y 220

#define class_name "GT_KeyboardInput"

// Чтобы меньше было набирать
typedef unsigned char uchar;


// Эта функция печатает на экран передаваемый текст, используя
// передаваемый RGB цвет.

void PrintColoredText(HWND hwnd, char *text, uchar R, uchar G, uchar B);


// Стандартная callback функция
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);


int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprev, PSTR cmdline, int ishow)
{

    HWND hwnd;      // Ссылка на наше окно
    MSG msg;      // В этой переменной будут сохраняться сообщения (такие, как
                        // щелчок мышью), которые может получить наше окно.
                        
    WNDCLASSEX wndclassex = {0};      // Это наш "класс окна". "EX" означает
                                                      // "extended style" (расширенный стиль),
                                                      // который дает нам больше опций, когда
                                                      // мы создаем наше окно (хотя мы и проигнорируем их).


    // Заполняем нужные нам поля
    wndclassex.cbSize = sizeof(WNDCLASSEX);            // Всегда должно быть установлено
    wndclassex.style = CS_HREDRAW | CS_VREDRAW; // Стиль класса окна
    wndclassex.lpfnWndProc = WinProc;                  // Указатель туда, где определена WinProc()
    wndclassex.hInstance = hinstance;                  // Ссылка на экземпляр нашего окна
    wndclassex.lpszClassName = class_name;            // Имя нашего класса окна
    wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // Устанавливаем фоновый
                                                                                                      // цвет окна - белый

    RegisterClassEx(&wndclassex);      // Регистрируем класс окна, чтобы вызовы CreateWindow()
                                                      // и CreateWindowEx() знали, какой класс окна использовать
                                                      // при создании окна

    hwnd = CreateWindowEx(NULL,                              // Дополнительные атрибуты окна, NULL - их нет
                                      class_name,                  // Имя, которое мы дали WNDCLASSEX    
                                      "Keyboard",                  // Текст заголовка окна
                                      WS_OVERLAPPEDWINDOW,      // Стиль окна
                                      CW_USEDEFAULT,            // x левого верхнего угла окна (по умолчанию)
                                      CW_USEDEFAULT,            // y левого верхнего угла окна (по умолчанию)
                                      WIN_WIDTH,                  // Ширина окна в пикселях
                                      WIN_HEIGHT,                  // Высота окна в пикселях
                                      NULL,                              // Ссылка на "родительское окно" (у нас его нет) 
                                      NULL,                              // Ссылка на меню (у нас его нет)
                                      hinstance,                  // Ссылка на экземпляр окна (передается WinMain())
                                      NULL);                        // "Дополнительная информация" для передачи 
                                                                        // в WinProc (у нас ее нет)

            // Проверка ошибок
            if(!hwnd)
                  return EXIT_FAILURE; // Случилось что-то плохое!


    ShowWindow(hwnd, ishow); // Показать окно (сделать его видимым)
    UpdateWindow(hwnd);             // Обновить окно (нарисовать его)
                                          
    while(1)
      {
            // Получаем сообщения, если они есть
            if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                  if(msg.message == WM_QUIT)
                        break;
                        
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
            }
            else
            {
                  // Здесь проводим все сложные вычисления :)
            }
      }


      // Освободить память, выделенную для нашего WNDCLASSEX
      UnregisterClass(class_name,hinstance);

            return msg.wParam; // Выход из программы
}


// Оконная процедура
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
      PAINTSTRUCT ps;

    // В зависимости от сообщения, мы делаем различные действия.
    switch(message)
    {
            /*      Это сообщение, в котором все и происходит. Сообщение WM_CHAR
                  посылается каждый раз, когда функцией TranslateMessage() 
                  передается сообщение WM_KEYDOWN. Что это значит? Посмотрите,
                  как в WinMain() мы вызываем функцию TranslateMessage(&msg).
                  Для того, чтобы получать сообщение WM_CHAR, у вас должен быть
                  подобный вызов в WinMain().            */
            case WM_CHAR:
            {
                  /*      Во-первых, что такое TCHAR?
                        В основном, TCHAR == char (обычный C/C++ char)
                        Для UNICODE это вообще-то равно кое-чему еще, но
                        в любом случае вы можете думать об этом, как о старом
                        добром char.
                  
                        Для сообщения WM_CHAR, WPARAM означает код символа, который
                        был нажат. Мы можете думать о WPARAM как о ASCII представлении
                        клавиши, которая была нажата.                  */
                                    
                  TCHAR tchar = (TCHAR)wparam; // Определить, какая нажата клавиша.

                  // А теперь проверим, является ли клавиша 'R', 'G' или 'B'.

                  // Обратите внимание, что мы проверяем и верхний и нижний
                  // регистр, чтобы не пропустить ни один случай.

                  if(tchar == 'r' || tchar == 'R')
                        PrintColoredText(hwnd,"RED",255,0,0);

                  else if(tchar == 'g' || tchar == 'G')
                        PrintColoredText(hwnd,"GREEN",0,255,0);

                  else if(tchar == 'b' || tchar == 'B')
                        PrintColoredText(hwnd,"BLUE",0,0,255);

                  return 0;
            
            }

            case WM_PAINT:

                  BeginPaint(hwnd,&ps);
                  EndPaint(hwnd,&ps);
                        return 0;
      
        case WM_DESTROY:
            case WM_CLOSE:
            
                  PostQuitMessage(0);
             return 0;

    } // конец switch(message)

    return DefWindowProc(hwnd, message, wparam, lparam);
}


void PrintColoredText(HWND hwnd, char *text, uchar red, uchar green, uchar blue)
{
      // Проверка ошибок
      if(!text)
            return; // Если "text" недействителен, выходим из функции

      HDC hdc = GetDC(hwnd); // Получаем контекст устройства окна

            // Проверка ошибок
            if(!hdc)
                  return; // Не можем рисовать без HDC, выходим из функции

      RECT rect;
      GetClientRect(hwnd, &rect); // Получаем RECT клиент-области окна

      // Сбрасываем клиент-область окна в белый цвет
      FillRect(hdc, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));

      // Эта функция делает то, что вы и ожидаете, она устанавливает
      // цвет текста для определенного контекста устройства в
      // передаваемые значения RGB цвета.
      SetTextColor(hdc,RGB(red,green,blue));

      /*      Эта функция печатает текст в окне. Рассмотрим ее по параметрам:
            
            hdc - контекст устройства где нужно рисовать (в нашем случае
            hdc == "наше окно").
            TEXT_X - координата Х, откуда начинать рисовать текст
            TEXT_Y - координата Y, откуда начинать рисовать текст
            text - char* (Windows определяет эту переменную как LPCSTR,
            но на самом деле это то же, что и char*), который содержит
            отображаемую строку
            strlen(text) - число символов в строке
            
      */

      TextOut(hdc,TEXT_X,TEXT_Y,text,strlen(text));

      ReleaseDC(hwnd,hdc); // Всегда освобождайте HDC

      /***** 
      
        Замечание:

            В SetTextColor() мы используем макрос RGB()

            RGB() это Win32 макрос, который делает COLORREF. COLORREF это
            32-битное значение, определяющее RGB цвет. Вот так COLORREF
            выглядит в шестнадцатиричном виде:

            0x00bbggrr 

            Где bb - синий компонент, gg - зеленый компонент, и rr - красный
            компонент, каждый из который может иметь беззнаковое значение
            между 0 - 255

      *****/
}

/*
      Подробнее о WM_CHAR ---

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

      Это BIT значения 32-битного LPARAM.

      0 - 15      Определяет количество повторений текущего сообщения.
                  Значение равно количеству автоповторений в результате удерживания клавиши.
                  
      16 - 23      Определяет скан-код. Значение зависит от оборудования.
                  
         24      Определяет, является ли клавиша расширенной, такой какими являются правый alt
                  и ctrl на расширенной клавиатуре 101-key или 102-key. Значение равно 1 
                  если клавиша расширенная, или 0 в другом случае.
                                    
      25 - 28 Зарезервировано

         29      Код контекста. Значение равно 1, если при нажатии была нажата клавиша alt,
                  и 0 в другом случае
                  
         30      Предыдущее состояние клавиши. Значение равно 1, если перед отправкой
                  сообщения клавиша была нажата, и 0, если отпущена.
                  
         31      Состояние клавиши. Значение равно 1, если клавиша отпускается, и
                  0, если клавиша нажимается.

*/

/*
|  TheTutor                   
|  thetutor@gametutorials.com  
|  © 2000-2002 GameTutorials   
*/

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

Скачать обучалку (Visual C++ 6)

Цветной текст | Все обучалки раздела | Ввод с клавиатуры часть 2

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

сварка форум, сварочные аппараты форум , Каталог предложений, сварочный трансформатор разделительный , Гостей рядом с метро ждут гостиницы москвы, карта метро в сети, позвоните.