В чём смысл оконной процедуры? Только просьба не отвечать: так принято, так нас учили, так нам приказал Microsoft. Хотелось бы логического обоснования. Есть опыты не использовать её?
1) Вместо DispatchMessage() можно разместить case
2) Вместо DispatchMessage() можно вызвать свою функцию с case
3) Если в main мы имеем информацию о времени и координатах курсора, то в оконной функции её уже нет (хотя, конечно, в lParam и wParam может и присутствовать).
Ах да, я начинаю изучать WinAPI и С++ (до этого пользовался Delphi и MatLab).
1 и 2. Что по вашему делает DispatchMessage? - она вызывает вашу оконную функцию где вы разместили case. Ну вызовите ее на прямую.
А если у вас несколько окон, нужно сначала найти подходящую оконную функцию. Этим и занимается DispatchMessage.
В том или ином виде, но оконная функция будет присутствовать в любом случае. Просто об этом уже подумали в микрософт и предусмотрели стандартный протокол работы.
3. В main вы можете иметь инофрмацию о сообщении прочитав это сообщение с помощью GetMessage или PeekMessage. А что дальше? Вызывайте на прямую вашу оконную функцию или вызовите DispatchMessage.
Все параметры для ручного вызова оконной процедуры у вас будут после GetMessage или PeekMessage их и передадите в оконную процедуру.
В библиотеках асинхронного ввода/вывода типа libuv/libev, которые так же требуют событийно управляемого программирования, так же присутствует цикл обработки сообщений/событий и есть свой аналог оконной функции. Так что это вполне обычный подход для подобного класса задач.
1,2) DispatchMessage не вызывает оконную ф-ю, т.к. это ф-я обратного вызова (её вызывает операционная система).
3) В том то и дело, что сообщение передается в ф-ю DispatchMessage, а в оконной ф-ии уже нет части информации.
Так что пока не вижу логики существующего подхода.