Не могу реализовать полноценный ввод данных через поле EDIT
Требуется сделать ввод данных через поле EDIT. Само поле ввода реализовал, остается как-то сохранить набранный в это поле текст. Голову уже "сломал", никак не получается!
Пытался сохранить текст в массив, а потом его же вывести через MessageBox. Выводится пустое окно.
Вот эта тщетная попытка:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
HWND hed;
int len;
TCHAR* buff;
RECT screen_rect;
GetWindowRect(GetDesktopWindow(), &screen_rect); // разрешение экрана
int x1 = screen_rect.right / 2 - 300;
int y1 = screen_rect.bottom / 2 - 75;
switch (message)
{
case WM_CREATE:
hed = CreateWindow(TEXT("edit"), TEXT(""),
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 50, 50, 500, 20,
hWnd, NULL, NULL, NULL);
len = GetWindowTextLength(hed) + 1;
buff = new TCHAR[len];
len = GetWindowText(hed, buff, len);
buff[len] = 0;
MessageBox(hWnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION);
delete[] buff;
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
Ответы (1 шт):
Вы выводите диалоговое окно с текстом EDIT сразу после того, как создали его.
Еще маленькая проблемка у вас в том, что когда вы пишите строчку buff[len] = 0, то вы выходите за пределы массива. Нужно писать buff[len - 1] = 0
Так же сразу скажу, что если вы внутри функции WndProc оставляете переменную hed, то нужно сделать её статичной.
Сохранение текста можно сделать разными способами. Например:
Выводим текст в статическую окно
STATICБудем устанавливать текст
STATICпри изменении текста вEDIT, для этого нужно отлавливать соответственное сообщениеWM_COMMANDНапример вот так:
if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == EDIT_ID) { len = GetWindowTextLength(hed) + 1; buff = new TCHAR[len]; GetWindowText(hed, buff, len); buff[len - 1] = 0; SetWindowText(hStatic, buff); delete[] buff; }А в
MessageBoxможно выводить при нажатии на кнопку, для этого так же нужно отлавливать событие нажатия кнопки.Например так:
else if (LOWORD(wParam) == BUTTON_ID) { len = GetWindowTextLength(hed) + 1; buff = new TCHAR[len]; GetWindowText(hed, buff, len); buff[len - 1] = 0; MessageBox(hWnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION); delete[] buff; }
Вот пример всей функции WndProc:
#define EDIT_ID 1001
#define BUTTON_ID 1002
#define STATIC_ID 1003
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
static HWND hed;
static HWND hBtn;
static HWND hStatic;
int len;
TCHAR* buff;
RECT screen_rect;
GetWindowRect(GetDesktopWindow(), &screen_rect); // разрешение экрана
int x1 = screen_rect.right / 2 - 300;
int y1 = screen_rect.bottom / 2 - 75;
switch (message)
{
case WM_CREATE:
hed = CreateWindow(TEXT("edit"), TEXT(""),
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 0, 50, 80, 20,
hWnd, (HMENU)EDIT_ID, NULL, NULL);
hBtn = CreateWindow(TEXT("Button"), TEXT("Click"), WS_CHILD | WS_VISIBLE | WS_BORDER,
0, 0, 80, 20, hWnd, (HMENU)BUTTON_ID, NULL, NULL);
hStatic = CreateWindow(TEXT("STATIC"), TEXT(""),
WS_CHILD | WS_VISIBLE | ES_RIGHT, 0, 25, 80, 20,
hWnd, (HMENU)STATIC_ID, NULL, NULL);
break;
case WM_COMMAND: {
if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == EDIT_ID) {
len = GetWindowTextLength(hed) + 1;
buff = new TCHAR[len];
GetWindowText(hed, buff, len);
buff[len - 1] = 0;
SetWindowText(hStatic, buff);
delete[] buff;
}
else if (LOWORD(wParam) == BUTTON_ID) {
len = GetWindowTextLength(hed) + 1;
buff = new TCHAR[len];
GetWindowText(hed, buff, len);
buff[len - 1] = 0;
MessageBox(hWnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION);
delete[] buff;
}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
По итогу имеем BUTTON, EDIT и STATIC. Когда мы пишем, что-то в EDIT, то этот же текст выводится и в STATIC. А при нажатии на кнопку будет выводится текст из EDIT.