Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
1

Функция обратного вызова (callback function)

19.02.2015, 16:48. Показов 1741. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу приложение, используя библиотеку MFC, т.е. описал класс для окна (от CFrameWnd), класс приложения. Далее начал описывать элементы и понял, что они не увидят свойства и параметры друг друга, только если делать эти параметры глобальными ( нет уж), передавать их элементам управления тоже не вариант (очень запутано получится) . Посмотрел на callback функции дотнета, порылся в инете, и вот что вышло:
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
class MyWnd;
 
class MyButton : public CButton
{
public:
    MyButton() {}
    virtual ~MyButton() {}
    void SetClick(MyWnd* wnd, void (MyWnd::*click)(CObject*,UINT,CPoint))
    {
        _click = click;
        _wnd = &wnd;
    }
    //...
protected:
    MyWnd** _wnd;
    void (MyWnd::*_click)(CObject*, UINT, CPoint);
    afx_msg void OnLButtonUp(UINT nFlag, CPoint point)
    {
        (_wnd->*_click)(this, nFlag, point);
    }
    //...
    DECLARE_MESSAGE_MAP()
}
 
class MyWnd : public CFrameWnd
{
    MyWnd();
    ~MyWnd();
    //...
private:
    MyButton* _mybutton;
    void mybutton_Ckick(CObject*, UINT, CPoint);
    //...
}
 
MyWnd::MyWnd()
{
    Create(...);
    //...
    _mybutton = new MyButton();
    if (_mybutton) {
        _mybutton->SetClick(this, &MyWnd::mybutton_Click);
        _mybutton->Create(...);
    //...
}
 
void MyWnd::mybutton_Ckick(CObject* sender, UINT nFlag, CPoint point)
{
    // выполняем действия с параметрами и свойствами класса MyWnd
}
 
BEGIN_MESSAGE_MAP(MyButton, CButton)
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
 
// дальше описание класса приложения ( : public CWinApp )
Работает, но есть недостатки в плане переноса класса MyButton в другие проекты, надо будет указывать другой оконный класс. Пытался указывать CObject, не прокатило. Если можно создать шаблонный класс от CButton (и других контролов MFC), передаваемый тип которого будет класс окна, буду очень благодарен за подсказку.
Что вы думаете о такой callback функции?

Добавлено через 3 часа 51 минуту
Разобрался я с шаблоном. Проблема была в макросе создания таблицы сообщений (да и в других макросах, которым передаётся имя класса), так как он не может правильно обращаться с методами шаблонного класса. Можно конечно его переопределить, но не делать же это в каждом проекте, где буду использовать шаблонный класс.
Вот сам шаблон:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class TmpWnd>
class TmpButton : public CButton
{
public:
    TmpButton(){}
    virtual ~TmpButton(){}
    void SetClick(TmpWnd* wnd, void (TmpWnd::*click)(CObject*, UINT, CPoint))
    {
        _wnd = &wnd;
        _click = click;
    }
 
protected:
    TmpWnd** _wnd;
    void (TmpWnd::*_click)(CObject*, UINT, CPoint);
    afx_msg void OnLButtonUp(UINT nFlag, CPoint point)
    {
        (*_wnd->*_click)(this, nFlag, point);
    }
};
А чтобы создать таблицу сообщений, в нужном проекте описываем новый класс, наследуемый от шаблонного с указанием действительного типа-класса (класс, в котором будут реализованы callback функции). В описании нового класса вызываем макрос включения таблицы сообщений, и в файле реализации создаём эту таблицу. Теперь можем добавлять кнопки в классе окна и передавать им функции.
Теперь подумаю как реализовать возможность добавлять несколько функций (переделать метод SetClick в AddClick).
Например через "очередь"

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2015, 16:48
Ответы с готовыми решениями:

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

Функция обратного вызова
#undef UNICODE #include &lt;windows.h&gt; #include &quot;resource.h&quot; #include &lt;iostream&gt; #include...

Функция обратного вызова в классе
Такие проблемы возникли у меня. Есть два класса.В одном классе относится к...

оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова; 2. функция расположена после до ее вызова; 3. функ
оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова;...

0
19.02.2015, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2015, 16:48
Помогаю со студенческими работами здесь

Заменить делегаты функциями обратного вызова
public event EventHandler&lt;EventClientArgs&gt; OnNewClient; /// &lt;summary&gt; ///...

Стрелка в описании функции обратного вызова
#include &lt;iostream&gt; #include &lt;algorithm&gt; std::string s = &quot;hello&quot;; auto end =...

нужно чтобы функция располагалась до ее вызова, после ее вызова и в другом файле. Как это сделать?
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int n, *c; void fun(int a,...

Передача функций обратного вызова как членов некоторого класса
Пытаюсь понемногу изучать OpenGL, и вот сейчас столкнулся с такой проблемой: Имеется некоторый...

Почему callback-функции называются функциями ОБРАТНОГО вызова
Доброго времени. Нуждаюсь в объяснении. Очередной вопрос в стиле «Что такое callback-функции и...

Функция обратного вызова
Функция обратного вызова это та, которая передаётся в качестве аргумента другой функции и внутри...


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

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