- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 
                        map<HANDLE,VRwnd*> windows;
LRESULT WndProc(HANDLE h,UINT ui,WPARAM w,LPARAM m)try{
         return windows.at(h)->Process(ui,w,l);
}catch(...){ return 0;}
class VRwnd{
    HANDLE h;
protected:
    map<UINT,function<LPRESULT(WPARAM,LPARAM)> handlers;// заполняется в конструкторе
    map<int,VRwnd*> idChilds;
    map<HANDLE,VRwnd*> Childs;
public:
     virtual ~VRwnd();
     LRESULT Process(UINT ui,WPARAM w,LPARAM m)try{
                PreProcess(w,l);// сами решайте, давать фильтру на что-то влиять, или нет.
                if(ui==WM_NOTIFY) return WmNotify(w,m) ;
                if(ui==WM_NOTIFY) return WmCommand(w,m) ;
               return handlers.at(ui).second(w,l);
     }
      catch(...){return 0;}
      LPRESULT WmNotify(WPARAM w,LPARAM m){...}
      LPRESULT WmCommand(WPARAM w,LPARAM m){...}
      virtual LPRESULT PreProcess(WPARAM w,LPARAM m){return 0;}
};
                                 
        
>if(ui==WM_NOTIFY) return WmNotify(w,m) ;
>if(ui==WM_NOTIFY) return WmCommand(w,m) ;
Вот этого я не понял.
>WPARAM w,LPARAM m
>PreProcess(w,l); //по идее l - LPARAM
но l нигде не объявлен.
Либо код нерабочий, либо слишком порезан, в любом случае телепаты не читают раздел С++.
Уже в этом месте становится забавно. Кто писал свои обёртки над ВинАПИ - поймёт.
Кстати, как выгоднее хранить доп.указатель и получать его по дескриптору - через карту, или через специальное поле, предоставляемое ОС?