Я пытаюсь обернуть голову вокруг этой макроструктуры, но мои навыки Си далеко не адекватны. У меня есть макроструктура, с которой мне нужно работать, которая устанавливает области мыши и функции обратного вызова для вызова, когда область поражена. Все работает нормально, если функции глобальные, но теперь я бы хотел указать функции обратного вызова, которые являются членами классов.
Что у меня есть:
#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;
}
Кроме того, я не уверен, как вызвать функцию-член из макроса, как описано выше. Я не могу изменить структуру макроса, его использование является требованием проекта.
Пожалуйста, помогите!