网站建设行吗,重启服务器 wordpress,网站为什么具有网络营销价值,大连企业需要做网站规范的BCB过程利用Application-Run()进去消息循环#xff0c;在Application的ProcessMessage措施中#xff0c;利用PeekMessage措施从消息队列中提取消息#xff0c;并将此消息从消息队列中移除。然后ProcessMessage措施察看是否存在Application-OnMessage措施。存在…规范的BCB过程利用Application-Run()进去消息循环在Application的ProcessMessage措施中利用PeekMessage措施从消息队列中提取消息并将此消息从消息队列中移除。然后ProcessMessage措施察看是否存在Application-OnMessage措施。存在则转入此措施处理消息。尔后再将处理过的消息发放给过程中的各个对象。至此WndProc措施收到消息并举行处理。万一有无法处理的交给重载的Dispatch措施来处理。要是还不能处理的话再交给父类的Dispatch措施处理。最后Dispatch措施切实上将消息转入DefaultHandler措施来处理。嘿嘿切实上你一样能够重载DefaultHandler措施来处理消息然而太晚了一点我想未曾人甘心最后一个处理消息吧。 1TApplication的OnMessage事件的利用在CBuilder开发的利用过程中任何窗体接收到一个Windows消息都会引发顺次OnMessage事件因而能够穿越相应TApplication对象的OnMessage事件来捉拿任何发送给本过程的Windows消息。 OnMessage的事件的处理函数原型如下typedef void __fastcall (__closure *TMessageEvent ) (tagMsg Msg,bool Handled );这个处理函数有两个参数其中参数Msg表示的是被截获的消息而参数Handled则用来指示本消息是否曾经处理告终。在过程中能够穿越设置参数Handled为true以避免后续的过程处理这个消息反之把Handled设为false则批准后继过程继续处理这个消息。必需当心的是OnMessage事件仅仅接受发送到消息队列的消息而直接穿越API函数SendMessage发送给窗口函数的消息将不会被截获。另外当过程运行的时候OnMessage事件被引发的频率有可能极其高因而这个事件的处理函数代码厉行工夫将直接波及到全副过程的运行效率。 2利用消息照射截获消息CBuilder的VCL供给了对大多数Windows消息的处理机制对于等闲的利用过程是足够了。然而VCL也不是森罗万象的。有的情形下过程必需处理那些VCL处理未曾处理的Windows消息可能过程必需屏障某些特定的消息时则就必需过程员自己捉拿Windows消息。为此CBuilder供给了一种消息照射机制穿越消息照射过程能将特定的Windows消息与对应的处理函数联系起来当窗口捉拿到这个消息时就会积极调用对应的处理函数。利用消息照射有一下几个环节1 消息照射表把某些消息的处理权交给自定义的消息处理函数。这么的消息照射列表该当位于一个组件类的定义中它以一个未曾参数的BEGIN_MESSAGE_MAP 宏开始以END_MESSAGE_MAP宏告终。END_MESSAGE_MAP宏的单一参数该当是组件的父类的名字。通常情形下这个所谓的父类指的即便TForm。在宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间插入一个可能是多个MESSAGE_HANDLER 宏。MESSAGE_HANDLER宏将一个消息句柄和一个消息处理函数联系在同时。MESSAGE_HANDLER宏有三个参数Windows消息名、消息构造体名和对应的消息处理函数名。其中消息构造体名既能够是通用的消息构造体TMessage也能够是特定的消息构造体例如TWMMouse。在利用消息照射的时候要当心以下两点a一个窗口类定义中只能有一个消息照射表。b消息照射定然位于它所引用的所有消息处理函数声明的后面。2 在窗口类中声明消息处理函数这里的消息处理函数名和参数都定然和对应的MESSAGE_HANDLER宏统一。一个标兵的消息处理函数的声明如下void __fastcall 消息处理函数名消息构造体名 Message;例如void __fastcall WMNchitTest(TMessage message);3 告终消息处理函数消息处理函数的编制和等闲的函数没什么太大的差异单一不同的是等闲在此函数的最后要加上一条语句 TForm::Dispatch(Message)以告终VCL对于消息的默认处理。万一未曾这一句消息将会被全面堵截在某些情形下VCL可能会因为得不到消息而无法工作。 3重载WndProc函数在某些情形下过程必需捉拿可能屏障某些特定的消息这时能够用前面推荐的消息照射的措施。当然这种措施也不是单一的也能够穿越重载窗口函数WndProc来告终。因为系统将在调用函数Dispatch派发消息之前调用窗口函数WndProc因而能够穿越重载函数WndProc获得一个在分配消息之前过滤消息的时机。这个消息处理的窗口函数的原型如下virtual void __fastcall WndProc(TMessage Message);例如翔实请看NowCane452.com的例子void __fastcall TForm1::WndProc(TMessage Message){PCOPYDATASTRUCT pMyCDS;if(Message.Msgg_MyMsg){ShowMessage(收到登记消息wParamIntToStr(Message.WParam) lParamIntToStr(Message.LParam));Message.Result0;//消息处理的收获当然在本例中没故含义。}else if(Message.Msgg_MyMsg1){Application-MessageBoxA((char *)Message.LParam,收到发送方的字符串,MB_OK);}else if(Message.MsgWM_COPYDATA){pMyCDS (PCOPYDATASTRUCT)Message.LParam;Application-MessageBoxA((char *)pMyCDS-lpData,收到发送方的字符串,MB_OK);} TForm::WndProc(Message);//其他的消息继续递交下去}乍看起来,这和重载Dispatch措施好象差不多。但切实上还是有差异的。差异就在前后次序上消息是先交给WndProc来处理最后才调用Dispatch措施的。这么重载WndProc措施能够比重载Dispatch措施更早一点点获得消息并处理消息。 4Application-HookMainWindow措施万一您计划利用Application-OnMessage来捉拿所有发送至您的利用过程的消息的话您可能要绝望了。它无法捉拿利用SendMessage直接发送给窗口的消息因为这不穿越消息队列。您可能会说我能够直接重载TApplication的WndProc措施。呵呵不能够。因为TApplication的WndProc措施被Borland声明为静态的从而无法重载。显而易见这么做的起因很可能是Borland担心其所带来的副作用。那该如何是好呢察看TApplication的WndProc的pascal源码能够看到procedure TApplication.WndProc(var Message: TMessage);... // 节俭篇幅这里与主题无关代码略去begintryMessage.Result : 0;for I : 0 to FWindowHooks.Count - 1 doif TWindowHook(FWindowHooks[I]^)(Message) then Exit;... // 节俭篇幅这里与主题无关代码略去WndProc措施一开始先调用HookMainWindow挂钩的自定义消息处理措施然后再调用缺省过程处理消息。这么利用HookMainWindow就能够在WndProc其中接加入自己的消息处理措施。利用这个措施响应SendMessage发送来的消息很管用。最后提醒一下利用HookMainWindow挂钩尔后定然要对应的调用UnhookMainWindow卸载钩子过程。给个例子void __fastcall TForm1::FormCreate(TObject *Sender){Application-HookMainWindow(AppHookFunc);}//---------------------------------------------------------------------------bool __fastcall TForm1::AppHookFunc(TMessage Message){bool Handled ;switch (Message.Msg){case WM_CLOSE:mrYesMessageDlg(xg.sy-xghg.comReally Close??, mtWarning, TMsgDlgButtons() mbYes Handled false : Handled true ;break;}return Handled;}//---------------------------------------------------------------------------void __fastcall TForm1::FormDestroy(TObject *Sender){Application-UnhookMainWindow(AppHookFunc);}//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){SendMessage(Application-Handle,WM_CLOSE,0,0);}//--------------------------------------------------------------------------- 5自己发送消息利用过程也能够像Windows系统一样在窗口可能是组件之间发送消息。CBuilder为此供给了几种门径利用函数TControl::Perform可能API函数SendMessage和PostMessage向特定的窗体发送消息可能是利用函数TWinControl::Broadcast和API函数BroadcastSystemMessage广播消息。 Perform函数的作用即便将指定的消息递交给TControl的WndProc过程实用于所有由TControl类派生的对象Perform原型如下int __fastcall Perform(unsigned Msg, int WParam, int LParam);要等到消息处理尔后才归来。 在统一个利用过程的不同学体和控件之间利用函数Perform是极其方便的。然而这个函数是TControl类的成员函数。也即便说利用它时过程定然懂得这个接受消息的控件的实例。而在众多情形下过程并不懂得这个接受消息的窗体的实例而只是懂得这个窗体的句柄例如在不同利用过程的窗体之间发送消息就属于这种情形。这时函数Perform显明无法利用取而代之的该当是函数SendMessage和PostMessage。 函数SendMessage和PostMessage的功能大约上一样它们都能够用来向一个特定的窗口句柄发送消息。重要的差异是函数SendMessage直接把一个消息发送给窗口函数等消息被处理尔后才归来而函数PostMessage则只是把消息发送到消息队列然后就即刻归来。这两个函数的原型声明离别如下LRESULT SendMessageHWND hWndUINRT MsgWPARAMwParamLPARAMlParamBOOL PostMessageHWND hWndUINT MsgWPARAMwParamLPARAMlParam能够看到这两个函数参数同函数Perform极其相仿只是添置了一个hWnd参数用以表示目标窗口的句柄。 Broadcast和BroadcastSystemMessage函数Broadcast实用于所有由TWinControl类派生的对象它能够向窗体上的所有子控件广播消息。其函数原型如下void __fastcall Broadcastvoid *Message;能够看到这个函数只有一个Message参数它指向被广播的TMessage种类的消息构造体。函数Broadcast只能向CBuilder利用过程中的指定窗体上的所有子控件广播消息万一要向系统中其他利用过程可能窗体广播消息函数Broadcast就无能为力了。这时能够利用API函数BroadcastSystemMessage这个函数能够向任意的利用过程可能组件广播消息。其函数原型如下long BroadcastSystemMessageDWORD dwFlagsLPWORD lpdwRecipientsUINT uiMessage,WPAREM wParam,LPARAM lParam;转载于:https://www.cnblogs.com/hanny/p/7782935.html