我有如下一个组件,一直使用,但有一个问题却无法解决,请专家和高手帮忙解决!
问题:1、当点击该按钮后,弹出一个对话框,但当关闭这个对话框后,这个图形按钮仍然处于“进入”状态;
      2、当点击后一直按住该按钮离开按钮区域后弹起,这时按钮处于“按下”状态,而应该是“弹起”“离开”状态;

解决方案 »

  1.   

    unit Image4Btn;interfaceuses
      Windows,Messages,SysUtils,Stdctrls,dialogs,Classes, Controls, ExtCtrls,Graphics;type
      TImage4Btn = class(TImage)
      private
        { Private declarations }//    FBt4Handle     :Hmodule;
        FBt4Flag       :String;
        FMouseIsDown    :Boolean;    FOnMouseEnter,FOnMouseLeave:TNotifyEvent;
        TempStr:string;
        hdll:Hmodule;
        procedure SetMouseIsDown(Value:Boolean);
      protected
        { Protected declarations }
      public
        { Public declarations }
        constructor   Create(AOwner:TComponent);   override;
        destructor    Destroy; override;
      published
        { Published declarations }
    //    property Bt4Handle :Hmodule read FBt4Handle write FBt4Handle;
        property Bt4Flag   :String  read FBt4Flag write FBt4Flag;
        property MouseIsDown:boolean read FMouseIsDown write SetMouseIsDown default  false;    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override;    property OnMouseLeave :TnotifyEvent Read FOnMouseLeave write FOnMouseLeave;
        property OnMouseEnter :TNotifyEvent read FOnMouseEnter write FOnMouseEnter;    procedure MouseLeave; virtual;
        procedure MouseEnter; virtual;    procedure CM_MouseLeave(var msg: TMessage); message  CM_MOUSELEAVE;
        procedure CM_MouseEnter(var msg: TMessage); message  CM_MOUSEENTER;    
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('AAA Components', [TImage4Btn]);
    end;
    constructor   TImage4Btn.Create(AOwner:TComponent);
      begin   
        inherited   Create(AOwner);
        FMouseIsDown :=False;
      end;
    destructor TImage4Btn.Destroy;
      begin
        inherited Destroy;
      end;
    procedure TImage4Btn.MouseUp(Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    begin
      if Not (csDesigning in ComponentState)   then
        BEGIN
          Try
            hdll :=LoadLibrary('Bin\C7181.dll');
            IF FMouseIsDown then
              begin
                Try
                  TempStr :=Bt4Flag+'UpEnter';
                  Picture.Bitmap.Handle :=LoadBitmap(hdll,pChar(TempStr));
                  MouseIsDown :=False;
                Finally
                  FreeLibrary(hdll);
                end;
              end
            ELSE
              begin
                Try
                  TempStr :=Bt4Flag+'DownEnter';
                  Picture.Bitmap.Handle :=LoadBitmap(hdll,pChar(TempStr));
                  MouseIsDown :=True;;
                Finally
                  FreeLibrary(hdll);
                end;
              end;
            FreeLibrary(hdll);
          Finally
            FreeLibrary(hdll);
          END;
        END;
    end;
    Procedure TImage4Btn.MouseEnter;
    Begin
      if Not (csDesigning in ComponentState)   then
        begin
          Try
            hdll :=LoadLibrary('Bin\C7181.dll');
            IF FMouseIsDown then
              begin
                Try
                  TempStr :=Bt4Flag+'DownEnter';
                  Picture.Bitmap.Handle :=LoadBitmap(hdll,pChar(TempStr));
                Finally
                  FreeLibrary(hdll);
                end;
              end
            ELSE
              begin
                Try
                  TempStr :=Bt4Flag+'UpEnter';
                  Picture.Bitmap.Handle :=LoadBitmap(hdll,pChar(TempStr));
                Finally
                  FreeLibrary(hdll);
                end;
              end;
            FreeLibrary(hdll);
          Finally
            FreeLibrary(hdll);
          END;
          If assigned(FOnMouseEnter) Then
            FOnMouseEnter(self);
        end;
    end;
    Procedure TImage4Btn.MouseLeave;
    Begin
      if not (csDesigning in ComponentState)   then
        begin
          Try
            hdll :=LoadLibrary('Bin\C7181.dll');
            IF FMouseIsDown then
              begin
                Try
                  TempStr :=Bt4Flag+'DownLeave';
                  Picture.Bitmap.Handle :=LoadBitmap(hdll,pChar(TempStr));
                Finally
                  FreeLibrary(hdll);
                end;
              end
            ELSE
              begin
                Try
                  TempStr :=Bt4Flag+'UpLeave';
                  Picture.Bitmap.Handle :=LoadBitmap(hdll,pChar(TempStr));
                Finally
                  FreeLibrary(hdll);
                end;
              end;
              FreeLibrary(hdll);
          Finally
            FreeLibrary(hdll);
          END;
          If assigned(FOnMouseLeave) Then
            FOnMouseLeave(self);
        end;
    end;Procedure TImage4Btn.CM_MouseEnter(var msg:Tmessage);
    Begin
      Inherited;  MouseEnter;
    end;
    Procedure TImage4Btn.CM_MouseLeave(var msg:Tmessage);
    Begin
      Inherited;  MouseLeave;
    end;
    procedure TImage4Btn.SetMouseIsDown(Value:Boolean);
    begin
      FMouseIsDown :=Value;
    end;
    end.