Добавление текста из Edit в List

191
07 марта 2019, 22:50

Помогите... Как добавить текст который я ввожу в строку - (hEdit) в (List) список при выборе (1)Radio Button и нажатии на кнопку (Добавить).Я не понимаю, могу только добавлять заданный заранее текст в списки.

 #include "stdafx.h"
#include <windows.h>
#include <string>
using namespace std;
int window_width = 400;
int window_height = 500;
#define ID_CANCEL  100
#define ID_EDIT  101
#define ID_DELETE  102
#define ID_LIST  103
HWND hEdit;
HWND hRadioButton1, hRadioButton2;
HWND hButtonEddit, hButtonDeleted, hButtonExit;
HWND hList;
string res;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        DWORD dwEditStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT;
        DWORD dwButtonStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | BS_PUSHBUTTON;
        DWORD dwCheckBoxStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | BS_AUTOCHECKBOX;
        DWORD dwListBoxStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_NOTIFY | LBS_DISABLENOSCROLL;
        DWORD dwRadioButtonStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | BS_AUTORADIOBUTTON;
        HINSTANCE hI = GetModuleHandle(NULL);
        hEdit = CreateWindow("edit", "", dwEditStyle, 30, 20, 300, 20, hWnd, (HMENU)0, hI, NULL);
        hList = CreateWindow("listbox", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, 90, 200, 200, 150, hWnd, (HMENU)ID_LIST, hI, NULL);
        char szBuff[255];
        GetWindowText(hEdit, szBuff, 255);
        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)szBuff);
        hRadioButton1 = CreateWindow("button", "(1)Radio", dwRadioButtonStyle, 30, 50, 145, 20, hWnd, (HMENU)0, hI, NULL);
        hRadioButton2 = CreateWindow("button", "(2)Radio", dwRadioButtonStyle, 185, 50, 145, 20, hWnd, (HMENU)0, hI, NULL);
        SendMessage(hRadioButton1, BM_SETCHECK, BST_CHECKED, 1);

        hButtonDeleted = CreateWindow("button", "Удалить", dwButtonStyle, 185, 110, 145, 20, hWnd, (HMENU)ID_DELETE, hI, NULL);
        hButtonEddit = CreateWindow("button", "Добавить", dwButtonStyle, 30, 110, 145, 20, hWnd, (HMENU)ID_EDIT, hI, NULL);
        hButtonExit = CreateWindow("button", "Выход", dwButtonStyle, 185, 140, 145, 20, hWnd, (HMENU)ID_CANCEL, hI, NULL);
    }
    break;
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
        case ID_CANCEL:
            DestroyWindow(hWnd);
            break;
        case ID_DELETE:
        {
            SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)"");
            res = "";

            if (SendMessage(hRadioButton1, BM_GETCHECK, 0, 0L))
                res += " (1)RadioButton ";
            if (SendMessage(hRadioButton2, BM_GETCHECK, 0, 0L))
                res += " (2)RadioButton ";
            SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)res.c_str());
        }
        break;
        case ID_EDIT:
        {
            SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)"text");

            if (SendMessage(hRadioButton1, BM_GETCHECK, 0, 0L))
                res += " (1)RadioButton ";
            if (SendMessage(hRadioButton2, BM_GETCHECK, 0, 0L))
                res += " (2)RadioButton ";
            SendMessage(hList, WM_SETTEXT, 0, (LPARAM)res.c_str());
        }
        break;
        default:
            DefWindowProc(hWnd, message, wParam, lParam);
        }
    }
    break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}
ATOM RegMyWindowClass(HINSTANCE hInst, LPCSTR lpzClassName)
{
    WNDCLASS wcWindowClass = { 0 };
    wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;
    wcWindowClass.style = CS_HREDRAW | CS_VREDRAW;
    wcWindowClass.hInstance = hInst;
    wcWindowClass.lpszClassName = lpzClassName;
    wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
    return RegisterClass(&wcWindowClass);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    LPCTSTR Class = TEXT("My Window Class!");
    if (!RegMyWindowClass(hInstance, Class))
        return 1;
    HWND hwnd = CreateWindow(Class, TEXT("Dialog Window"), WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER | WS_VSCROLL,
        (GetSystemMetrics(SM_CXSCREEN) >> 1) - (window_width >> 1),
        (GetSystemMetrics(SM_CYSCREEN) >> 1) - (window_height >> 1),
        window_width, window_height, NULL, NULL, hInstance, NULL);
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        DispatchMessage(&msg);
        TranslateMessage(&msg);
    }

    return 0;
}
Answer 1

Чтобы добавить строку в список, вам нужно сначала эту строку получить. В обработчике WM_COMMAND/ID_EDIT вместо строки

SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)"text");

напишите так:

char str[80] = { (char)sizeof(str), 0 };  // If str's size >255, store upper bits in the second byte
int len = (int)::SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)str);
str[len] = '\0';  // The copied line does not contain a terminating null character
::SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)str);

ДОПОЛНЕНИЕ

Удаление выбранной (например, пользователем) строки из списка:

int idx = (int)::SendMessage(hList, LB_GETCURSEL, 0, 0);  // Index of the selected string
::SendMessage(hList, LB_DELETESTRING, (WPARAM)idx, 0);

Это код для списка, в котором строки выбираются по одной. Для списков, которые разрешают выбор нескольких строк, код немного усложнится. Вместо LB_GETCURSEL нужно будет использовать LB_GETSELITEMS, ну или вызывать LB_GETSEL для каждого элемента.

Вообще это все надо смотреть в MSDN. Конкретно для ListBox абсолютно полную информацию с примерами использования можно найти здесь.

READ ALSO
ИЗ Little endian в big-endian

ИЗ Little endian в big-endian

Нужно перевести число из Little endian в big-endianДано изначально 32 битное число представленное в десятичном виде

184
Доступ к внутреннем данным элемента TreeView

Доступ к внутреннем данным элемента TreeView

Подскажите чайнику,пожалуйста, как обойти ситуациюВ своем приложении решил создать иерархическую структуру данных

205
Перегрузка оператора присваивания в C++

Перегрузка оператора присваивания в C++

Нужна помощь умных людейНужно: Создать класс СТРОКА, реализующий текстовую строку

162
работа конструктора String(const char*)

работа конструктора String(const char*)

Был такой вопрос: Преобразование char[] в string

134