首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

妖哥,热键处理消息 中加载组件的事件 编译不通过,请见教

2013-12-30 
妖哥,热键处理消息 中加载组件的事件 编译不通过,请赐教!各位大虾们,我做了一个全局热键,然后想在热键里面

妖哥,热键处理消息 中加载组件的事件 编译不通过,请赐教!
各位大虾们,我做了一个全局热键,然后想在热键里面尝试加载一个按钮组件的事件,但是编译不通过,不知道是什么原因,请大侠们赐教!



//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{  //注册系统热键
   if(!RegisterHotKey(Handle,2000,MOD_CONTROL,VK_F1))
        //这里注册的热键是Ctrl+F1
        ShowMessage("热键注册失败");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   UnregisterHotKey(Handle, 2000);//退出程序时注销热键
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnHotKey(TMessage &Message)
{
    TForm::Dispatch(&Message);

    Form1->BitBtn1Click(Sender);   //进入窗口中的按钮事件(编译出错)

    MessageBox(Handle,"这是通过系统热键产生的信息!","信息提示",MB_OK);
}

[解决办法]
提示不是很清楚了么,没有 Sender 这个变量,在你的程序上下文中也没有这个变量。
改成
Form1->BitBtn1->Click();
[解决办法]
哪来“Sender不是模拟鼠标点击动作的变量的么” 这种说法
你得先搞清楚Windows 的消息机制这些基本原理,不然只能纠结在这个Sender上

你要么 Form1->BitBtn1->Click();
要么 Form1->BitBtn1Click(BitBtn1);
[解决办法]
也可以通过发消息
PostMessage(btn1->Handle,WM_LBUTTONDOWN, MK_LBUTTON, 0);
PostMessage(btn1->Handle,WM_LBUTTONUP, MK_LBUTTON, 0);


[解决办法]
你要是懒得一页书都不想看,那就只能在门外慢慢煎熬了

我就简单说两句


// 如果收到点击消息,这个 btn1Click 函数将被调用,
// btn1Click 函数就是系统收到某个消息后用来响应消息处理的回调函数
void __fastcall TForm1::btn1Click(TObject *Sender)
{
  /*
    Sender 顾名思义,表示一个消息的发送方,这是个Sender的类型是
    VCL 的根 TObject(所有VCL对象的基类),然后将这个TObject类型转为
    某个具体的类型(用 dynamic_cast 操作符进行转换)

    btn1Click 函数的形参Sender被声明为TObject类型是为了方便,TObject是所有类型的基类,
    这样就不用为每一种回调函数(事件处理函数)的参数声明各种类型:
    label1Click(TLabel* sender)
    formCreate(TForm1* sender)
    ...
    上面的可以统一改为 CtrolEvent(TObject* sender)
    具体中转为期望的类型就可以了    */

   TWinControl* ctrl;   // TWinControl 类是所有可视化控件的基类,TButton也是其派生类
   ctrl = dynamic_cast<TWinControl*>(Sender);
   // TWinControl 有个 Name 属性,所有控件都继承了这个属性,TButton当然也有
   if (ctrl) ShowMessage("点击了控件:" + ctrl->Name);
}
//---------------------------------------------------------------------------
// 模拟点击 btn1
void __fastcall TForm1::btn2Click(TObject *Sender)
{
   /* WM_LBUTTONDOWN 消息表示鼠标左键按下,
    WParam 为 MK_LBUTTON ,表示按下的是左键
    LParam 表示发生点击的坐标点,这里不需要,暂为0   */
   PostMessage(btn1->Handle,WM_LBUTTONDOWN, MK_LBUTTON, 0);
   // WM_LBUTTONUP 表示按键弹起,按下->弹起 表示了一个 Click 动作
   PostMessage(btn1->Handle,WM_LBUTTONUP, MK_LBUTTON, 0);

   /* VCL 对各种消息响应进一步细化,包装为各种事件处理函数,
    如果是 OnClick 目的是只要知道是一个左键点击就可以了,至于点击的坐标点在哪之类的不管.
    如果是 OnKeyDown 则要关心更多的细节,比如要知道按下的左键、右键还是中间,和按下的坐标位置 */
}

热点排行