请参考TSpinEdit告诉我,这个控件的右侧按钮的鼠标指针是标准的,我继承实现的控件怎么就不是呢?

解决方案 »

  1.   

    在private中override WM_SETCURSOR消息
    procedure WMSetCursor(var Msg: TWMSetCursor); message WM_SETCURSOR;代码可以这么写
    var
      P: TPoint;
    begin  //缺省情况下,edit控件会把光标变为I_bar,但我们把光标移到按钮位置时
      //需要把它设为箭头  //得到当前光标位置
       GetCursorPos(P);
      if PtInRect(Rect(Width - FButtonWidth - 4, 0, ClientWidth, ClientHeight), ScreenToClient(P)) then
        Windows.SetCursor(LoadCursor(0, Idc_Arrow))
      else
        inherited;
    end;
      

  2.   

    txinfo(冰炎两重天) :很好。不过再问一下:我看到TSpinEdit好像并没有类似的东西,可以告诉我TSpinEdit是怎么做的吗?多谢多谢。
      

  3.   

    TSpinEdit实际上是一个复合控件,它由一个TCustomEdit和2个TSpeedButton组成,所以光标移到按钮上时,会自动变为箭头利用复合控件也是用来创建新控件的一种通用做法
    而如果想在一个TCustomEdit里自己画按钮,就可以考虑使用我说的方法
      

  4.   

    我不是自己自己画按钮,我觉得我的做法和TSpinEdit的几乎是一样的,从CustomEdit继承在Create中创建一个SpeedButton,但是如果不处理SetCursor消息的话,它的指针就是I_bar。为什么?再次骚扰,多谢多谢
      

  5.   

    也许你这个组件的speedbutton是放在TCustomEdit里了吧,只不过用TSpeedButton来覆盖住TCustomEdit的最右边一部分,这样光标放在按钮上时它其它还是认为当前的控件是TCustomEdit本身,你应该把speedbutton放在TCustomEdit之外,这样试一下?
      

  6.   

    是的,我的SpeedButton的Parent是TCustomEdit,但是TSpinEdit也是这样啊,而且我确实希望是放在里面的。再次骚扰,多谢多谢
      

  7.   

    秘密就在这里:
    procedure TSpinEdit.CreateWnd;
    begin
      inherited CreateWnd;
      SetEditRect; *******看一看源码吧
    end;
      

  8.   

    谢谢txInfo,我看过源代码了,而且将它的源代码拷出来试了多次,最后的发现是:
    秘密在它使用的TSpinEdit上,TSpinEdit是从TWincontrol继承来的,然后在其中Create两个SpeedButton,然后用SetBounds将这个SpeedButton画到指定的位置上。由此可以看出只要从TWincontrol继承来的东东就是默认的Arrow指针--我得臆测,尚待检验
      

  9.   

    不好意思,仔细看了一下,的确是跟CreateWnd无关
    感觉TCustomEdit的光标是I_Bar,我怀疑是在TCustomEdit.CreateParams那里有
    这么一句话:CreateSubClass(Params, 'EDIT');
    不过不好测试,等高人说明了如果方便,你可以把你的控件代码发过来我看一下 [email protected]