CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

如何手动显式地产生一个事件,高分!!!

楼主goldolphin(心向天空)2002-07-29 21:58:50 在 C++ Builder / 基础类 提问

BCB的事件与Windows的消息是一一对应的吗?  
  有提供发送事件的函数吗?  
  还是要用SendMessage,PostMessage...  
  拜托。 问题点数:100、回复次数:12Top

1 楼kingcaiyao(aking)回复于 2002-07-29 23:44:15 得分 20

首先在BCB中,事件有两种类型:  
  一类是TNotifyEvent,这类事件通常是对WINDOWS消息的封装,它的定义是这样的:  
  typdef   void   __fastcall   (__closure   *TNoityEvent)(TObject   *Sender);  
  它只有一个参数,即事件的发送者  
  另一类事件是自定义事件:  
  typedef   void   __fastcall   (__closure   TMyEvent(TObject   *Sender,bool   &Done)  
  BCB的事件处理是一种委托处理模型,即是说应用程序接受到消息后将对这个消息的处理交给事件处理函数来处理。事件处理函数是一个指针。  
   
  没有发送事件的函数,你发送相应的消息(比如说向当前活动窗体发送WM_LBUTTONDOWN,就会触发OnClick事件),就会触发相应的事件,如果没有事件与之对应,VCL会采用默认的处理。Top

2 楼gfh21cn(葛凤华)回复于 2002-07-30 07:21:20 得分 10

同意kingcaiyao(AKing)  
   
  事件函数是可以复制的。  
  你象OnKeyDown事件,我们可以做个函数myKeyDown();[参数要一样]  
  然后OnKeyDown=myKeyDown;  
  这样就相当于在WM_KEYDOWN的消息映射到我的那个函数里去了。  
   
   
   
  Top

3 楼lj_csdn(大笨蛋)回复于 2002-07-30 08:28:58 得分 0

直接执行也可以。  
  如定义了Button1click(Sendor)  
   
  某个地方要执行该动作  
      Button1click(NULL);Top

4 楼xiaoguoru(肖干)回复于 2002-07-30 08:41:11 得分 20

首先在窗体的头文件的Protected里声明一个如下结构:  
          BEGIN_MESSAGE_MAP  
            MESSAGE_HANDLER(WM_SYSCOMMAND,TWMMenuSelect,SystemMenuCommand);  
          END_MESSAGE_MAP(TForm);//声明一个系统菜单操作消息.其中WM_SYSCOMMAND为一消息标识,TWMMenuSelect为一个对应的消息结构,SystemMenuCommand为自定义消息处理函数.它的声明也在Protected里,声明如下:  
          MESSAGE   void   __fastcall   SystemMenuCommand(TWMMenuSelect   &Msg);  
  它在.cpp文件里的实现如下  
          void   __fastcall   TfrmMain::SystemMenuCommand(TWMMenuSelect   &Msg)  
  {  
    TForm::Dispatch(&Msg);  
    if(Msg.IDItem==200)  
    {  
      TfrmAbout   *frmAbout=new   TfrmAbout(this);  
      frmAbout->ShowModal();  
      delete   frmAbout;  
    }  
  }Top

5 楼Bird1945(没有钱,我拿什么来爱你?)回复于 2002-07-30 08:44:49 得分 10

要用SendMessage和PostMessage  
   
  BCB没有提供发消息的函数.  
   
  Top

6 楼goldolphin(心向天空)回复于 2002-07-30 10:35:45 得分 0

如这个事件句柄,是自定义事件吧?怎么查到它的消息ID,帮助里没找到,要产生这样一个事件,该怎么办?  
  typedef   void   __fastcall   (__closure   *TGetSiteInfoEvent)(System::TObject  
  *   Sender,   TControl*   DockClient,   Types::TRect   &InfluenceRect,   const   Types::TPoint   &MousePos,   bool   &CanDock);Top

7 楼kingcaiyao(aking)回复于 2002-07-30 11:47:44 得分 20

没错,你上面写的事件是自定义事件。要产生这样一个事件,如果你在自已写控件时可以这样:  
  //定义一事件指针  
  typedef   void   __fastcall   (__closure   *TGetSiteInfoEvent)(System::TObject  
  *   Sender,   TControl*   DockClient,   Types::TRect   &InfluenceRect,   const   Types::TPoint   &MousePos,   bool   &CanDock);  
   
  class   TMyControl::public   TCustomControl  
  {  
    private:  
      TGetSiteInfoEvent   FOnYourEvent;  
    //   Other   Fundamental   members  
    public:  
          //public   methods    
             
    protected:  
        virtual   void   __fastcall   CreateWnd();  
        .....  
        virtual   void   __fastcall   DoMyControl(TObject   *Sender,TControl   *DockClient,.......);  
        __published:  
            __property   TGetSiteInfoEvent   OnYourEvent={read=FOnYourEvent,write=FOnYourEvent};  
  }  
   
  //由上面定义的虚拟方法触发这个事件  
  void   __fastcall   DoMyControl(TObject   *Sender,TControl   *DockClient,....)  
  {  
        if(FOnYourEvent)  
        {  
              FOnYourEvent(this,DockClient,....);  
        }  
  }  
  Top

8 楼kingcaiyao(aking)回复于 2002-07-30 11:48:31 得分 0

没错,你上面写的事件是自定义事件。要产生这样一个事件,如果你在自已写控件时可以这样:  
  //定义一事件指针  
  typedef   void   __fastcall   (__closure   *TGetSiteInfoEvent)(System::TObject  
  *   Sender,   TControl*   DockClient,   Types::TRect   &InfluenceRect,   const   Types::TPoint   &MousePos,   bool   &CanDock);  
   
  class   TMyControl::public   TCustomControl  
  {  
    private:  
      TGetSiteInfoEvent   FOnYourEvent;  
    //   Other   Fundamental   members  
    public:  
          //public   methods    
             
    protected:  
        virtual   void   __fastcall   CreateWnd();  
        .....  
        virtual   void   __fastcall   DoMyControl(TObject   *Sender,TControl   *DockClient,.......);  
        __published:  
            __property   TGetSiteInfoEvent   OnYourEvent={read=FOnYourEvent,write=FOnYourEvent};  
  }  
   
  //由上面定义的虚拟方法触发这个事件  
  void   __fastcall   DoMyControl(TObject   *Sender,TControl   *DockClient,....)  
  {  
        if(FOnYourEvent)  
        {  
              FOnYourEvent(this,DockClient,....);  
        }  
  }  
  Top

9 楼kingcaiyao(aking)回复于 2002-07-30 11:50:59 得分 0

没错,你上面写的事件是自定义事件。要产生这样一个事件,如果你在自已写控件时可以这样:  
  //定义一事件指针  
  typedef   void   __fastcall   (__closure   *TGetSiteInfoEvent)(System::TObject  
  *   Sender,   TControl*   DockClient,   Types::TRect   &InfluenceRect,   const   Types::TPoint   &MousePos,   bool   &CanDock);  
   
  class   TMyControl::public   TCustomControl  
  {  
    private:  
      TGetSiteInfoEvent   FOnYourEvent;  
    //   Other   Fundamental   members  
    public:  
          //public   methods    
             
    protected:  
        virtual   void   __fastcall   CreateWnd();  
        .....  
        virtual   void   __fastcall   DoMyControl(TObject   *Sender,TControl   *DockClient,.......);  
        __published:  
            __property   TGetSiteInfoEvent   OnYourEvent={read=FOnYourEvent,write=FOnYourEvent};  
  }  
   
  //由上面定义的虚拟方法触发这个事件  
  void   __fastcall   DoMyControl(TObject   *Sender,TControl   *DockClient,....)  
  {  
        if(FOnYourEvent)  
        {  
              FOnYourEvent(this,DockClient,....);  
        }  
  }  
  Top

10 楼goldolphin(心向天空)回复于 2002-07-30 12:30:16 得分 0

还有一个问题,  
  MDI窗口,设为可停泊的,当把它拖到个DockSite如ControlBar上,则进行泊定。要实现的是将窗口中的一个控件如TTreeView合到ControlBar上,应该怎样操作。  
  当要把Treeview从ControlBar中拖出来,又该怎么操作。Top

11 楼goldolphin(心向天空)回复于 2002-07-30 18:21:52 得分 0

自己给自己UP!!!Top

12 楼mikesome()回复于 2002-07-30 20:01:14 得分 10

不要用SendMessage和PostMessage,当然这两个用起来也很简单,看看帮助即可。你如果要调用一个事件,那就直接写那个事件的对应函数名即可,参数可以为NULL,或自己特别设置Top

13 楼goldolphin(心向天空)回复于 2002-07-30 20:09:47 得分 0

楼上的错了我的意思了~~~~  
  如果要发生的事件不完全是我来响应,还要系统自动完成一些工作,那怎么办?比如仍以上面提到的泊定为例。窗口合并不在我的消息处理函数中。  
  但是我希望发送事件使系统对我的窗口进行合并等操作。Top

14 楼cdws222(二当家)回复于 2002-07-30 20:25:38 得分 10

直接执行它的方法就行了,比如点击按钮   Button1->Click();Top

相关问题

  • C#的Socket编程问题,为何手动关闭Socket连接回导致一个接收数据事件的产生?
  • C#中怎么样可以直接编写一个事件响应程序,象VB一样,而不必手动编写事件响应的声明部分。
  • 如何手动触发dropdownlist的 SelectedIndexChanged事件啊
  • 请教:可否在Button_Click后不产生Post事件?一定给分
  • [请教高手]动态生成的RadioButton控件,触发事件的问题?
  • DCOM 中怎么不能产生事件?
  • VC++中,窗口的最大化,最小化和关闭,分别触发什么事件,如何判断这些事件是否产生
  • 怎样在 onreadystatechange 事件中找到产生事件的对象?
  • 大家好!请问结束任务时会产生什么事件?最后20分了!(寂寞寒冰)
  • 菜鸟求救:关于动态产生的按钮怎样编辑它的点击事件,给分100

关键词

  • 函数
  • 消息
  • 指针
  • 控件
  • fonyourevent
  • dockclient
  • 事件
  • tgetsiteinfoevent
  • fastcall
  • domycontrol

得分解答快速导航

  • 帖主:goldolphin
  • kingcaiyao
  • gfh21cn
  • xiaoguoru
  • Bird1945
  • kingcaiyao
  • mikesome
  • cdws222

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo