如果我在StdCtrls单元中的TComBoBox加了一个属性,
 property OnMouseDown;
但是如何让它出来在属性面板中?好像加了跟没加一样?
是不是要编译一下,怎么编译? 我现在要捕获TComboBox的鼠标右键,怎么做呀?它没有MouseDown事件。当右键单击ComboBox时,我要显示另外一个窗体
急,,,求大家帮帮忙,UP一下也好。
在线等。。

解决方案 »

  1.   

    我真的推荐你看看《高手突破》 讲的很清楚了 
    你需要在published中声明这些属性的...
      

  2.   

    你要把这个控件换个名字重新注册到控见面板。直接修改VCL不是个好办法,因为很多bpl都是编译好的,你没办法修改。做消息映射。
    然后再消息函数里面写代码。  TComboBoxEx = class(TComboBox)
      private
        FRButtonDown: TNotifyEvent;
        procedure WMRButtonDown(var Message: TWMLButtonDown); message WM_RBUTTONDOWN;
      published
        property OnRButtonDown: TNotifyEvent read FRButtonDown write FRButtonDown;
    ......
      end;procedure TComboBoxEx.WMRButtonDown(var Message: TWMLButtonDown);
    begin
      if Assigned(FRButtonDown) then
        FRButtonDown(Self);
        
    end; 
      

  3.   

    发现 VCL没定义 TWMRButtonDown,改一下  TComboBoxEx = class(TComboBox)
      private
        FRButtonDown: TNotifyEvent;
        procedure WMRButtonDown(var Message: TWMMouse); message WM_RBUTTONDOWN;
      published
        property OnRButtonDown: TNotifyEvent read FRButtonDown write FRButtonDown;
    ......
      end;procedure TComboBoxEx.WMRButtonDown(var Message: TWMMouse);
    begin
      if Assigned(FRButtonDown) then
        FRButtonDown(Self);  
    end; procedure Register;
    begin
      RegisterComponents('Standard', [TComboBoxEx]);
    end;然后把这个控件注册了
      

  4.   

    同意,也就是自己做一个vcl继承自TComboBox
      

  5.   

    您好,大侠们,
    可我新建一个控件,还是不行呀,只是在combobox最边上时单击右键才有用的,
    如果右击combobox中间,就没有用,它出来的是window的那个copy,past那些功能。。
    麻烦大侠您再帮我看看,要如何做才能触发右键????
    好急。。
      

  6.   

    如果你想在那儿处理右键我估计就没这么简单了,至少要在它的WinProc函数里面写代码,我个人观点,尽量用现有的控件和大家熟悉的操作来完成界面。类似你的想法我觉得不一定非要这样。比如,我常常是采用在DBEdit或者ComboBox里面按空格来弹出菜单或者窗口。用友的是按F2弹出,尽量避免特殊的习惯。
      

  7.   

    试试如果把ComboBox的style改成csDropDownList行不行,我也同意 pazee(耙子)的观点
      

  8.   

    hkbarton的方法应该可以解决你说的问题的
      

  9.   

    hkbarton(宁静至远)(西南交大) ,兄弟的办法是可以的,
    但是必须要使ComboBox能编辑的,没办法。
    现在网上有的第三方控件都是没源码的,不敢用。
      

  10.   

    我这样做,可以实现左键提示的了。(一个朋友教我的),请大家看看,如何改成右键的。
    全部源码:unit ComboBoxExx;interfaceuses
      SysUtils, Classes, Forms, Windows, Messages, Controls, StdCtrls;type
      TComboBoxExx = class(TComboBox)
      private
        FOnEditMouseDown: TMouseEvent;
      protected
        procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
          ComboProc: Pointer); override;
      published
        property OnEditMouseDown: TMouseEvent read FOnEditMouseDown write  FOnEditMouseDown;    
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('ComEx', [TComboBoxEX]);
    end;{ TComboBoxEX }procedure TComboBoxEX.ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
      ComboProc: Pointer);
    begin
      if (ComboWnd = EditHandle) then
        with Message do
        begin
          if (Msg = WM_LBUTTONDOWN) or (Msg = WM_RBUTTONDOWN) then
            if Assigned(OnEditMouseDown) then
              OnEditMouseDown(self, TMouseButton(WParam), [ssLeft], LParamLo, LParamHi);
        end;
      inherited;
    end;end.
      

  11.   

    pazee:
    你说得对,他是判断了左右键,只是下面的语句中:
       if Assigned(OnEditMouseDown) then
              OnEditMouseDown(self, TMouseButton(WParam), [ssLeft], LParamLo, LParamHi);
      在运行只能有左键单击有效,而右键的单击还是捕获不到。
      

  12.   

    我仔细研究过,有可能他类似Tab键,系统先给处理了,而且没有把消息传下来,你需要在应用程序的WinProc里面捕获了,如果是这样,就复杂了。
      

  13.   

    那我可否覆盖WinProc,先处理我的事情,再Inherited行不行?
    不过WinProc 我还不是很清楚它的处理机制。
      

  14.   

    可以,你可以参考一下WinSDK编程的东西,就能明白WinProc的意义了。