Помогите... Как добавить текст который я ввожу в строку - (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;
}
Чтобы добавить строку в список, вам нужно сначала эту строку получить. В обработчике 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 абсолютно полную информацию с примерами использования можно найти здесь.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно перевести число из Little endian в big-endianДано изначально 32 битное число представленное в десятичном виде
Подскажите чайнику,пожалуйста, как обойти ситуациюВ своем приложении решил создать иерархическую структуру данных
Нужна помощь умных людейНужно: Создать класс СТРОКА, реализующий текстовую строку