FreeBASIC в России

   

 Главная   Исходники   Русскоязычный форум   Полезные файлы   Пользователи   Поиск

 

 FB Wiki   Уроки   Скачать FreeBASIC   Проекты   Ссылки   Загрузить   Каталог ссылок

 
 

 Замечания и предложения по работе сайта оставляйте здесь.

Сейчас на сайте:

Вы вошли как: Guest   Регистрация   

Логин:     Пароль:     

Создай бесплатно WebMoney кошелёк на своём мобильном всего за 5 минут

 

Делаем dll своими руками

Хэндл окна

Графические средства языка

Точка пересечения отрезков

Окна без рамки

Физика поведения ядра

Win32 API Введение

►Урок 1 Win32 API

►Урок 2 Win32 API

►Урок 3 Win32 API

►Урок 4 Win32 API

►Урок 5 Win32 API

►Урок 6 Win32 API

►Урок 7 Win32 API

►Урок 8 Win32 API

►Урок 9 Win32 API

►Урок 10 Win32 API

►Урок 11 Win32 API

►Урок 12 Win32 API

►Урок 13 Win32 API

►Урок 14 Win32 API

►Урок 15 Win32 API

►Урок 16 Win32 API

►Урок 17 Win32 API

►Урок 18 Win32 API

►Урок 19 Win32 API

►Урок 20 Win32 API

►Урок 21 Win32 API

►Урок 22 Win32 API

►Урок 23 Win32 API

►Урок 24 Win32 API

Ассоциация файлов

Определить OS

Выводит имя компьютера

 

 

 

Win32 API. Урок 6. Клавиатура.

Опытом поделился и оптимизировал под FreeBASIC:   15.01.2011

 

 

Реклама:

Объявления вакансии и резюме: новинки кино 2010. Любые виды услуг по объявлениям.

здесь сухая химчистка салона в интернет

 

Мы изучим, как Windows программа получает сообщения от клавиатуры.

Теория:

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

Хотя на экране может быть сразу несколько окон, только одно из них имеет фокус ввода, и только оно может получать сообщения от клавиатуры. Вы можете отличить окно, которое имеет фокус ввода от окна, которое его не имеет, посмотрев на его title bar - он будет подсвечен, в отличии от других.

В действительности, есть два типа сообщений от клавиатуры, зависящих от того, чем вы считаете клавиатуру. Вы можете считать ее набором кнопок. В этом случае, если вы нажмете кнопку, Windows пошлет сообщение WM_KEYDOWN активному окну, уведомляя о нажатии клавиши. Когда вы отпустите клавишу, Windows пошлет сообщение WM_KEYUP. Вы думаете о клавише как о кнопке. Другой взгляд на клавиатуру предполагает, что это устройство ввода символов. Тогда, Windows шлет сообщения WM_KEYDOWN или WM_KEYUP окну, в котором есть фокус ввода, и эти сообщения будут транслированы в сообщение WM_CHAR функцией TranslateMessage. Процедура окна может обрабатывать все три сообщения или только то, в котором оно заинтересованно. Большую часть времени вы можете игнорировать WM_KEYDOWN и WM_KEYUP, так как вызов функции TranslateMessage в цикле обработки сообщений транслирует сообщения WM_KEYDOWN и WM_KEYUP в WM_CHAR. Мы будем опираться именно на это сообщение в данном Уроке.

Пример:

Скопировать данный код в буфер обмена

Анализ:

dim shared char as WPARAM = &h20 ' символ, который программа получает от клавиатуры.
Это переменная, в которой будет сохраняться символ, получаемый от клавиатуры. Так как символ шлется в WPARAM процедуры окна, мы для простоты определяем эту переменную как обладающую типом WPARAM. Начальное значение - &h20 или "пробел", так как когда наше окно обновляет свою клиентскую область в первое время, символ еще не введен, поэтому мы делаем так, чтобы отображался пробел.

case WM_CHAR ' если получено сообщение WM_CHAR
char=wParam ' копируем символ из wParam в нашу переменную char
InvalidateRect(hWnd,NULL,TRUE) ' вынудить Windows послать сообщение WM_PAINT

Это было добавлено в процедуру окна для обработки сообщения WM_CHAR. Она всего лишь помещает символ в переменную char и затем вызывает InvalidateRect, что вынуждает Windows послать сообщение WM_PAINT процедуре окна. Синтаксис этой функции следующий:

function InvalidateRect _
(byval hWnd as HWND, _
byval lpRect as LPCRECT, _
byval bErase as BOOL) as BOOL

hWnd- хэндл окна
• lpRect - указатель на прямоугольник в клиентской области, который мы хотим объявить требующим перерисовки. Если этот параметр равен NULL'у, тогда вся клиентская область объявляется такой.
bErase - флаг, говорящий Windows, нужно ли уничтожать бэкграунд. Если он равен TRUE, тогда она делает это при вызове функции BeginPaint.

• Таким образом, мы будем использовать следующую стратегию: мы сохраним всю необходимую информацию, относящуюся к отрисовке клиентской области и генерирующую сообщение WM_PAINT, чтобы перерисовать ее. Конечно, код в секции WM_PAINT должен знать заранее, что от него ожидают. Это кажется обходным путем делать дела, но это путь Windows.
• На самом деле, мы можем отрисовать клиентскую область в ходе обработки сообщения WM_CHAR, между вызовами функций GetDC и ReleaseDC. Нет никаких проблем с этим. Но вся забава начнется, когда приложению понадобится перерисовать клиентскую область. Так как код, рисующий символ находится в секции WM_CHAR, программа не сможет перерисовать символ в клиентской части. Поэтому помещайте все необходимые данные и код, отвечающий за рисование в WM_PAINT. Вы можете послать это сообщение из любого места вашего кода, где вам нужно перерисовать клиентскую область.

TextOut(hdc,0,0,cPtr(LPCSTR,@char),1)

Когда InvalidateRect вызванна, она шлет сообщение WM_PAINT обратно процедуре окна, поэтому вызывается код в секции WM_PAINT. Он вызывает BeginPaint, чтобы
получить хэндл контекста устройства, и затем вызывает TextOut, рисующая наш символ в клиентской области в x=0, y=0. Когда вы запускаете программу и нажимаете любую клавишу, вы увидите, что символьное эхо в верхнем левом углу клиентского окна. И когда окно минимизируется и максимизируется, символ все равно там, так как все код и все данные, необходимые для перерисовки располагаются в секции WM_PAINT.

[C] Iczelion, пер. Aquila.

 

 

Прокомментировать

Ваше имя:  

Ваш e-mail:  

Сообщение:



Введите код: 

 

 

   Спасибо можно сказать, посетив любую ссылку:

 

 

© 2010-2012

DEPOzit (Попов Денис Владимирович)

WebMoney кошелёк: WMID#302963000004

ICQ:279786014 или R549103331586   Z116647355686