Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекции 4-5.pptx
Скачиваний:
67
Добавлен:
18.02.2023
Размер:
1.46 Mб
Скачать

Редактор текста –

класс “edit”

На базе класса “edit” создают однострочный или многострочный текстовый редактор. Его можно использовать для ввода текстовых и числовых значений, а также для создания и редактирования текстовых файлов.

Этот редактор также может выполнять функции выделения текста, работать с буфером обмена и многое другое.

ES_AUTOHSCROLL

Автоматически сдвигать текст влево на 10 символов при

 

достижении правой границы редактора

 

 

ES_AUTOVSCROLL

Автоматический сдвиг текста вверх на одну строку при

 

достижении нижнего края редактора

 

 

ES_CENTER

Выравнивание текста по центру

 

 

ES_LEFT

Выравнивание текста по левому краю

 

 

ES_RIGHT

Выравнивание текста по правому краю

 

 

ES_LOWERCASE

Преобразовывать вводимые символы в строчные

 

 

ES_UPPERCASE

Преобразовывать вводимые символы в прописные

 

 

ES_MULTILINE

Разрешить многострочный редактор

 

 

ES_NOHIDESEL

При потере фокуса ввода выделенный фрагмент текста

 

отображать в инверсном цвете

 

 

ES_NUMBER

Разрешить ввод только цифр

 

 

ES_PASSWORD

Отображать «звездочку» для каждого вводимого символа

 

 

ES_READONLY

Запрет редактирования текста в редакторе

 

 

ES_WANTRETURN

При нажатии ENTER переходить на новую строку

 

 

Сообщения для редактора текста

 

EM_GETFIRSTVISIBLELINE

Получение номера самой

Номер строки

wParam=lParam=0

верхней видимой строки

 

EM_GETHANDLE

Получение дескриптора блока

Дескриптор блока

wParam=lParam=0

памяти, хранящего

памяти

 

редактируемый текст

 

EM_GETLINE

Копирование строки из

Количество

wParam – номер строки, lParam –

редактора текста в буфер

символов или 0

адрес буфера

 

 

EM_GETLINECOUNT

Получение количества строк в

Количество строк

wParam=lParam=0

тексте

или 1

EM_GETRECT

Получение координат

 

wParam=0, lParam – адрес RECT

прямоугольной области

 

 

редактора

 

EM_LIMITTEXT

Ограничение количества

 

wParam – макс. длина текста,

символов в окне.

 

lParam = 0

 

 

 

Сообщения для редактора текста

 

EM_SETHANDLE

Установка дескриптора блока памяти для

 

wParam – дескриптор,

хранения редактируемого текста

 

lParam = 0

 

 

EM_SETREADONLY

Установка или сброс режима «только для

TRUE или

wParam – признак

чтения»

FALSE при

(TRUE, FALSE)

 

ошибке

lParam = 0

 

 

EM_SETRECT

Изменение прямоугольника

 

wParam = 0

редактирования текста

 

lParam – адрес нового

 

 

прямоугольника

 

 

Младшее слово wParam – идентификатор.

Старшее слово wParam – код извещения о совершенном действии.

lParam – дескриптор окна редактора текста

 

Сообщения от редактора текста

 

 

EN_CHANGE

Текст в окне редактирования изменился

 

 

EN_ERRSPACE

Недостаточно памяти для выполнения действий

 

 

EN_HSCROLL

Нажата горизонтальная полоса просмотра редактора, но

 

свертка еще не произошла

 

 

EN_KILLFOCUS

Текстовый редактор потерял фокус ввода

 

 

EN_MAXTEXT

Превышен заданный для редактора размер текста

 

 

EN_SETFOCUS

Текстовый редактор получил фокус ввода

 

 

EN_UPDATE

Последняя операция редактирования выполнена, но еще не

 

отразилась на содержимом редактора

 

 

EN_VSCROLL

Нажата вертикальная полоса просмотра редактора, но свертка

 

еще не произошла

 

 

Пример

Найти сумму двух чисел.

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

#include <windows.h>

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

LONG WINAPI WndProc(HWND, UINT, WPARAM, LPARAM); int StrToInt(char *s) {...}

char* IntToStr(int n) {...}

int WINAPI WinMain(HINSTANCE hInstance,

// Стартовая функция

HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

HWND hwnd;

 

MSG msg;

 

WNDCLASS w;

 

memset(&w, 0, sizeof(WNDCLASS));

// очистка памяти для структуры

w.style = CS_HREDRAW | CS_VREDRAW;

 

w.lpfnWndProc = WndProc; w.hInstance = hInstance;

w.hbrBackground = CreateSolidBrush(0x00FFFFFF); w.lpszClassName = "MyClass";

RegisterClass(&w);

hwnd = CreateWindow("MyClass","Сумма двух чисел", WS_OVERLAPPEDWINDOW, 500, 300, 500, 380, NULL, NULL, hInstance, NULL);

ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);

while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg);

}

return msg.wParam;

}

Функции StrToInt и IntToStr() для перевода строки в целое число и обратно.

// Функция преобразования строки в число

int StrToInt(char *s) { int temp= 0; // число int i = 0;

int sign = 0; // знак числа 0- положительное, 1 - отрицательное

if(s[i]=='-') { sign = 1; i++;

}

while(s[i]>=0x30 && s[i]<=0x39) { temp = temp + (s[i] & 0x0F); temp = temp * 10;

i++;

}

temp = temp / 10; if(sign==1)

temp = -temp; return(temp);

}

// Функция преобразования числа в строку char* IntToStr(int n) {

char s[40], t, *temp; int i, k;

int sign = 0;

 

i = 0;

k = n;

 

if(k<0) {

 

 

sign = 1;

k = -k;

}

 

 

do {

 

 

t = k%10;

k = k/10;

s[i] = t | 0x30;

 

i++;

 

 

} while(k>0);

 

if(sign==1) {

 

s[i]='-';

i++;

}

 

 

temp = (char*)malloc(i);

k = 0;

i--;

 

while(i>=0) {

 

temp[k] = s[i];

 

i--; k++;

 

}

 

 

temp[k] = '\0';

return(temp);

}

 

 

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)

{

HDC hdc;

 

HINSTANCE hInst;

 

PAINTSTRUCT ps;

 

static HWND hBtn;

// дескриптор кнопки

static HWND hEdt1, hEdt2; // дескрипторы полей редактирования

static HWND hStat;

// дескриптор статического текста

TCHAR StrA[20];

 

int a, b, sum, Len;

 

switch (Message) { case WM_CREATE:

hInst = ((LPCREATESTRUCT)lparam)->hInstance;

hEdt1 = CreateWindow("edit", "0", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 50, 50, 60, 20, hwnd, 0, hInst, NULL);

ShowWindow(hEdt1, SW_SHOWNORMAL);

hEdt2 = CreateWindow("edit", "0", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 150, 50, 60, 20, hwnd, 0, hInst, NULL);

ShowWindow(hEdt2, SW_SHOWNORMAL);

hBtn = CreateWindow("button", "Рассчитать", WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 100, 120, 30, hwnd, 0, hInst, NULL);

ShowWindow(hBtn, SW_SHOWNORMAL);

hStat = CreateWindow("static", "0",WS_CHILD | WS_VISIBLE, 150, 180, 120, 20, hwnd, 0, hInst, NULL);

ShowWindow(hStat, SW_SHOWNORMAL); break;

case WM_COMMAND:

if (lparam == (LPARAM)hBtn) {

Len = GetWindowText(hEdt1, StrA, 20); a = StrToInt(StrA);

Len = GetWindowText(hEdt2, StrA, 20); b = StrToInt(StrA);

sum = a + b;

SetWindowText(hStat, IntToStr(sum));

}

break;

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

TextOut(hdc, 50, 20, "Введите два числа", 18); TextOut(hdc, 50, 180, "Результат:", 10); EndPaint(hwnd, &ps);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default:

return DefWindowProc(hwnd, Message, wparam, lparam);

}

return 0;

}

Соседние файлы в папке Лекции