C++ MSG_MAP marcro -> Mixin
BLS
nanali at nospam-wanadoo.fr
Thu Sep 20 02:18:34 PDT 2007
BLS schrieb:
> Daniel Keep schrieb:
>>
>> BLS wrote:
>>> BLS schrieb:
>>>> Hi,
>>>> MFC and wxWidgets are supporting MESSAGEMAPS macros. I would like to
>>>> port them to D.
>>>>
>>>> class CMsg
>>>> {
>>>> public:
>>>>
>>>> virtual BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM
>>>> lParam,LRESULT lResult)
>>>> {
>>>> return FALSE;
>>>> }
>>>> };
>>>>
>>>> Okay, here iy goes ....
>>>> #define BEGIN_MSG_MAP() \
>>>> public: \
>>>> virtual BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM
>>>> lParam,LRESULT& lResult) \
>>>> { \
>>>> #define ON_MESSAGE(Msg, vfunc) \
>>>> if(uID == Msg) \
>>>> { \
>>>> vfunc(uID, wParam, lParam); \
>>>> lResult = 0; \
>>>> return TRUE; \
>>>> }
>>>>
>>>> #define ON_MESSAGE_RANGE(MsgF, MsgL, vfunc) \
>>>> if(uID >= MsgF && uID <= MsgL) \
>>>> { \
>>>> lResult=vfunc(uID, wParam, lParam); \
>>>> return TRUE; \
>>>> }
>>>>
>>>> #define ON_COMMAND_CONTROL(iControl, iEvent, vfunc) \
>>>> if(uID == WM_COMMAND && iControl == LOWORD(wParam) && iEvent ==
>>>> HIWORD(wParam)) \
>>>> { \
>>>> vfunc(HIWORD(wParam), LOWORD(wParam), (HWND)lParam); \
>>>> lResult = 0; \
>>>> return TRUE; \
>>>> }
>>>>
>>>> and so on....
>>>>
>>>> Is it possible to replace this C++ Macros with D2 Mixins and compile
>>>> time manipulation of strings ?
>>>> How ?
>>>> Thanks, Bjoern
>>> And I really wonder myself how to (probabely) replace this stuff using
>>> Tango's Signal Slot implementation.... but I guess I miss something;
>>
>> With enough CTFE, you could do it. I've actually been thinking about
>> making a generator ctfe compiler (but haven't got *any* free time at the
>> moment).
>>
>> If I were doing this, I'd probably try something along these lines:
>>
>> mixin(wxMsgMap(`
>> on(id1) handler1;
>> on(id2) handler2;
>> on(id3..id6) handler3;
>> `));
>>
>> Parsing that shouldn't be too difficult. Of course, there are other
>> ways of constructing this:
>>
>> mixin wxMsgMap!(
>> OnMessage!(id1, handler1),
>> OnMessage!(id2, handler2),
>> OnMessage!(id3, id6, handler3)
>> );
>>
>> Where wxMsgMap takes a tuple of templated OnMessage structs.
>>
>> Just some ideas.
>>
>> -- Daniel
>
> Thanks Daniel,
> I am afraid I am not able to follow your suggestion...Can you figure it
> out please ? // I mean your second solution
>
> However, let's say I'll use D template mixins instead of C macros
>
> // The known parameters as follows
> virtual BOOL NewMsgProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM
> lParam,LRESULT lResult)
>
> So :
> #define ON_MESSAGE_RANGE(MsgF, MsgL, vfunc) \
> if(uID >= MsgF && uID <= MsgL) \
> { \
> lResult=vfunc(uID, wParam, lParam); \
> return TRUE; \
> }
>
>
> // Replaced with Template Mixin
>
> Template ON_MESSAGE_RANGE(M1, M2, F) (M1 MsgF, M2 MsgL, F function(...)
> dg )
> {
> typeof(dg) dg_m;
> if(uID >= MsgF && uID <= MsgL)
> {
> lResult = dg_m(uID, wParam, lParam);
> return TRUE;
> }
> }
>
> is a valid ? I guess - F function(...) dg is not.
> Bjoern
Okay, I think I have to works with delegates instead, bause I have to
work on class-members.
probabely :
Template ON_MESSAGE_RANGE(M1, M2, D) (M1 MsgF, M2 MsgL, D delegate(...) dg )
{
if(uID >= MsgF && uID <= MsgL)
{
lResult = dg(uID, wParam, lParam);
return TRUE;
}
}
Is a reasonable solution...
However, I am not sure.
More information about the Digitalmars-d-learn
mailing list