大家看看我下面的程序有什么问题,是关于自定义提示窗口的

                            
可以编译通过,但执行不了,现把代码全部贴出:   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
          Label1:   TLabel;  
          Button1:   TButton;  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
      TMyHintWindow=class(THintWindow)  
      private  
      FActivating:Boolean;  
      FHDirection:Boolean;  
      FVDirection:Boolean;  
      procedure   WMEraseBkgnd(var   Message:  
      TWmEraseBkgnd);message   WM_ERASEBKGND;  
      protected  
      procedure   paint;override;  
      public  
      constructor   Create(AOwner:TComponent);override;  
      procedure   ActiveHint(Rect:TRect;const   AHint:string);  
      function   CalcHintRect(MaxWidth:Integer;const   AHint:string;AData:Pointer):TRect;override;  
      end;  
   
   
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
  constructor   TMyHintWindow.Create(AOwner:TComponent);  
  begin  
        inherited   Create(AOwner);  
        Color:=$80FFFF;  
        canvas.Font.Size:=14;  
  end;  
   
  procedure   TMyHintWindow.WMEraseBkgnd(var   Message:   TWmEraseBkgnd);  
  begin  
          Message.Result:=1;  
  end;  
   
  procedure   TMyHintWindow.paint;  
  Var  
  R,ArrowR,TextR:TRect;  
  RectRgn,TPolyRgn,ShadowRgn:HRgn;  
  AP:array[0..2]   of   TPoint;  
   
  begin  
      R:=ClientRect;  
      Inc(R.Left,2);  
      Inc(R.Top,2);  
      canvas.Font.Color:=clInfoText;  
      canvas.Brush.Color:=$80FFFF;  
      TextR:=R;  
      ArrowR:=R;  
      if   Fvdirection   then  
      begin  
            Inc(textR.Top,22);  
            arrowR.Bottom:=textR.Top;  
      end  
      else  
      begin  
            arrowR.Top:=arrowR.Bottom-22;  
            textR.Bottom:=arrowR.Top;  
      end;  
      if   Fhdirection   then  
      begin  
            if   Fvdirection   then  
                  begin  
                  AP[0]:=arrowr.TopLeft;  
                  AP[1].X:=arrowR.Left+10;  
                  AP[2].X:=Arrowr.Left+25;  
                  AP[1].Y:=arrowr.Bottom;  
                  AP[2].Y:=arrowr.Bottom;  
                  end  
            else  
                  begin  
                  AP[0].X:=arrowr.Left;  
                  AP[0].Y:=arrowr.Bottom;  
                  AP[1].X:=arrowR.Left+10;  
                  AP[2].X:=Arrowr.Left+25;  
                  AP[1].Y:=arrowr.top;  
                  AP[2].Y:=arrowr.top;  
                  end;  
        end  
        else  
        begin  
              if   Fvdirection   then  
              begin  
                  AP[0].X:=arrowr.Right;  
                  AP[0].Y:=arrowr.top;  
                  AP[1].X:=arrowR.Right-10;  
                  AP[2].X:=Arrowr.Right-25;  
                  AP[1].Y:=arrowr.bottom;  
                  AP[2].Y:=arrowr.bottom;  
              end  
        else  
                  begin  
                  AP[0]:=arrowr.bottomRight;  
                  AP[1].X:=arrowR.Right-10;  
                  AP[2].X:=Arrowr.Right-25;  
                  AP[1].Y:=arrowr.top;  
                  AP[2].Y:=arrowr.top;  
                  end;  
        end;  
   
   
  RectRgn:=CreateRoundRectRgn(TextR.Left,textr.Top,textr.Right,textr.Bottom,10,10);  
  TPolyRgn:=CreatePolygonRgn(AP,3,WINDING);  
  CombineRgn(RectRgn,RectRgn,TPolyRgn,RGN_OR);  
   
  FillRgn(canvas.Handle,RectRgn,canvas.Brush.Handle);  
  DeleteObject(RectRgn);  
  DeleteObject(TPolyRgn);  
   
  DrawText(canvas.Handle,PChar(Caption),-1,TextR,DT_VCENTER   OR   DT_CENTER   OR   DT_NOPREFIX   OR   DT_WORDBREAK   );  
  end;  
   
  procedure   TMyHintWindow.ActiveHint(Rect:TRect;const   AHint:string);  
  begin  
   
  Fhdirection:=True;  
  Fvdirection:=True;  
  Factivating:=True;  
  try  
  Caption:=AHint;  
  Inc(Rect.Bottom,4);  
  UpdateboundsRect(Rect);  
   
  if   Rect.Left<Screen.DesktopLeft   then  
  begin  
        rect.Left:=screen.DesktopLeft;  
  end;  
  if   rect.Top+Height>screen.DesktopHeight   then  
  begin  
        dec(rect.Top,Height);  
        Fvdirection:=false;  
  end;  
  if   rect.Left+width>screen.DesktopWidth   then  
  begin  
        dec(rect.Left,Width);  
        Fhdirection:=false;  
  end;  
  if   rect.Bottom<screen.DesktopTop   then  
  begin  
        rect.Bottom:=screen.DesktopTop;  
        Fvdirection:=false;  
  end;  
   
  setwindowpos(handle,HWND_TOPMOST,rect.Left,rect.Top,Width,Height,SWP_SHOWWINDOW   OR   SWP_NOACTIVATE);  
  Invalidate;  
  finally  
  Factivating:=false;  
  end;  
  end;  
   
  function   TMyHintWindow.CalcHintRect(MaxWidth:Integer;const   AHint:string;AData:Pointer):TRect;  
  begin  
        Result:=Rect(0,0,canvas.TextWidth(AHint)   ,canvas.TextHeight(AHint));  
        Inc(result.Right,22);  
        inc(result.Bottom,10);  
        dec(result.Top,15);  
   
        Setwindowpos(handle,HWND_TOPMOST,result.Left,result.Top,Width,Height,SWP_HIDEWINDOW   OR   SWP_NOACTIVATE);  
        Invalidate;  
  end;  
   
  initialization  
  HintWindowClass:=TMyHintWindow;

查看回复