У меня используется двоичный поиск в предварительено отсортированном массиве:
Handler *ph = lower_bound( hs, he, vh, _less_by_id ); — смотрите сырцы stl
это работает не намного медленне (а может и быстрее. я не проверял {это мне неинтересно})
К тому же поиск сообщения в карте/свитче это не самое узкое место в программах.
И давайте не будем разводить флейм типа SWL vs WTL, макросы vs шаблоны. Здесь показано как сделать БЕЗ макросов, другой стиль програмирования демонстрируется.
Насчет убогости win32 я уже сказал, что это мое личное отношение.