比如在对话框的消息处理函数中,
INT_PTR WINAPI Dlg_Proc(...)
{
switch(uMsg){
chHANDLE_DLGMSG(hwnd,WM_CLOSE,Dlg_OnClose);//这句可以如何替换?
....
}

解决方案 »

  1.   

    每个窗口都有自己的窗口过程,这个封装在TWinControl里面吧。
    GUI线程的消息泵会自动发送到这个窗口的窗口过程去吧。呵呵,不要用MFC的方式来理解VCL,MFC的class wizard可以为你自动声场重载窗体指定消息的函数,实际上那是afx的宏命令挂接上去。在VCL中,你可以在每个你自己窗体的class定义里面直接定义一个过程,后面有message关键字加消息常量,这样就重载了这个消息了。
    当然你还可以用TApplicaton的OnMessage属性,来过滤主线程的所有windows消息,不过要处理好,不然CPU的占用率怕上居高不下
      

  2.   

    若你真的了解Window 消息派送機制,就不會這么問了。不論是delphi或者VC,在大方向都遵守window規定。架構上面,內部細節或許有不同的實現,比如收到一個消息後,在內部要怎么走。你所舉的例子是窗口過程,不論哪種窗口程序,都會有的。窗口過程本身就是 消息分流器的載體。
      

  3.   

    窗口消息,可以参考下windows程序设计第五版
      

  4.   

    DELPHI是结合VMT来分派消息的,在TObject类中有Dispatch来实现,整个程序的消息分发是由TApplication来实现的。
      

  5.   

    当然有,比如oldWNDProc: LRESULT;
    procedure SetMyKeyCallBackOfComboBox;
      function InitWndProcCombox(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
      begin
        if (msg=WM_KEYDOWN) and ((WPARAM=39) Or (WPARAM=37)) then
          begin
            if (WPARAM=37) then EdtHeTongCode.SetFocus
              else EdtHeTongYear.SetFocus;
            result:=0;
          end
        else
          result:= CallWindowProc(TFNWndProc(oldWNDProc),hWnd,Msg,wParam,lParam)
      end;
    begin
      oldWNDProc:=SetWindowLong(Handle, GWL_WNDPROC, Longint(@InitWndProcCombox));
    end;