自己遇到到个不知道是不是问题的问题,就是事件是什么时候响应,或者触发的,自定义事件或者系统事件:
例如:以下是截取D7里的一段代码TDrawTabEvent = procedure(Control: TCustomTabControl; TabIndex: Integer;
    const Rect: TRect; Active: Boolean) of object;
TCustomTabControl = class(TWinControl)
  private
    FOnDrawTab: TDrawTabEvent;
  protected
    procedure DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean); virtual;
  property OnDrawTab: TDrawTabEvent read FOnDrawTab write FOnDrawTab;procedure TCustomTabControl.DrawTab(TabIndex: Integer; const Rect: TRect;
  Active: Boolean);
begin
  if Assigned(FOnDrawTab) then
    FOnDrawTab(Self, TabIndex, Rect, Active)
  else
    FCanvas.FillRect(Rect);
end;
我想问的是:DrawTab事件什么时候执行,也就是在什么条件下执行,如果该条件为A,那么为什么要在A条件下执行,从哪里可以看出来是在A条件下执行的.是不是系统已经定义好了,那么如果我要定义自己定义一个事件,那如何写呢?
大部分看懂我要问的是什么吧,看懂了就请参与回贴,谢了!

解决方案 »

  1.   

    这就不好说了当然是系统画的时候了不只是这个构件,所有的可视构件都大概是这样子的当系统有WM_PAINT消息发来的时候,构件会判断自己是不是需要重画,如果需要的话,就调用相应的函数来写如果想弄得再清楚一点,你可以看源代码,看看DRAWTAB过程到底都被谁调用过,具体的方法就不用说了吧,找到代码单元,用查找字符串啊================
    还有,你说的DRAWTAB事件,不太懂你的意思,ONDRAWTAB才是事件,DRAWTAB是个过程
      

  2.   

    看看这里
    procedure TCustomTabControl.CNDrawItem(var Message: TWMDrawItem);
    var
      SaveIndex: Integer;
    begin
      with Message.DrawItemStruct^ do
      begin
        SaveIndex := SaveDC(hDC);
        FCanvas.Lock;
        try
          FCanvas.Handle := hDC;
          FCanvas.Font := Font;
          FCanvas.Brush := Brush;
          DrawTab(itemID, rcItem, itemState and ODS_SELECTED <> 0);
        finally
          FCanvas.Handle := 0;
          FCanvas.Unlock;
          RestoreDC(hDC, SaveIndex);
        end;
      end;
      Message.Result := 1;
    end;