Консультация № 174967
07.12.2009, 02:31
0.00 руб.
0 8 1
Здравсвуйте эксперты, помогите пожалуйста понять, на форме есть кнопка и ListBox, как по нажатию кнопки сделать так, чтобы добавлялась строчка в ListBox. Пишу в VC++ 6.0
Изучал VC ++ 6.0 по вот этому
Дошел где-то до 16ого шага.

Приложение:
#include "afxwin.h"
#define ID_BUTTON 01
#define ID_LIST 02


class CMyWindow: public CFrameWnd
{
public:
CMyWindow();
CListBox *List;
CButton *Bt;
};

CMyWindow::CMyWindow()
{
Create(NULL,"proba",WS_OVERLAPPEDWINDOW,CRect(100,100,900,500),NULL,NULL);
List = new CListBox();
List->Create(WS_CHILD|WS_BORDER|WS_VISIBLE,CRect(110,10,300,100),this, ID_LIST);
Bt = new CButton();
Bt->Create("Êíîïêà",WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(10,10,100,50),this,ID_BUTTON);
};

class CApp: public CWinApp
{
public:
CApp();
virtual BOOL InitInstance();
};

CApp::CApp(){};


BOOL CApp::InitInstance()
{
m_pMainWnd= new CMyWindow();
ASSERT(m_pMainWnd);
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
};


CApp w;

Обсуждение

Неизвестный
07.12.2009, 07:31
общий
это ответ
Здравствуйте, Tribak.

Нужно сделать обработчик для кнопки. Кстати, идентификаторы 1 и 2 обычно используют для кнопок IDOK и IDCANCEL (Ок Отмена), лучше поэтом для пользовательских кнопок использовать другие ID-ы.
Я так понял, это MS VC + MFC?
тогда надо довавить в класс окна:

afx_msg LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);

и в сам код:

LRESULT CMyWindow::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
if(ID_BUTTON == LOWORD(wParam))
{
List->AddString ("New String");
}
break;
}
return CWnd::WindowProc(m_hWnd, message, wParam, lParam);
}

5
Неизвестный
07.12.2009, 13:10
общий
я попробую разобраться в том что вы написали, а можете дать ссылку на какой-нибудь материал где все это описано?
Неизвестный
07.12.2009, 13:21
общий
Эээ...

Я всё это узнал (в своё время) следующим образом:
- взял студию MS Visual Studio 6.0
- создал проект "Win32 Application" (именно виндовое, не консольное). Потом в опциях "A typical «Hello World!» application"

И там внутри всё это видно. Только там не MFC, но это даже лучше в плане понимания, как всё работает. Там регистрируется класс окна, потом оно создаётся. Внутри есть отрисовка в окне «Hello World!», а так же обработка событий: нажатия в меню IDM_EXIT - выход и IDM_ABOUT - окошко "About...". Кнопки обрабатываются ровно тем же способом, что и меню (в тонкости не вдаётмся). Т.е. если после создания окна (CreateWindow) создать на окне кнопку с идентификатором IDM_ABOUT, то она будет делать ровно тоже самое, что и пункт меню.
Неизвестный
07.12.2009, 13:22
общий
PS. А потом читал msdn, и до сих пор читаю
Неизвестный
07.12.2009, 13:44
общий
так я не понял, тут я к примеру один ListBox сделал, а как вообще отлавливать события и к разным объектам применять, вот в C++ Builder есть инспектор событий, там выбираешь нужное событие и делаешь что хочешь со всеми компонентами, как мне тут поступить, что один элементом влиять на другой. Как отлавливать события внутри класса я понял, а как сделать так что один класс ловил события другого класса, как это в C++ Builder ?
Неизвестный
07.12.2009, 13:44
общий
я в C++ Builder все что надо умею, пытаюсь сейчас аналогию для MFC провести
Неизвестный
07.12.2009, 14:09
общий
Тут, как я понял, под двумя классами подразумеваются Кнопка и Лист. Но им, в данном случае, не надо ловить события друг от друга. Достаточно главному окну (на котором лежит кнопка) поймать событие нажатия кнопки, и по этому событию внести строчку в Лист. Обычно обработки событий в одном основном окне бывает достаточно.
Неизвестный
07.12.2009, 16:43
общий
А это идея, спасибо большое)
Форма ответа