для какой цели в сигнатуре функций, подставляемых в макрос MESSAGE_HANDLER, присутствует параметр UINT uMsg? зачем он нужен? ведь создавая обработчик мы явно указываем идентификатор сообщения. единственное применение этой сигнатуры я вижу таким:
BEGIN_MSG_MAP(widget)
MESSAGE_HANDLER(WM_ERASEBKGND, OnPaint)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT uMsg, WPARAM, LPARAM, BOOL&)
{
if(uMsg == WM_ERASEBKGND)
{
// TO DO
}
else if(uMsg == WM_PAINT)
{
// TO DO
}
return TRUE;
}
но логично ли оно, такое применение? в нем мы делаем двойную проверку if(uMsg == WM_XXX), сначала внутри макроса, а затем внутри обработчика.
Здравствуйте, <Аноним>, Вы писали:
А>единственное применение этой сигнатуры я вижу таким:
Так и есть.
А>но логично ли оно, такое применение?
Именно такое не логично. Когда для нескольких сообщений один обработчик, то подразумевается некая общая работа. А номер сообщения проверяется для специфичных участков.
По-другому можно было бы записать так (приближённо):
я не совсем понял суть приведенного кода. может быть, речь шла о таком применении?
void OnCommonPaint(UINT uMsg, CDCHandle)
{
if(uMsg == WM_ERASEBKGND)
{
// TO DO ERASEBKGNDreturn TRUE;
}
// TO DO PAINTreturn FALSE;
}
LRESULT OnPaint(UINT uMsg, WPARAM, LPARAM, BOOL&)
{
CPaintDC dc(m_hWnd);
OnCommonPaint(uMsg, dc);
// specific functions
...
return 0;
}
LRESULT OnErase(UINT uMsg, WPARAM wParam, LPARAM, BOOL&)
{
// erase specific code
...
// common paint
OnCommonPaint(uMsg, (HDC)wParam);
return !0;
}
но, даже, если так, то зачем делать обобщенный обработчик (OnMsg(UINT, WPARAM, LPARAM, BOOL&)) в библиотеке с открытым кодом? почему не отдать решение неких общих, а на самом деле достаточно редких (частных), задач на откуп конечному разработчику?
например, полагая что макрос MESSAGE_HANDLER реализован так:
Здравствуйте, <Аноним>, Вы писали:
А>я не совсем понял суть приведенного кода. может быть, речь шла о таком применении?
Нет. Суть в том, что OnCommonPaint выполняет общую для paint & erase работу вне зависимости сообщения. Конечно, выбор paint & erase неудачен, но можно взять любые другие сообщения: WM_CLOSE & WM_QUERYENDSESSION, WM_DESTROY & WM_ENDSESSION, etc.
А>почему не отдать решение неких общих, а на самом деле достаточно редких (частных), задач на откуп конечному разработчику?
С этим согласен, по умолчанию этот параметр (сообщение) не нужен. С другой стороны, WTL — это достаточно тонкая прослойка. Хотите хардкора — есть atlcrack.h
А>конечный разработчик в любой момент времени сможет реализовать свой собственный макрос:
Да достаточно просто двух версий макроса положить в библиотеку, имхо. MESSAGE_HANDLER & CUSTOM_MESSAGE_HANDLER, например. Впрочем, см. выше про atlcrack.
Здравствуйте, Аноним, Вы писали:
А>для какой цели в сигнатуре функций, подставляемых в макрос MESSAGE_HANDLER, присутствует параметр UINT uMsg? зачем он нужен? ведь создавая обработчик мы явно указываем идентификатор сообщения. единственное применение этой сигнатуры я вижу таким:
...
Например здесь