代码之家  ›  专栏  ›  技术社区  ›  JosephStyons

TMemo的等效提示文本

  •  6
  • JosephStyons  · 技术社区  · 16 年前

    我有这个Delphi代码来设置 cue text

    procedure TfrmMain.SetCueText(edt: TWinControl; cueText: string);
    const
      ECM_FIRST = $1500;
      EM_SETCUEBANNER = ECM_FIRST + 1;
    begin
      SendMessage(edt.Handle,EM_SETCUEBANNER,0,
        LParam(PWideChar(WideString(cueText))));
    end;
    

    我想要这个 same effect 在TMemo上,但MSDN文档中说:

    不能在屏幕上设置提示横幅 多行编辑控件或多行编辑控件

    有没有一种标准的方法可以在TMemo上产生cuetext效果,或者我必须处理oneter/OnExit事件并自己滚动?

    1 回复  |  直到 16 年前
        1
  •  8
  •   RRUZ    16 年前

    你可以破解TMemo控件

    带有文本提示的TMemo单行版本

    type
        TMemo = class(StdCtrls.TMemo)
        private
         FTextHint: string;
         FTextHintFont: TFont;
        protected
         FCanvas : TCanvas;
         procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        public
         constructor Create(AOwner : TComponent); override;
         destructor Destroy; override;
        published
         property TextHint: string read FTextHint write FTextHint;
         property TextHintFont: TFont read FTextHintFont write FTextHintFont;
        end;
    
      TForm1 = class(TForm)
        Memo1: TMemo;
      private
      public
      end;
    
    
    constructor TMemo.Create(AOwner: TComponent);
    begin
      inherited;
      FCanvas               := TControlCanvas.Create;
      FTextHintFont         := TFont.Create;
      FTextHintFont.Color   := clGrayText;
      TControlCanvas(FCanvas).Control := Self;
    end;
    
    destructor TMemo.Destroy;
    begin
      FreeAndNil(FTextHintFont);
      FreeAndNil(FCanvas);
      inherited;
    end;
    
    procedure TMemo.WMPaint(var Message: TWMPaint);
    begin
      inherited;
      if  (Text = '') and (not Focused) then
      begin
      FCanvas.Font := FTextHintFont;
      FCanvas.TextOut(1, 1, FTextHint); //Note : is not multiline
      end;
    end;
    

    设置TextHint属性的步骤

    Memo1.TextHint:='Enter your comments here';
    

    带有TextHint多行版本的TMemo

    type
        TMemo = class(StdCtrls.TMemo)
        private
         FTextHint: TStrings;
         FTextHintFont: TFont;
        protected
         FCanvas : TCanvas;
         procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        public
         constructor Create(AOwner : TComponent); override;
         destructor Destroy; override;
        published
         property TextHint: TStrings read FTextHint write FTextHint;
         property TextHintFont: TFont read FTextHintFont write FTextHintFont;
        end;
    
    
    constructor TMemo.Create(AOwner: TComponent);
    begin
      inherited;
      FTextHint             := TStringList.Create;
      FCanvas               := TControlCanvas.Create;
      FTextHintFont         := TFont.Create;
      FTextHintFont.Color   := clGrayText;
      TControlCanvas(FCanvas).Control := Self;
    end;
    
    destructor TMemo.Destroy;
    begin
      FreeAndNil(FTextHintFont);
      FreeAndNil(FCanvas);
      FTextHint.Clear;
      FreeAndNil(FTextHint);
     inherited;
    end;
    
    procedure TMemo.WMPaint(var Message: TWMPaint);
    Var
    i            : integer;
    TextHeight   : Integer;
    begin
      inherited;
      if  (Text = '') and (not Focused) then
      begin
      FCanvas.Font := FTextHintFont;
      TextHeight:=FCanvas.TextHeight('MLZ'); //Dummy Text to determine Height
        for i := 0 to FTextHint.Count - 1 do
        FCanvas.TextOut(1, 1+(i*TextHeight), FTextHint[i]);
      end;
    end;
    
    Memo1.TextHint.Add('Enter your comments here Line 1');
    Memo1.TextHint.Add('Enter your comments here Line 2');
    Memo1.TextHint.Add('Enter your comments here Line 3');