- •Лекции 4- 5
- •Элементы
- •Основные стандартные
- •Создание
- •Кнопки – класс “button”
- •BS_LEFTTEXT
- •Кнопки могут находиться в двух состояниях: нажатом и отжатом. Для управления этими состояниями
- •Кнопки стилей BS_3STATE, BS_CHECKBOX, BS_RADIOBUTTON не перерисовываются при их переключении. Для выполнения этого
- •Статический элемент
- •SS_BLACKFRAME
- •Редактор текста –
- •ES_AUTOHSCROLL
- •Сообщения для редактора текста
- •Младшее слово wParam – идентификатор.
- •Пример
- •Функции StrToInt и IntToStr() для перевода строки в целое число и обратно.
- •LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
- •case WM_COMMAND:
- •Пример работы программы
- •Списки строк –
- •Список со стиле LBS_NOTIFY посылает в окно сообщение MW_COMMAND. При этом младшее слово
- •Сообщения для списка строк
- •Сообщения для списка строк
- •Пример
- •int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {
- •//Функция InitApp
- •LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- •case WM_COMMAND:
- •// Когда главное окно приложения получает фокус ввода, отдаем фокус списку case WM_SETFOCUS:
- •http://www.frolov-lib.ru/books/bsp/v12/ch2_5.htm
- •Комбинированный
- •Сообщения от комбинированного списка
- •Сообщения для комбинированного списка
- •Сообщения для комбинированного списка
- •Пример
- •int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
- •BOOL InitApp(HINSTANCE hInstance)
- •LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- •case WM_COMMAND:
- •case WM_SETFOCUS:
- •http://www.frolov-lib.ru/books/bsp/v12/ch2_6.htm
- •Следующая
Редактор текста –
класс “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;
}