Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).

Объявим в разделе глобальных переменных строчку, содержащую нажатый знак:

key: string;{содержит нажатый символ}

Функция обработки сообщений воспримет вид:

function WindowProc (Window : HWnd; Message, WParam : LongInt; LParam : LongInt) : LongInt; stdcall;

Var

dc : HDC;

MyPaint : TPaintStruct;

Brush : hBrush;

Pen : hPen;

Begin

WindowProc := 0;

Case Message of

wm_Destroy :

Begin

PostQuitMessage (0);

Exit;

end;

wm_Paint:

Begin

dc := BeginPaint Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). (Window, MyPaint);

Brush := CreateSolidBrush (RGB (colorR, colorG, colorB));

Pen := CreatePen (PS_SOLID, 1, RGB (colorR, colorG, colorB));

SelectObject (dc, Brush);

SelectObject (dc, Pen);

Rectangle(dc,0,0,maxx_size,maxy_size);

TextOut(dc,0,0,pchar(sWidth),Length(sWidth));{вывод ширины окна}

TextOut(dc,0,15,pchar(sHeight),Length(sHeight));{вывод высоты окна}

TextOut(dc,0,30,pchar(key Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).),Length(key));{вывод нажатого символа}

DeleteObject (Pen);

DeleteObject (Brush);

EndPaint (Window, MyPaint);

ReleaseDC (Window, dc);

end;

WM_CLOSE:

Begin

{вывод на экран запроса}

If MessageDlg('Окончить приложение?', mtConfirmation,MbOkCancel,0) idOK then

exit;{если Ok, то выход}

end;

WM_CREATE:

Begin

randomize;//инициалицация ГСЧ

colorR := random(256);//

colorG := random(256);//задание цвета фона

colorB := random Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).(256);//

end;

WM_SIZE:

Begin

GetWindowRect(Window, Rectangl);{получение прямоугольника, описывающего форму}

{создание записей с размерами окна}

sWidth := 'width: ' + IntToStr(Rectangl.Right - Rectangl.Left);

sHeight := 'height: ' + IntToStr(Rectangl.Bottom - Rectangl.Top);

end;

WM_CHAR:

Begin

key := 'key: ' + Chr(wParam);

InvalidateRect(Window, nil, False);//перерисовка окна

end;

end;

WindowProc := DefWindowProc (Window, Message, WParam, LParam);

end Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).;

Сейчас при нажатии на какую или кнопку эта клафиша отображается на форме.

рис.7 Итог работы программки

Видоизмените свое приложение, так, чтоб при нажатии на форме левой кнопки мыши рисовался эллипс красноватого цвета, а при нажатии правой кнопки он исчезал.

Добавим в программку глобальные константы и переменную:

Const

x1 = 100;//

y1 = 100;//координаты, по Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). которым строится эллипс

x2 = 600;//

y2 = 300;//

Var

construct: boolean;{ключ, для построения эллипса}

Перепишем функцию обработки сообщений:

function WindowProc (Window : HWnd; Message, WParam : LongInt; LParam : LongInt) : LongInt; stdcall;

Var

dc : HDC;

MyPaint : TPaintStruct;

Brush : hBrush;

Pen : hPen;

Begin

WindowProc := 0;

Case Message of

wm_Destroy :

Begin

PostQuitMessage (0);

Exit;

end;

wm_Paint:

Begin

dc := BeginPaint (Window, MyPaint);

Brush := CreateSolidBrush Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). (RGB (colorR, colorG, colorB));

Pen := CreatePen (PS_SOLID, 1, RGB (colorR, colorG, colorB));

SelectObject (dc, Brush);

SelectObject (dc, Pen);

Rectangle(dc,0,0,maxx_size,maxy_size);

TextOut(dc,0,0,pchar(sWidth),Length(sWidth));{вывод ширины окна}

TextOut(dc,0,15,pchar(sHeight),Length(sHeight));{вывод высоты окна}

TextOut(dc,0,30,pchar(key),Length(key));{вывод нажатого символа Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).}

if construct then{рисование эллипса(при установленном ключе)}

Begin

Brush := CreateSolidBrush (RGB (255, 0, 0));

Pen := CreatePen (PS_SOLID, 1, RGB (255, 0, 0));

SelectObject (dc, Brush);

SelectObject (dc, Pen);

Ellipse (dc, x1, y1, x2, y2);

end;

DeleteObject (Pen);

DeleteObject (Brush);

EndPaint (Window, MyPaint);

ReleaseDC (Window, dc);

end;

WM_CLOSE:

Begin

{вывод на экран запроса}

If Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). MessageDlg('Окончить приложение?', mtConfirmation,MbOkCancel,0) idOK then

exit;{если Ok, то выход}

end;

WM_CREATE:

Begin

randomize;//инициалицация ГСЧ

colorR := random(256);//

colorG := random(256);//задание цвета фона

colorB := random(256);//

construct := false;//установка ключа при разработке окна

end;

WM_SIZE:

Begin

GetWindowRect(Window, Rectangl);{получение прямоугольника, описывающего форму}

{создание записей с размерами окна}

sWidth := 'width: ' + IntToStr(Rectangl.Right - Rectangl.Left Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).);

sHeight := 'height: ' + IntToStr(Rectangl.Bottom - Rectangl.Top);

end;

WM_CHAR:

Begin

key := 'key: ' + Chr(wParam);

InvalidateRect(Window, nil, False);//перерисовка окна

end;

WM_LBUTTONDOWN://сообщение нажатия ЛКМ

Begin

construct := true;//включение ключа

InvalidateRect(Window, nil, False);//перерисовка окна

end;

WM_RBUTTONDOWN://сообщение нажатия ПКМ

Begin

construct := false;//выключение ключа

InvalidateRect(Window, nil, False);//перерисовка окна

end;

end;

WindowProc := DefWindowProc Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). (Window, Message, WParam, LParam);

end;

После пуска программки на выполнения и нажатия левой кнопки мыши на форме возникает эллипс:

рис.8 Итог работы программки

После нажатия правой кнопкой мыши эллипс теряется:

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

program TestMessages;

Uses

Windows, Messages, Dialogs, Sysutils;

Const

AppName = 'Test';

maxx_size = 800;

maxy_size = 600;

Var

Window: HWnd;{Ссылка на окно, позволяет совершенно точно найти каждое окно}

Message: TMsg;{Сообщение – реакция ядра Windows на какое Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).-либо событие}

WindowClass: TWndClass; {Структура класса окна, включает адресок оконной функции, обрабатывающей поступающие от Windows сообщения, атрибуты всех окон, принадлежащих этому классу, т.е. задаются главные характеристики класса}

colorR, colorG, colorB: integer;{переменные цвета для формы}

Rectangl: TRect; {прямоугольник, хранящий данные о параметрах окна}

width, height: integer;{высота и ширина формы}

sWidth, sHeight Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).: string;{строки с размерами, выводящиеся на форму}

key: string;{содержит нажатый символ}

construct: boolean;{ключ, для построения эллипса}

driving: boolean;{ключ для конфигурации размеров эллипса}

move: boolean;{ключ переноса}

startX, startY, newX, newY: integer;{координаты построения эллипса}

x1, y1: integer;{координаты до действия перемещения}

dx, dy: integer;{приращение координат}

point Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).: TPoint;{координаты кусора относительно формы}

{Специальная оконная функция, обрабатывающая сообщения, посылаемые окну. Вызывается конкретно ядром Windows (косвенно-вызываемая – callback function). Характеристики эквивалентны полям структуры типа TMsg}

function WindowProc (Window : HWnd; Message, WParam : LongInt; LParam : LongInt) : LongInt; stdcall;

Var

dc : HDC;

MyPaint : TPaintStruct;

Brush : hBrush;

Pen : hPen;

x Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR)., y: real;{для новейшей системы координат}

a, b: real;{полуоси эллипса}

shot: boolean;{ключ попадания курсором в эллипс}

Begin

WindowProc := 0;

Case Message of

wm_Destroy :

Begin

PostQuitMessage (0);

Exit;

end;

wm_Paint:

Begin

dc := BeginPaint (Window, MyPaint);

Brush := CreateSolidBrush (RGB (colorR, colorG, colorB));

Pen := CreatePen (PS_SOLID, 1, RGB (colorR, colorG, colorB));

SelectObject (dc, Brush);

SelectObject (dc Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR)., Pen);

Rectangle(dc,0,0,width,height);

TextOut(dc,0,0,pchar(sWidth),Length(sWidth));{вывод ширины окна}

TextOut(dc,0,15,pchar(sHeight),Length(sHeight));{вывод высоты окна}

TextOut(dc,0,30,pchar(key),Length(key));{вывод нажатого символа}

if construct then{рисование эллипса(при установленном ключе)}

Begin

Brush := CreateSolidBrush (RGB (255, 0, 0));

Pen := CreatePen (PS_SOLID, 1, RGB (255, 0, 0));

SelectObject (dc Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR)., Brush);

SelectObject (dc, Pen);

Ellipse (dc, startX, startY, newX, newY);

end;

DeleteObject (Pen);

DeleteObject (Brush);

EndPaint (Window, MyPaint);

ReleaseDC (Window, dc);

end;

WM_CLOSE:

Begin

{вывод на экран запроса}

If MessageDlg('Окончить приложение?', mtConfirmation,MbOkCancel,0) idOK then

exit;{если Ok, то выход}

end;

WM_CREATE:

Begin

randomize;//инициализация ГСЧ

colorR := random(256);//

colorG := random Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).(256);//задание цвета фона

colorB := random(256);//

width := maxx_size;//исходная ширина

height := maxy_size;//исходная высота

driving := false;//установка ключа конфигурации

construct := false;//установка ключа рисования

move := false;//установка ключа переноса

end;

WM_SIZE:

Begin

GetWindowRect(Window, Rectangl);{получение прямоугольника, описывающего форму}

{создание записей с размерами окна}

width := Rectangl.Right - Rectangl.Left;

height := Rectangl.Bottom - Rectangl.Top;

sWidth Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). := 'width: ' + IntToStr(width);

sHeight := 'height: ' + IntToStr(height);

end;

WM_CHAR:

Begin

key := 'key: ' + Chr(wParam);

InvalidateRect(Window, nil, False);//перерисовка окна

end;

WM_MOUSEMOVE:

Begin

x1 := point.x;//положение курсора до действия его перемещения

y1 := point.y;//

GetCursorPos(point);//получение координат относительно экрана

ScreenToClient(Window, point);//получение координат относительно формы

if driving then //если ЛКМ Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). нажата но не отпущена

begin

newX := point.x;

newY := point.y;

InvalidateRect(Window, nil, False);//перерисовка

end;

if move then//если левая кнопка нажата, а правая еще как бы нет

Begin

dx := point.x - x1;//приращение Х

dy := point.y - y1;//приращение У

startX := startX + dx;//

startY := startY + dy;//изменение координат,

newX := newX + dx;//по котором Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). строится эллипс

newY := newY + dy;//

InvalidateRect(Window, nil, False);//перерисовка

end;

end;

WM_LBUTTONDOWN://нажатие ЛКМ

Begin

If construct then

Begin

a := Абс((newX - startX)/ 2);//вычисление полуосей эллипса

b := Абс((newY - startY)/ 2);//

//ввод новейшей системы координат

if newX >= startX then x := newX - a else x := startX - a;

if newY >= startY then y := newY - b else y := startY - b;

//проверка Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). на попадание курсора в эллипс

shot := sqr(point.x - x)/sqr(a) + sqr(point.y - y)/sqr(b) <= 1;

if shot then move := true//если попали, то разрешается перетаскивание

End

else begin//если ЛКМ зажата 1-ый раз после нажатия ПКМ

construct := true;//ключ рисования включен

driving := true;//ключ конфигурации включен

startX := point.x;//исходные координаты эллипса

startY := point.y;//

newX Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR). := point.x;//новые координаты (следствие перемещения курсора)

newY := point.y;//

end;

end;

WM_LBUTTONUP://отпускание ЛКМ

Begin

driving := false; //ключ конфигурации выключен

move := false; //отмена разрешения на перенос

end;

WM_RBUTTONDOWN://нажатие ПКМ

Begin

construct := false;//ключ рисования выключен

InvalidateRect(Window, nil, False);//перерисовка (без овала)

end;

end;

WindowProc := DefWindowProc (Window, Message, WParam, LParam Выведите на форму (TextOut), текущий нажатый символ на клавиатуре (сообщение WM_CHAR).);

end;

{Точка входа в программку, которая получает управление от ядра Windows:}

Begin

{Всем полям структуры присваиваются определённые значения (определяются атрибуты окна)}


vistupaet-s-dokladami-po-etoj-tematike-na-vsesoyuznih-i-mezhdunarodnih-konferenciyah-8-glava.html
vistupaya-na-torzhestvennoj-ceremonii-chestvovaniya-pobeditelej-hhh-letnih-olimpijskih-igr-prezident-respubliki-kazahstan-nanazarbaev-ukazal-chto-u-olimpijskogo-triumfa-kazahstana-est-svoi-istochniki.html
vistupleni-e-predstavitelya-rossijskoj-federacii-v-vi-komitete-67-j-sessii-generalnoj-assamblei-po-punktu-povestki-dnya-verhovenstvo-prava-na-nacionalnom-i-mezhdunarodnom-urovnyah.html