请看下面的图,当提示用户某个文本框的内容要输入时,它弹出一个Hint.比我常用的方法:”MessageBox提示,再SetFocus设定光标“ 酷多了。http://www.hxrsoft.net/cool.bmp

解决方案 »

  1.   

    真不错。各种漂亮的Hint控件好象还不太难找,只是它这样的提示方法真的人性化。
      

  2.   

    自己去看THintWindow的代码,DELPHI自己的哦。.看着自己写一个就是了。花不了什么工夫的.
    至于那个EDIT.网上现成的也多的是.自己看着代码也写一个去吧.
      

  3.   

    楼上,如果用THintWindow直接来实现,有两个问题:
    (1)那个控件是会变颜色的,你看到上面是红色,下面字体是黑色
    (2)如果每个Edit都要显示这个Hint出来,那么每次显示的时候都要算出要显示Hint提示窗口的位置,这个要多少代码呀?(关键要解决这个问题)
      

  4.   

    呵呵,找到了,给你;用时调用ShowBalloonTip过程,格式下面有示例:
    ...
      private
        { Private declarations }    procedure ShowBalloonTip(Control: TWinControl; Icon: Integer; Title: PChar; Text: PWideChar);
      public
    ...
    procedure TfrmFir.ShowBalloonTip(Control: TWinControl; Icon: integer; Title: PChar; Text: PWideChar);
    const
      TOOLTIPS_CLASS = 'tooltips_class32';
      TTS_ALWAYSTIP = $01;
      TTS_NOPREFIX = $02;
      TTS_BALLOON = $40;
      TTF_SUBCLASS = $0010;
      TTF_TRANSPARENT = $0100;
      TTF_CENTERTIP = $0002;
      TTM_ADDTOOL = $0400 + 50;
      TTM_SETTITLE = (WM_USER + 32);
      ICC_WIN95_CLASSES = $000000FF;
    type
      TOOLINFO = packed record
        cbSize: integer;
        uFlags: integer;
        hwnd: THandle;
        uId: integer;
        rect: TRect;
        hinst: THandle;
        lpszText: PWideChar;
        lParam: integer;
      end;
    var
      hWndTip: THandle;
      ti: TOOLINFO;
      hWnd: THandle;
    begin
      hWnd := Control.Handle;
      hWndTip := CreateWindow(TOOLTIPS_CLASS, nil,
                              WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,
                              0, 0, 0, 0, hWnd, 0, HInstance, nil);
      if hWndTip <> 0 then
      begin
        SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0,
                    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
        ti.cbSize := SizeOf(ti);
        ti.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS;
        ti.hwnd := hWnd;
        ti.lpszText := Text;
        Windows.GetClientRect(hWnd, ti.rect);
        SendMessage(hWndTip, TTM_ADDTOOL, 1, integer(@ti));
        SendMessage(hWndTip, TTM_SETTITLE, Icon mod 4, Integer(Title));
      end;
    end;
    ...
    procedure TfrmFir.Edit1Enter(Sender: TObject);
    begin
      ShowBalloonTip(Edit1, 1, '提示', '请在此输入数字');
    end;
    ...
    改变第二个参数可以改变显示的图标
      

  5.   

    你可以在窗体上多放几个控件,从别的控件转入那个控件时才明显,因在其Enter事件中
      

  6.   

    to weizi2000(秋风啊):这样似乎没有达到要求,如在一个Button的OnClick事件中加入代码:ShowBalloonTip(Edit1, 1, '提示', '请在此输入数字');为个时候根本就没有显示出来,要把鼠标移到Edit1才能显示出来。 如何解决?
      

  7.   

    //昨天看到的其实把 weizi2000(秋风啊)  的该以下就行。
    //需要一个文件
    unit _tooltips_class32;interface
    uses Windows, Classes, Graphics, Forms, Controls, StdCtrls,
      Buttons, ExtCtrls,TeCanvas,Messages,CommCtrl,SysUtils,Dialogs;
    type
      TOOLINFO = packed record
        cbSize: integer;
        uFlags: integer;
        hwnd: THandle;
        uId: integer;
        rect: TRect;
        hinst: THandle;
        lpszText: PWideChar;
        lParam: integer;
    end;
    var
       _hWndTip:HWND;
       ti: TOOLINFO;
    procedure ShowBalloonTip(Control: TWinControl; Icon: integer; Title: PChar; Text: PWideChar);implementation
    procedure ShowBalloonTip(Control: TWinControl; Icon: integer; Title: PChar; Text: PWideChar);
    const
      TOOLTIPS_CLASS = 'tooltips_class32';
      TTS_ALWAYSTIP = $01;
      TTS_NOPREFIX = $02;
      TTS_BALLOON = $40;
      TTF_SUBCLASS = $0010;
      TTF_TRANSPARENT = $0100;
      TTF_CENTERTIP = $0002;
      TTM_ADDTOOL = $0400 + 50;
      TTM_SETTITLE = (WM_USER + 32);
      ICC_WIN95_CLASSES = $000000FF;
    var
      hWndTip: THandle;
      hWnd: THandle;
    begin
      hWnd := Control.Handle;
      hWndTip := CreateWindow(TOOLTIPS_CLASS, nil,
                              WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,
                              0, 0, 0, 0, hWnd, 0, HInstance, nil);
      if hWndTip <> 0 then
      begin
      _hWndTip:=hWndTip;
        SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0,
                    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
        ti.cbSize := SizeOf(ti);
        ti.uFlags :=  TTF_TRANSPARENT or TTF_SUBCLASS or TTF_TRACK;
        // 去掉TTF_CENTERTIP 加   TTF_TRACK 那么 'tooltips_class32' 不会立即显示!
        ti.hwnd := hWnd;
        ti.lpszText := Text;
        Windows.GetClientRect(hWnd, ti.rect);
        inc(ti.rect.Left,120);
        SendMessage(hWndTip, TTM_ADDTOOL, 1, integer(@ti));
        SendMessage(hWndTip, TTM_SETTITLE, Icon mod 4, Integer(Title));
        Control.Tag:=hWndTip;
      end;
    end;
    end.
    //下面是使用方式
    //然后在你的窗口加, Edit1:Tedit; ,OkButton:TButton;
    procedure TAboutBox.OKButtonClick(Sender: TObject);
    var
        s:String;
        Rect:Trect;
    begin
       if Edit1.Text='' then
       begin
        s:='输入不可为空!';
        _tooltips_class32.ti.lpszText:=PWideChar(s);
        Windows.GetWindowRect(edit1.Handle, Rect);//计算位置
        OffsetRect(Rect,edit1.Width div 3,edit1.Height div 2);//移动坐标可以根据需要调
        Edit1.SetFocus;
        //改变 ti.lpszText
        SendMessage (self.Tag, TTM_SETTOOLINFOA, 0, longint(@ti));
        //设置位置
        SendMessage (self.Tag, TTM_TRACKPOSITION, 0,
            MAKELPARAM(Rect.Left,Rect.Top));
       //弹出
        SendMessage(self.Tag,TTM_TRACKACTIVATE,1,longint(@ti));
       end;
    end;procedure TAboutBox.Edit1Change(Sender: TObject);
    begin
       //关了
       SendMessage(self.Tag,TTM_TRACKACTIVATE,0,0);
    end;
    procedure TAboutBox.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    //关了
    SendMessage(self.Tag,TTM_TRACKACTIVATE,0,0);
    end;
    //给分^_^
      

  8.   

    Control.Tag:=hWndTip;
    不要忘记了!
      

  9.   

    //改变颜色的
    SendMessage (self.Tag,TTM_SETTIPTEXTCOLOR,RGB(255,0,0),0);
    SendMessage (self.Tag,TTM_SETTIPBKCOLOR,RGB(255,0,0),0);
    //给分^_^