172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
1

Добавление строки в список по нажатию кнопки

09.05.2010, 23:14. Показов 2676. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу свое первое приложение средствами MFC. До этого прогал в с++ билдере
Вот создаю кнопку и листбокс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CMainWnd::CMainWnd()
{
////////////////////////--===СОЗДАНИЕ ФОРМЫ===--/////////////////////////
CRect r; // Отвечает за размер и позицию окна
r.top = r.left = 300; // Расположение окна на экране (сверху и слева)
r.bottom = r.right = 700; // Размеры окна
Create(NULL,"Vortex Player",WS_OVERLAPPEDWINDOW,r,
        NULL,NULL); // Создать окно программы
////////////////////////--===СОЗДАНИЕ КНОПКИ===--/////////////////////////
MyButton = new CXPButton();
MyButton->Create(_T("Button"), 
     WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, 
     CRect(10,10,100,30), this, 1); 
MyButton->SetWindowPos(0,10,10,80,27,0);
////////////////////////--===СОЗДАНИЕ СПИСКА===--/////////////////////////
 
PList = new CListBox();
PList->Create(WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(10,10,100,30),this,1);
PList->SetWindowPos(0,100,10,100,200,0);
}
Как теперь сделать чтобы по нажатию кнопки MyButton в PList добавлялась строка,
В событии нажатия кнопки нельзя я так понял написать PList.add.......... так как листбокс объявлен в CMainWnd(), это "не глобально"
В С++ Builder я бы смог сделать так:
C++
1
2
3
4
5
void func(CListBox* list) {
//действия
}
//...
MyButton->OnLButtonUp=&func(PList);
Но так не прокатывает.

Помогите плз как это все делаеться
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2010, 23:14
Ответы с готовыми решениями:

Добавление строки в таблицу по нажатию кнопки
Есть несколько таблиц со справочными данными. Есть сводная таблица. На форме несколько...

Добавление текстбоксов по нажатию клавиши и удаление по нажатию другой кнопки
Всем доброго времени суток. Хотел попросить помощи в написании следующего кода. Кое что набросал,...

Разбить строку на слова по нажатию первой кнопки, отсортировать список слов по нажатию второй
Разбить строку, введённую в первую ячейку первого столбца активного листа, на слова, и вывести их в...

Добавление записей по нажатию кнопки
Подскажите в чем ошибка. Я хочу, чтоб по нажатию кнопки текст из textBox переходил в базу данных....

13
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
09.05.2010, 23:21 2
VorteX:
Уже начал разработку WinAmp желаю удачи.

Добавлено через 2 минуты
Совет: плеер тебе будет делать удобнее на основе диалгового окна.
0
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
09.05.2010, 23:21  [ТС] 3
Просто учу вижуал на примере создание плеера, как раз познакомлюсь с CButton, CListBox, CSlider
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
09.05.2010, 23:24 4
Если объект объявлен в классе окна, значит можешь его спокойно и использовать в своей
функции: окна.
0
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
09.05.2010, 23:28  [ТС] 5
Ну вот класс окна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class CMainWnd : public CFrameWnd
{
public:
    CMainWnd(); // Конструктор по умолчанию
    int OnCreate(LPCREATESTRUCT lpCreateStruct);    // эта функция вызывается при создании окна
    ~CMainWnd();    // Деструктор
private:
    CListBox* PList;
    CXPButton* MyButton;// Элемент управления кнопка
    CStatusBar m_wndStatusBar;  // класс панели состояния
    DECLARE_MESSAGE_MAP();  // таблица откликов
};
И мне надо, повторюсь, чтоб по нажатию моей кнопки в лист бокс была добавлена строка, ну вообще работа с литбокс осуществлялась, и чет не могу понять как.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
09.05.2010, 23:33 6
Что бы добавить обработчик кнопки: то есть функцию обработки нажатия,
у кнопки должен быть идентификатор.
0
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
09.05.2010, 23:36  [ТС] 7
Вы не поняли. Все есть, и функция нажатия есть.
Проблема в том как обратиться к моему листбоксу если он создан CMainWnd::CMainWnd(), и обращаться кнему могу ток в этой функции
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
09.05.2010, 23:41 8
C++
1
2
3
Create(_T("Button"), 
     WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, 
     CRect(10,10,100,30), this, 1);
Последний параметр функции это и есть идентификатор.

Добавлено через 2 минуты
Ну а если с другой функции, опишите и реализуйте функцию с параметром, ListBox* ptr.
Вызывайте эту функцию передавая в нее адрес Вашего Listbox -A

Добавлено через 1 минуту
void func(CListBox* list) {
//действия
}
И почему это не прокатывает, может я суть вопроса не понял.
0
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
09.05.2010, 23:41  [ТС] 9
Я ток начал знакомиться с этим вижуалом и туплю постоянно=) И зачем этот идентификатор? Что он мне дает и как его испольховать в своей задаче
Может и вправду вы не поняли суть вопроса.
Вот весь код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "xpbutton.h" //класс кнопки
class CMainWnd : public CFrameWnd
{
public:
    CMainWnd(); // Конструктор по умолчанию
    int OnCreate(LPCREATESTRUCT lpCreateStruct);    // эта функция вызывается при создании окна
    ~CMainWnd();    // Деструктор
private:
    CListBox* PList;
    CXPButton* MyButton;// Элемент управления кнопка
    CStatusBar m_wndStatusBar;  // класс панели состояния
    DECLARE_MESSAGE_MAP();  // таблица откликов
};
 
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)  // таблица откликов на сообщения
    ON_WM_CREATE()          // событие создания окна
END_MESSAGE_MAP()
 
 
//---------------------------------------------------------------------------
class CMyApp : public CWinApp
{
public:
    CMyApp();           //конструктор по умолчанию
    virtual BOOL InitInstance();//стандартная инициализация
    
};
 
CMainWnd::CMainWnd()
{
////////////////////////--===СОЗДАНИЕ ФОРМЫ===--/////////////////////////
    CRect r; // Отвечает за размер и позицию окна
r.top = r.left = 300; // Расположение окна на экране (сверху и слева)
r.bottom = r.right = 700; // Размеры окна
    Create(NULL,"Vortex Player",WS_OVERLAPPEDWINDOW,r,
        NULL,NULL); // Создать окно программы
 
////////////////////////--===СОЗДАНИЕ КНОПКИ===--/////////////////////////
MyButton = new CXPButton();
MyButton->Create(_T("Button"), 
     WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, 
     CRect(10,10,100,30), this, 1); 
MyButton->SetWindowPos(0,10,10,80,27,0);
 
 
////////////////////////--===СОЗДАНИЕ СПИСКА===--/////////////////////////
 
PList = new CListBox();
PList->Create(WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(10,10,100,30),this,1);
PList->SetWindowPos(0,100,10,100,200,0);
 
 
}
 
void CXPButton::OnLButtonUp(UINT, CPoint)
{
    
        /////////////////--===ButtonClick event===-- ///////////////////
        ///////////=======================================================/////
        ///////////=======================================================/////
        ///////////=======================================================/////
        AfxMessageBox("Button Click");
        
        ///////////=======================================================/////
        ///////////=======================================================/////
        ///////////=======================================================/////
}
 
 
//---------------------------------------------------------------------------
 
CMyApp::CMyApp() // конструктор главного класса приложения
{}
 
//---------------------------------------------------------------------------
 
BOOL CMyApp::InitInstance() // стандартная инициализация
{
    m_pMainWnd=new CMainWnd();  // создать класс окна
    ASSERT(m_pMainWnd); // проверить его правильность
    m_pMainWnd->ShowWindow(SW_SHOW);// Показать окно
    m_pMainWnd->UpdateWindow(); // Обновить окно
 
    return TRUE;        // Вернуть что все нормально
};
 
//---------------------------------------------------------------------------
 
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    m_wndStatusBar.Create(this);
        return 0;
}
 
//---------------------------------------------------------------------------
 
CMainWnd::~CMainWnd()
{
 
    if (MyButton!=NULL) delete MyButton;    // удалить динамический объект
 
}
 
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
 
CMyApp theApp;  // запуск приложения
 
//---------------------------------------------------------------------------
Вот мне над добавить по нажатию MyButton строку в PList
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
10.05.2010, 00:19 10
Вот не поленился, решил сделать небольшой пример, надеюсь он тебе поможет,
твой код я в своем компиляторе всеравно не создам.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "afxwin.h"
#define MY_BUTTON 0x100
 
class CMainWnd : public CFrameWnd
{
public:
        CMainWnd();     // Конструктор по умолчанию
        ~CMainWnd();    // Деструктор
private:
        CButton*  MyButton;       // Элемент управления кнопка
        afx_msg void OnButton();  //обработчик нажатия кнопки.
        DECLARE_MESSAGE_MAP();    // таблица откликов
};
 
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)  // таблица откликов на сообщения
ON_BN_CLICKED(MY_BUTTON,OnButton)       //связываем с идентификатором обработчик.
END_MESSAGE_MAP()
 
 
//---------------------------------------------------------------------------
class CMyApp : public CWinApp
{
public:
        CMyApp();                       //конструктор по умолчанию
        virtual BOOL InitInstance();//стандартная инициализация        
};
 
CMainWnd::CMainWnd()
{
Create(NULL,"Vortex Player",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);     // Создать окно программы
////////////////////////--===СОЗДАНИЕ КНОПКИ===--/////////////////////////
MyButton = new CButton();
    MyButton->Create(_T("My button"), WS_CHILD|WS_VISIBLE|
    BS_PUSHBUTTON, CRect(10,10,100,30), this, MY_BUTTON);
 
 
}
 
CMainWnd::~CMainWnd()
{
        if (MyButton!=NULL) delete MyButton;    // удалить динамический объект 
}
 
//обработчик нажатия кнопки.
void CMainWnd::OnButton(){  AfxMessageBox("Hello Vortex");  }
 
//---------------------------------------------------------------------------
CMyApp::CMyApp() // конструктор главного класса приложения
{}
 
 
//---------------------------------------------------------------------------
BOOL CMyApp::InitInstance(){ // стандартная инициализация
        m_pMainWnd=new CMainWnd();      // создать класс окна
        ASSERT(m_pMainWnd);     // проверить его правильность
        m_pMainWnd->ShowWindow(SW_SHOW);// Показать окно
        m_pMainWnd->UpdateWindow();     // Обновить окно
        return TRUE;            // Вернуть что все нормально
}; 
//--------------------------------------------------------------------------- 
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
 
CMyApp theApp;  // запуск приложения
Надеюсь я тебе помог, хотя бы с кнопкой.
0
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
10.05.2010, 00:24  [ТС] 11
Вы опять меня не поняли=) С этим то я разобрался. Проблема состоит в том что как мне обратиться в функции void CMainWnd::OnButton() к ListBox
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
10.05.2010, 00:37 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "afxwin.h"
#define MY_BUTTON 0x100
#define MY_PLAYLIST 0x200
 
class CMainWnd : public CFrameWnd
{
public:
        CMainWnd();     // Конструктор по умолчанию
        ~CMainWnd();    // Деструктор
private:
        CButton*  MyButton;       // Элемент управления кнопка
        CListBox * List; 
 
        afx_msg void OnButton();  //обработчик нажатия кнопки.
        DECLARE_MESSAGE_MAP();    // таблица откликов
};
 
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)  // таблица откликов на сообщения
ON_BN_CLICKED(MY_BUTTON,OnButton)       //связываем с идентификатором обработчик.
END_MESSAGE_MAP()
 
 
//---------------------------------------------------------------------------
class CMyApp : public CWinApp
{
public:
        CMyApp();                       //конструктор по умолчанию
        virtual BOOL InitInstance();//стандартная инициализация        
};
 
CMainWnd::CMainWnd()
{
Create(NULL,"Vortex Player",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);     // Создать окно программы
////////////////////////--===СОЗДАНИЕ КНОПКИ===--/////////////////////////
MyButton = new CButton();
    MyButton->Create(_T("My button"), WS_CHILD|WS_VISIBLE|
    BS_PUSHBUTTON, CRect(10,10,100,30), this, MY_BUTTON);
List  = new CListBox();
List->Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD
    |WS_HSCROLL, CRect(50,50,120,100), this, MY_PLAYLIST);
 
 
}
 
CMainWnd::~CMainWnd()
{
        if (MyButton!=NULL) delete MyButton;    // удалить динамический объект 
        if (List!=NULL)delete List;
}
 
//обработчик нажатия кнопки.
void CMainWnd::OnButton(){  
List->AddString("Hello Vortex");    
 }
 
//---------------------------------------------------------------------------
CMyApp::CMyApp() // конструктор главного класса приложения
{}
 
 
//---------------------------------------------------------------------------
BOOL CMyApp::InitInstance(){ // стандартная инициализация
        m_pMainWnd=new CMainWnd();      // создать класс окна
        ASSERT(m_pMainWnd);     // проверить его правильность
        m_pMainWnd->ShowWindow(SW_SHOW);// Показать окно
        m_pMainWnd->UpdateWindow();     // Обновить окно
        return TRUE;            // Вернуть что все нормально
}; 
//--------------------------------------------------------------------------- 
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
 
CMyApp theApp;  // запуск приложения
Короче все работает, как надо.
Уже 0:33 ночи спасть охото так что я уже все сказал.

Добавлено через 2 минуты
И вообще совет:
Используй приложения на диалоговых окнах, визард может помочь, да и легче в двести раз,
да и структрура плеера так и напрашивается на диалоговое окно.
1
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
10.05.2010, 01:15  [ТС] 13
Во! Терь то что нужно было. Теперь понятно зачем идентификатор=) так бы сразу мне и объяснили=)
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
10.05.2010, 11:46 14

Не по теме:


Не сразу понял что надо.



Небольшая справка о карте сообщений:

Каждый вход карты сообщения берет следующую форму:
ON_Notification( id, memberFxn )
Где идентификатор определяет дочернее окно ID управления посылающего сообщение и memberFxn - имя родительской функции которую Вы записали в дескриптор сообщения.

Вот тебе еще инфа на затравку:

Потенциальные входы карты сообщения следующие для твоего класса CMainWnd:

ON_BN_CLICKED - Пользователь нажимает кнопку
ON_BN_DOUBLECLICKED - Пользователь дважды щелкает кнопку

Если хочешь обрабатывать события от ListBox, вот еще не много инфы:

Следующее - список потенциальных входов карты сообщения и описания случаев, в которых они были бы посланы родителю:


ON_LBN_DBLCLK - Пользователь дважды щелкает строку в списке. Только список, который имеет LBS_NOTIFY стиль, пошлет это уведомительное сообщение.
ON_LBN_ERRSPACE - Список не может распределять достаточно памяти, чтобы встретить запрос.
ON_LBN_KILLFOCUS - Список теряет фокус ввода.
ON_LBN_SELCANCEL - Текущий выбор списка отменен. Это сообщение только послано, когда список имеет LBS_NOTIFY стиль.
ON_LBN_SELCHANGE - Выбор в списке собирается изменяться. Это сообщение не послано, если выбор изменен CListBox::SetCurSel функцией . Это сообщение применяется только к списку, который имеет LBS_NOTIFY стиль. LBN_SELCHANGE уведомительное сообщение послано для списка с несвязным выбором всякий раз, когда пользователь нажимает клавишу курсора, даже если выбор не изменяется.
ON_LBN_SETFOCUS - Список получает фокус ввода.
ON_WM_CHARTOITEM - Определенное пользователем окно списка не содержащие строк получает WM_CHAR сообщение.
ON_WM_VKEYTOITEM - Список с LBS_WANTKEYBOARDINPUT стилем получает WM_KEYDOWN сообщение.
1
10.05.2010, 11:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2010, 11:46
Помогаю со студенческими работами здесь

Добавление полей по нажатию кнопки
Здравствуйте уважаемая Администрация и пользователи форума! Подскажите, пожалуйста как...

Добавление текста по нажатию кнопки
Создаю массив кнопок обработчик один для всех.Номер кнопки записывается в textbox и обновляется...

Добавление Item в TreeView по нажатию кнопки
Очень нужна помощь, как по нажатию кнопки на форме можно создать ветку у TreeView?

Добавление группы записей по нажатию кнопки
Доброго времени суток! Проблема такова. После внесения наименования продукции и выбора группы к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru