Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Помогите разобраться новичку


Автор: xTr1m 6.5.2005, 11:13
Я недавно изучаю 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
Или я что-то не понимаю. Спасибо.

Автор: Step 6.5.2005, 11:44
Цитата(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, а в правом ид кнопки

Автор: Coocky 6.5.2005, 11:59
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);
}


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


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

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

Автор: xTr1m 6.5.2005, 15:46
Ну, например, есть класс кнопки :
Код


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ая кнопка". Если можно, то приведите примерный код плз. Спасибо заранее.

Автор: Coocky 7.5.2005, 14:39
Дык мог бы воспользоваться моим примером.Ведь у каждой кнопки свой 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("Я вторая кнопка");
 }


}


Автор: xTr1m 9.5.2005, 22:10
Спасибо. Что-то я сразу не догадался =(( Ну тогда последний вопрос : как определить, что функция OnMyButton будет считаться за событие Click?

Автор: Coocky 10.5.2005, 20:28
xTr1m
Не понял?
А что на клик не реагирует?

Автор: xTr1m 10.5.2005, 23:20
ой, извини я что-то сначала подумал, что это просто ты так на обум название функции написал.
А вообще так можно про любые события писать или только про конкретные? И можно ли эту инфу найти в хелпе VC?

Автор: Coocky 10.5.2005, 23:25
Цитата
А вообще так можно про любые события писать или только про конкретные?

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)