Не могу реализовать полноценный ввод данных через поле 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, то нужно сделать её статичной.

Сохранение текста можно сделать разными способами. Например:

  1. Выводим текст в статическую окно 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;
     }
    
  2. А в 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.

→ Ссылка