Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться новичку 
:(
    Опции темы
xTr1m
Дата 6.5.2005, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Я недавно изучаю MFC, поэтому помогите пожалуйста. Например, есть такой код класса кнопки :
Код


class CMyButton: public CButton
 {
 public:
   afx_msg void OnLButtonDblClk( UINT, CPoint );
   afx_msg void OnRButtonDblClk( UINT, CPoint );
 private:
   DECLARE_MESSAGE_MAP(); // таблица откликов кнопки
 };

 void CMyButton::OnLButtonDblClk( UINT, CPoint )
 {
   MoveWindow(CRect(120,100,220,150),TRUE);
 }

 void CMyButton::OnRButtonDblClk( UINT, CPoint )
 {
   MoveWindow(CRect(120,10,220,50),TRUE);
 }

 BEGIN_MESSAGE_MAP(CMyButton, CButton) 
         // таблица откликов на сообщения 
 ON_WM_LBUTTONDBLCLK()
 ON_WM_RBUTTONDBLCLK()
 END_MESSAGE_MAP()







И есть класс рамки окна :
Код


class CMainWnd : public CFrameWnd
 {
 public:
   CMainWnd(); 
   afx_msg void OnLButtonDblClk( UINT, CPoint ); 
   afx_msg void OnRButtonDblClk( UINT, CPoint ); 
   afx_msg void OnKeyDown( UINT, UINT, UINT );
 private:
   CStatic* MyStatic; // Элемент управления для вывода текста
   CMyButton* MyButton; // Элемент управления кнопка
   CEdit* MyEdit; // Элемент редактирования
   DECLARE_MESSAGE_MAP(); // таблица откликов
 };


CMainWnd::CMainWnd()
{
   Create(NULL,"Step1",WS_OVERLAPPEDWINDOW,
      rectDefault,NULL,NULL); // Создать окно программы
   MyStatic = new CStatic();
   MyStatic->Create("MyStatic",WS_CHILD|WS_VISIBLE|SS_CENTER,
      CRect(10,10,100,50),this);
   MyButton = new CMyButton();
   MyButton->Create("MyButton",WS_CHILD|WS_VISIBLE|SS_CENTER,
      CRect(120,10,220,50),this,IDC_MYBUTTON);
   MyEdit = new CEdit();
   MyEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER,
      CRect(240,10,340,50),this,IDC_MYEDIT);
}





И в этой рамке мы создали объект MyButton типа CMyButton.
Но ведь событие, которое здесь описано для кнопки , будет одно и тоже для каждой кнопки типа CMyButton. Так что же это получается, если у меня будет 20 кнопок, то мне придется создавать 20 классов (порожденных от CButton) и для каждого такого клааса определять событие Click? smile
Или я что-то не понимаю. Спасибо.
PM MAIL WWW ICQ   Вверх
Step
Дата 6.5.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 2
Всего: 25



Цитата(xTr1m @ 6.5.2005, 11:13)
MyButton->Create("MyButton",WS_CHILD|WS_VISIBLE|SS_CENTER,
      CRect(120,10,220,50),this,IDC_MYBUTTON);




ваш клас в функцию онлбаттонап вставляете код отправки сообщения в фрейм и параметром отправляете nID,
не знаете как его узнать, перегрузити Create и сохраните во внутренней переменной класса

во фрейме вы сможете по параметру сообщения какая кнопка кликнута

Добавлено @ 11:52
вроде так
Код

GetParrent()->SendMessage(WM_COMMAND, WM_MY_CLICK,тут надо преобразование результата помоему от GetDlgCtrlID)


WM_MY_CLICK этот символ нужно указать определить, можно конечно отфонарно число вписать, но это когданибудь может дать ошибку.... так как отфонарное число это не идентификатор


а во фрейме обрабатываете ОнКомманд проверяете левый на равенство WM_MY_CLICK, а в правом ид кнопки


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Coocky
Дата 6.5.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



xTr1m
есть такое сообщение
ON_COMMAND_RANGE(nID,nID2,Func);
где nID-номер ID первого элемента,nID2-номер ID последнего,Функция обработки.
те.есть набор кнопок с ID от 2000 до 2015
для всех них будет візіваться функция(обработчик Func);


Добавлено @ 12:04
Ну вот еще и код дам smile

Код

// определяем диапазон ID-ов кнопок
#define ID_FIRST_15BUTTON      WM_USER
#define ID_LAST_15BUTTON       ID_FIRST_15BUTTON+14

BEGIN_MESSAGE_MAP(CFifteensDlg, CDialog)
    //{{AFX_MSG_MAP(CFifteensDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    // навешиваем свой обработчик в MESSAGE_MAP
    ON_COMMAND_RANGE(ID_FIRST_15BUTTON, ID_LAST_15BUTTON, OnMyButtons)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


// это наш обработчик, принимает ID нажатой кнопки
void CFifteensDlg::OnMyButtons(UINT id)
{
    int iButton = id - ID_FIRST_15BUTTON;
    CString str; str.Format("%d", iButton+1);
    MessageBox(str, "Pressed Button:", MB_OK|MB_ICONINFORMATION);
}




--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
xTr1m
Дата 6.5.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Coocky,
я, наверное, не так объяснил. Мне хотелось бы узнать не как объединить одинаковые события для разных кнопок, а наоборот, как в принципе определить разные события для разных кнопок одного класса (например для кнопока типа CMyButton, порожденного от базового CButton) Но все равно спасибо за твою инфу, этого я тоже не знал.


PM MAIL WWW ICQ   Вверх
Coocky
Дата 6.5.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



xTr1m
Цитата
Мне хотелось бы узнать не как объединить одинаковые события для разных кнопок, а наоборот

Перевожу: как обьединить разные события для одной кнопки?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
xTr1m
Дата 6.5.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Ну, например, есть класс кнопки :
Код


class CMyButton: public CButton
 {
 public:
   afx_msg void OnLButtonDblClk( UINT, CPoint );
   afx_msg void OnRButtonDblClk( UINT, CPoint );
 private:
   DECLARE_MESSAGE_MAP(); // таблица откликов кнопки
 };





И есть фрейм с двумя кнопками MyFirstButton и MySecondButton :

Код


class CMainWnd : public CFrameWnd
 {
 public:
   CMainWnd(); 
   afx_msg void OnLButtonDblClk( UINT, CPoint ); 
   afx_msg void OnRButtonDblClk( UINT, CPoint ); 
   afx_msg void OnKeyDown( UINT, UINT, UINT );
 private:
   CStatic* MyStatic; // Элемент управления для вывода текста
   CMyButton* MyFirstButton;
   CMyButton* MySecondButton;
   CEdit* MyEdit; // Элемент редактирования
   DECLARE_MESSAGE_MAP(); // таблица откликов
 };


CMainWnd::CMainWnd()
{
   Create(NULL,"Step1",WS_OVERLAPPEDWINDOW,
      rectDefault,NULL,NULL); // Создать окно программы
   MyStatic = new CStatic();
   MyStatic->Create("MyStatic",WS_CHILD|WS_VISIBLE|SS_CENTER,
      CRect(10,10,100,50),this);
   MyFirstButton = new CMyButton();
   MyFirstButton->Create("MyButton",WS_CHILD|WS_VISIBLE|SS_CENTER,
      CRect(120,10,220,50),this,IDC_MYBUTTON);
   MySecondButton = new CMyButton();
   MySecondButton->Create("MyButton",WS_CHILD|WS_VISIBLE|SS_CENTER,
      CRect(120,10,220,50),this,IDC_MYBUTTON);
   MyEdit = new CEdit();
   MyEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER,
      CRect(240,10,340,50),this,IDC_MYEDIT);
}




И как мне сделать, чтобы событие Click для этих 2 кнопок делало разные операции. Просто везде в примерах (электронные учебники) описан вариант только с одной кнопкой, а я хочу понять принцип, со многими элемнетами. Ну, скажем, клик для первой выводил сообщение "Нажата 1ая кнопка", а клик на второй ЭНажата 2ая кнопка". Если можно, то приведите примерный код плз. Спасибо заранее.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 7.5.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Дык мог бы воспользоваться моим примером.Ведь у каждой кнопки свой ID smile
Еще раз мой пример
Код

// определяем диапазон ID-ов кнопок
#define ID_FIRST_15BUTTON      WM_USER
#define ID_LAST_15BUTTON       ID_FIRST_15BUTTON+14

BEGIN_MESSAGE_MAP(CFifteensDlg, CDialog)
    //{{AFX_MSG_MAP(CFifteensDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    // навешиваем свой обработчик в MESSAGE_MAP
    ON_COMMAND_RANGE(ID_FIRST_15BUTTON, ID_LAST_15BUTTON, OnMyButtons)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


// это наш обработчик, принимает ID нажатой кнопки
void CFifteensDlg::OnMyButtons(UINT id)
{
    if (id==1000)
 {
MessageBox("Я первая кнопка");

 }
 if (id==1001)
 {
MessageBox("Я вторая кнопка");
 }


}




--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
xTr1m
Дата 9.5.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Спасибо. Что-то я сразу не догадался =(( Ну тогда последний вопрос : как определить, что функция OnMyButton будет считаться за событие Click?
PM MAIL WWW ICQ   Вверх
Coocky
Дата 10.5.2005, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



xTr1m
Не понял?
А что на клик не реагирует?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
xTr1m
Дата 10.5.2005, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



ой, извини я что-то сначала подумал, что это просто ты так на обум название функции написал.
А вообще так можно про любые события писать или только про конкретные? И можно ли эту инфу найти в хелпе VC?
PM MAIL WWW ICQ   Вверх
Coocky
Дата 10.5.2005, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата
А вообще так можно про любые события писать или только про конкретные?

только про COMMAND,насколько я знаю..
Цитата
И можно ли эту инфу найти в хелпе VC?

Ну набери в МСДН WM_ или ON_ и ищи все,что связано с RANGE


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.