На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Processing Keyboard Input



The following example demonstrates how to use a caret in a simple text editor. The example updates the caret position as the user types printable characters and uses various keys to move through the client area.

#define TEXTMATRIX(x, y) *(pTextMatrix + (y * nWindowCharsX) + x)

// Global variables.

HINSTANCE hinst; // current instance
HBITMAP hCaret; // caret bitmap
HDC hdc; // device context
PAINTSTRUCT ps; // client area paint info
static char *pTextMatrix = NULL; // points to text matrix
static int nCharX, // width of char. in logical units
nCharY, // height of char. in logical units
nWindowX, // width of client area

nWindowY, // height of client area
nWindowCharsX, // width of client area
nWindowCharsY, // height of client area
nCaretPosX, // x-position of caret
nCaretPosY; // y-position of caret
static UINT uOldBlink; // previous blink rate
int x, y; // x and y coordinates to use in text matrix
TEXTMETRIC tm; // font information

LONG APIENTRY MainWndProc(
HWND hwnd, // window handle

UINT message, // type of message
UINT wParam, // additional information
LONG lParam) // additional information
{

switch (message)
{
case WM_CREATE:
// Select a fixed-width system font, and get its text metrics.

hdc = GetDC(hwnd);
SelectObject(hdc,
GetStockObject(SYSTEM_FIXED_FONT));
GetTextMetrics(hdc, &tm);
ReleaseDC(hwnd, hdc);


// Save the avg. width and height of characters.

nCharX = tm.tmAveCharWidth;
nCharY = tm.tmHeight;

return 0;

case WM_SIZE:
// Determine the width of the client area, in pixels
// and in number of characters.

nWindowX = LOWORD(lParam);
nWindowCharsX = max(1, nWindowX/nCharX);

// Determine the height of the client area, in
// pixels and in number of characters.


nWindowY = HIWORD(lParam);
nWindowCharsY = max(1, nWindowY/nCharY);

// Clear the buffer that holds the text input.

if (pTextMatrix != NULL)
free(pTextMatrix);

// If there is enough memory, allocate space for the
// text input buffer.

pTextMatrix = malloc(nWindowCharsX * nWindowCharsY);

if (pTextMatrix == NULL)
ErrorHandler("Not enough memory.");

else
for (y = 0; y < nWindowCharsY; y++)
for (x = 0; x < nWindowCharsX; x++)
TEXTMATRIX(x, y) = ' ';

// Move the caret to the origin.

SetCaretPos(0, 0);

return 0;

case WM_KEYDOWN:
switch (wParam)
{
case VK_HOME: // Home
nCaretPosX = 0;
break;


case VK_END: // End
nCaretPosX = nWindowCharsX - 1;
break;

case VK_PRIOR: // Page Up
nCaretPosY = 0;
break;

case VK_NEXT: // Page Down
nCaretPosY = nWindowCharsY -1;
break;

case VK_LEFT: // Left arrow
nCaretPosX = max(nCaretPosX - 1, 0);

break;

case VK_RIGHT: // Right arrow
nCaretPosX = min(nCaretPosX + 1,
nWindowCharsX - 1);
break;

case VK_UP: // Up arrow
nCaretPosY = max(nCaretPosY - 1, 0);
break;

case VK_DOWN: // Down arrow
nCaretPosY = min(nCaretPosY + 1,
nWindowCharsY - 1);

break;

case VK_DELETE: // Delete

// Move all the characters that followed the
// deleted character (on the same line) one
// space back (to the left) in the matrix.

for (x = nCaretPosX; x < nWindowCharsX; x++)
TEXTMATRIX(x, nCaretPosY) =
TEXTMATRIX(x + 1, nCaretPosY);

// Replace the last character on the

// line with a space.

TEXTMATRIX(nWindowCharsX - 1,
nCaretPosY) = ' ';

// The application will draw outside the
// WM_PAINT message processing, so hide the caret.

HideCaret(hwnd);

// Redraw the line, adjusted for the
// deleted character.

hdc = GetDC(hwnd);
SelectObject(hdc,

GetStockObject(SYSTEM_FIXED_FONT));

TextOut(hdc, nCaretPosX * nCharX,
nCaretPosY * nCharY,
&TEXTMATRIX(nCaretPosX, nCaretPosY),
nWindowCharsX - nCaretPosX);

ReleaseDC(hwnd, hdc);

// Display the caret.

ShowCaret(hwnd);

break;
}

// Adjust the caret position based on the

// virtual-key processing.

SetCaretPos(nCaretPosX * nCharX,
nCaretPosY * nCharY);

return 0;

case WM_CHAR:
switch (wParam)
{
case 0x08: // Backspace
// Move the caret back one space, and then
// process this like the DEL key.

if (nCaretPosX > 0)
{
nCaretPosX--;

SendMessage(hwnd, WM_KEYDOWN,
VK_DELETE, 1L);
}
break;

case 0x09: // Tab
// Tab stops exist every four spaces, so add
// spaces until the user hits the next tab.

do
{
SendMessage(hwnd, WM_CHAR, ' ', 1L);
} while (nCaretPosX % 4 != 0);

break;

case 0x0D: // Carriage return
// Go to the beginning of the next line.
// The bottom line wraps around to the top.

nCaretPosX = 0;

if (++nCaretPosY == nWindowCharsY)
nCaretPosY = 0;
break;

case 0x1B: // Escape
case 0x0A: // Linefeed

MessageBeep((UINT) -1);
break;

default:
// Add the character to the text buffer.

TEXTMATRIX(nCaretPosX, nCaretPosY) =
(char) wParam;

// The application will draw outside the
// WM_PAINT message processing, so hide the caret.

HideCaret(hwnd);

// Draw the character on the screen.


hdc = GetDC(hwnd);
SelectObject(hdc,
GetStockObject(SYSTEM_FIXED_FONT));

TextOut(hdc, nCaretPosX * nCharX,
nCaretPosY * nCharY,
&TEXTMATRIX(nCaretPosX, nCaretPosY), 1);

ReleaseDC(hwnd, hdc);

// Display the caret.

ShowCaret(hwnd);

// Prepare to wrap around if you reached the

// end of the line.

if (++nCaretPosX == nWindowCharsX)
{
nCaretPosX = 0;
if (++nCaretPosY == nWindowCharsY)
nCaretPosY = 0;
}
break;
}

// Adjust the caret position based on the
// character processing.

SetCaretPos(nCaretPosX * nCharX,

nCaretPosY * nCharY);

return 0;

case WM_PAINT:
// Draw all the characters in the buffer, line by line.

hdc = BeginPaint(hwnd, &ps);

SelectObject(hdc,
GetStockObject(SYSTEM_FIXED_FONT));

for (y = 0; y < nWindowCharsY; y++)
TextOut(hdc, 0, y * nCharY, &TEXTMATRIX(0, y),
nWindowCharsX);

EndPaint(hwnd, &ps);


case WM_SETFOCUS:
// The window has the input focus. Load the
// application-defined caret resource.

hCaret = LoadBitmap(hinst, MAKEINTRESOURCE(120));

// Create the caret.

CreateCaret(hwnd, hCaret, 0, 0);

// Adjust the caret position.

SetCaretPos(nCaretPosX * nCharX,
nCaretPosY * nCharY);

// Display the caret.

ShowCaret(hwnd);


break;

case WM_KILLFOCUS:
// The window is losing the input focus,
// so destroy the caret.

DestroyCaret();

break;

default:
return DefWindowProc(hwnd, message, wParam, lParam);

}

return NULL;
}



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

Обработка Ввода Данных с клавиатуры



Следующий пример демонстрирует как, чтобы использовать символ ^ в простом текстовом редакторе. Пример корректирует символ ^ позиции как потребителя набирает выводимые символы и использует различные ключи, чтобы перемещаться по области клиента.

#define TEXTMATRIX(x, y) *(pTextMatrix + (y * nWindowCharsX) + x)

// Глобальные переменные.

HINSTANCE hinst; // текущий пример HBITMAP hCaret; // побитовое отображение символа ^ HDC hdc; // контекст устройства PAINTSTRUCT ps; // краска области инфо статического символа клиента *pTextMatrix = НЕДЕЙСТВИТЕЛЬНЫЙ; // точки на текстовую матричную статическую int nCharX, // ширину char. на логических устройствах nCharY, // высоте char. на логических устройствах nWindowX, // ширине области клиента

nWindowY, // ВЫСОТА области клиента nWindowCharsX, // ширина области клиента nWindowCharsY, // высота области клиента nCaretPosX, // x-position символа ^ nCaretPosY; // y-position символа ^ статического UINT uOldBlink; // предшествующий показатель мигания int x, y; // x и y координаты, чтобы использоваться в текстовом tm матрицы TEXTMETRIC; // шрифтовая информация

ДОЛГО (ДЛИНОЙ) APIENTRY MainWndProc( HWND hwnd, // ручка окна

СООБЩЕНИЕ UINT, // тип сообщения UINT wParam, // дополнительной информации ДОЛГО (ДЛИНОЙ) lParam) // дополнительная информация
{

ключ (сообщение)
{
случай WM_CREATE:
// Выбор фиксированный-широтный системный шрифт и получает свою текстовую метрику.

hdc = GetDC(hwnd);
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
GetTextMetrics(hdc, &tm);
ReleaseDC(hwnd, hdc);


// Сохраните avg. ширину и высоту символов.

nCharX = tm.tmAveCharWidth;
nCharY = tm.tmHeight;

возврат 0;

случай WM_SIZE:
// Определите ширину области клиента, на пикселях // и в количестве символов.

nWindowX = LOWORD(lParam);
nWindowCharsX = max(1, nWindowX/nCharX);

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


nWindowY = HIWORD(lParam);
nWindowCharsY = max(1, nWindowY/nCharY);

// Очистка буфер, который держит текстовый ввод.

если (pTextMatrix != НЕДЕЙСТВИТЕЛЬНЫЙ) свободный(pTextMatrix);

// Если есть достаточно памяти, распределите пространство для // текстового входного буфера.

pTextMatrix = malloc(nWindowCharsX * nWindowCharsY);

если (pTextMatrix == НЕДЕЙСТВИТЕЛЬНЫЙ) ErrorHandler("Not достаточно памяти.");

еще
для (y = 0; y < nWindowCharsY; y++) для (x = 0; x < nWindowCharsX; x++) TEXTMATRIX(x, y) = ' ';

// Переместите символ ^ на начало.

SetCaretPos(0, 0);

возврат 0;

случай WM_KEYDOWN: ключ (wParam)
{
случай VK_HOME: // Home nCaretPosX = 0;
прерывание;


случай VK_END: // Конец nCaretPosX = nWindowCharsX - 1;
прерывание;

случай VK_PRIOR: // Страница По nCaretPosY = 0;
прерывание;

случай VK_NEXT: // Страница Вниз nCaretPosY = nWindowCharsY -1;
прерывание;

случай VK_LEFT: // Левая стрелка nCaretPosX = max(nCaretPosX - 1, 0);

прерывание;

случай VK_RIGHT: // стрелка Права nCaretPosX = min(nCaretPosX + 1, nWindowCharsX - 1);
прерывание;

случай VK_UP: // По стрелке nCaretPosY = max(nCaretPosY - 1, 0);
прерывание;

случай VK_DOWN: // Вниз стрелка nCaretPosY = min(nCaretPosY + 1, nWindowCharsY - 1);

прерывание;

случай VK_DELETE: // Удаляться

// Перемещение все символы, которые сопровождали // удаленный символ (в ту же строку) один // пространство (налево) в матрице.

для (x = nCaretPosX; x < nWindowCharsX; x++) TEXTMATRIX(x, nCaretPosY) = TEXTMATRIX(x + 1, nCaretPosY);

// Замените последний символ в the

// строка с пространством.

TEXTMATRIX(nWindowCharsX - 1, nCaretPosY) = ' ';

// Приложение сделает за пределами // обработки сообщения WM_PAINT, так что шкура символ ^.

HideCaret(hwnd);

// Обновление изображения линия, с учетом // удаленного символа.

hdc = GetDC(hwnd);
SelectObject(hdc,

GetStockObject(SYSTEM_FIXED_FONT));

TextOut(hdc, nCaretPosX * nCharX, nCaretPosY * nCharY, &TEXTMATRIX(nCaretPosX, nCaretPosY), nWindowCharsX - nCaretPosX);

ReleaseDC(hwnd, hdc);

// Отобразите символ ^.

ShowCaret(hwnd);

прерывание;
}

// Установка символ ^ позиции основывался в the

// виртуальная-ключевая обработка.

SetCaretPos(nCaretPosX * nCharX, nCaretPosY * nCharY);

возврат 0;

случай WM_CHAR: ключ (wParam)
{
случай 0x08: // Возврат // Перемещение символ ^ одно пространство, и затем // процесс это подобно клавише ДЕЛЬ.

если (nCaretPosX > 0)
{
nCaretPosX--;

SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1L);
}
прерывание;

случай 0x09: // Таб. // стоп Таб. существует каждые четыре пробела, так что добавлять // пробелы до всплесков пользователя следующее таб..

сделайте
{
SendMessage(hwnd, WM_CHAR, ' ', 1L);
} пока (nCaretPosX % 4 != 0);

прерывание;

случай 0x0D: // Перевод строки // Ходит в начало следующей строки.
// Нижняя строка сворачивается на верх.

nCaretPosX = 0;

если (++nCaretPosY == nWindowCharsY) nCaretPosY = 0;
прерывание;

случай 0x1B: // случай Перехода 0x0A: // Перевод строки

MessageBeep((UINT) -1);
прерывание;

умолчание:
// Добавьте символ к текстовому буферу.

TEXTMATRIX(nCaretPosX, nCaretPosY) = (СИМВОЛ) wParam;

// Приложение сделает за пределами // обработки сообщения WM_PAINT, так что шкура символ ^.

HideCaret(hwnd);

// Сделайте символом на экране.


hdc = GetDC(hwnd);
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));

TextOut(hdc, nCaretPosX * nCharX, nCaretPosY * nCharY, &TEXTMATRIX(nCaretPosX, nCaretPosY), 1);

ReleaseDC(hwnd, hdc);

// Отобразите символ ^.

ShowCaret(hwnd);

// Приготовьтесь, чтобы сворачиваться если Вы достигли бы the

// конец линии.

если (++nCaretPosX == nWindowCharsX)
{
nCaretPosX = 0;
если (++nCaretPosY == nWindowCharsY) nCaretPosY = 0;
}
прерывание;
}

// Установка символ ^ позиции основывался на // символьной обработке.

SetCaretPos(nCaretPosX * nCharX,

nCaretPosY * nCharY);

возврат 0;

случай WM_PAINT:
// Сделайте всеми символами в буфере, построчно.

hdc = BeginPaint(hwnd, &ps);

SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));

для (y = 0; y < nWindowCharsY; y++) TextOut(hdc, 0, y * nCharY, &TEXTMATRIX(0, y), nWindowCharsX);

EndPaint(hwnd, &ps);


случай WM_SETFOCUS: // окно имеет входной фокус. Загрузите // определенный прикладной символ ^ ресурса.

hCaret = LoadBitmap(hinst, MAKEINTRESOURCE(120));

// Создайте символ ^.

CreateCaret(hwnd, hCaret, 0, 0);

// Установка символ ^ позиции.

SetCaretPos(nCaretPosX * nCharX, nCaretPosY * nCharY);

// Отобразите символ ^.

ShowCaret(hwnd);


прерывание;

случай WM_KILLFOCUS: // окно теряет входной фокус, // так уничтожать символ ^.

DestroyCaret();

прерывание;

умолчание:
возвращайте DefWindowProc(hwnd, сообщение, wParam, lParam);

}

возвращайте НЕДЕЙСТВИТЕЛЬНЫЙ;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz