Учитывая макрос, как указать указатель на функцию, которая является членом класса? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь обернуть голову вокруг этой макроструктуры, но мои навыки Си далеко не адекватны. У меня есть макроструктура, с которой мне нужно работать, которая устанавливает области мыши и функции обратного вызова для вызова, когда область поражена. Все работает нормально, если функции глобальные, но теперь я бы хотел указать функции обратного вызова, которые являются членами классов.

Что у меня есть:

#define FCAPI   __stdcall

typedef struct  MOUSECALLBACK
{
    PIXPOINT    relative_point;
    PVOID       user_data;
    PMOUSERECT  mouse;
    PIXPOINT    screen_point;       // window client coordinates of the click
    PVOID       reserved;
} MOUSECALLBACK, *PMOUSECALLBACK, **PPMOUSECALLBACK;

// arg1 is actually pointer to MOUSECALLBACK, but for compatibility is defined here as a pointer to PIXPOINT
typedef BOOL FCAPI  MOUSE_FUNCTION(PPIXPOINT arg1, FLAGS32 mouse_flags);
typedef             MOUSE_FUNCTION      *PMOUSE_FUNCTION;

#define OBJHDR_FOR_MOUSE_CALLBACK(PIXPOINT) ((POBJHDR)(((PMOUSECALLBACK)(PIXPOINT))->user_data))

typedef struct  MOUSERECT
{
    MOUSE_RECT_TYPE rect_type;          // type of mouse rectangle (parent, child, eol)
    PIXBOX          relative_box;       // relative sense rectangle (relative to parameter to register function)
    CURSOR_TYPE     cursor;             // cursor to display when over this window
    ID              help_id;            // pop-up help id
    FLAGS           mouse_flags;        // types of mouse activities to look for
    ID              event_id;           // event to generate if mouse_flags is satisfied (implies simple mouse_flags)
    PMOUSE_FUNCTION mouse_function;     // function to call if mouse_flag is satisfied
} MOUSERECT;

#define MOUSE_PARENT_BEGIN( x, y, w, h, helpid )                        {MOUSE_RECT_PARENT, {x, y, w, h}, CURSOR_NONE, helpid, MOUSE_NONE, 0, NULL, NULL},

#define MOUSE_PARENT_END                                                {MOUSE_RECT_END_PARENT, {0, 0, 0, 0}, CURSOR_NONE, HELP_NONE, MOUSE_NONE, 0, NULL, NULL},

#define MOUSE_PARENT( x, y, w, h, helpid )                              MOUSE_PARENT_BEGIN( x, y, w, h, helpid )                    \
                                                                            MOUSE_PARENT_END

#define MOUSE_BEGIN( name, helpid, x, y )                               MOUSERECT   name[]  = {                                     \
                                                                            MOUSE_PARENT_BEGIN( x, y, 0, 0, helpid )

#define MOUSE_END                                                       MOUSE_PARENT_END                                            \
                                                                            {MOUSE_RECT_EOL, {0, 0, 0, 0}, CURSOR_NONE, HELP_NONE, MOUSE_NONE, 0, NULL, NULL}};

#define MOUSE_CHILD_EVENT( x, y, w, h, cursor, mouse_flags, event_id )  {MOUSE_RECT_CHILD, {x, y, w, h}, cursor, HELP_NONE, mouse_flags, event_id, NULL, NULL},
#define MOUSE_CHILD_FUNCT( x, y, w, h, cursor, mouse_flags, function )  {MOUSE_RECT_CHILD, {x, y, w, h}, cursor, HELP_NONE, mouse_flags, 0, function, NULL},

Затем я вызываю макросы для определения областей мыши и указатели на функции (в этом примере, MFA_B_T1) для вызова при нажатии области:

MOUSE_BEGIN(MFA_mouse_rect, HELP_NONE, 0, 0)
MOUSE_CHILD_FUNCT(20, 20, 6, 6, CURSOR_HAND, MOUSE_LEFTSINGLE, MFA_B_T1)
```
MOUSE_END

BOOL FCAPI MFA_B_T1(PPIXPOINT relative_point, FLAGS32 mouse_flags)
{
    ```
        return FALSE;
}

Теперь мне нужно сделать MFA_B_T1 членом класса, скажем, GDIPlus_Object. Итак, мне нужно что-то вроде этого:

MOUSE_CHILD_FUNCT(20, 20, 6, 6, CURSOR_HAND, MOUSE_LEFTSINGLE, GDIPlus_Object::MFA_B_T1)

BOOL FCAPI GDIPlus_Object::MFD_B_T1(PPIXPOINT relative_point, FLAGS32 mouse_flags)
{
    return true;
}

Кроме того, я не уверен, как вызвать функцию-член из макроса, как описано выше. Я не могу изменить структуру макроса, его использование является требованием проекта.

Пожалуйста, помогите!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...