如题:如何在edit上实现类似excel单元格批注一样的右上角的红色三角形

解决方案 »

  1.   

    自己画一个,或是用Timage贴图也可以
      

  2.   

    响应Edit的WM_NCPAINT,绘制三角形。。
      

  3.   

    三角形不会画,,我画了长方形的,你不介意吧,哈哈。。给你代码吧unit ExcelEdit;interfaceuses
      Windows, SysUtils, Messages, Classes, Controls, Graphics, Forms, Menus,
      StdCtrls, CommCtrl, ComCtrls, ActnList,Math;type  TExcelEdit = class(TCustomEdit)
      protected
        procedure WMPaint(var Message:TMessage );message WM_Paint;
        procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
        procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
      end;
    implementation
    procedure TExcelEdit.WMNCCalcSize(var Message: TWMNCCalcSize);
    begin
      inherited;
      Message.CalcSize_Params^.rgrc[0].Right:=Message.CalcSize_Params^.rgrc[0].Right-2;
    end;procedure TExcelEdit.WMNCPaint(var Message: TMessage);
    var
      R:TRect;
      DC: HDC;
      Brush:HBrush;
    begin
      inherited;
      if BorderStyle = bsNone then
      begin
        Message.Result := 1;
        Exit;
      end;
      DC := GetWindowDC(Handle);
      try
        GetWindowRect(Handle, R);
        OffsetRect(R, -R.Left, -R.Top);
        R.Left:=R.Right-4;
        Brush:=Windows.CreateSolidBrush(clRed);
        Windows.FillRect(DC,R,Brush  )
      finally
        DeleteObject(Brush);
        ReleaseDC(Handle, DC);
      end;
    end;procedure TExcelEdit.WMPaint(var Message:TMessage );
    begin
      inherited;
      SendMessage(Handle, WM_NCPAINT, 0, 0);
    end;
    end.
      

  4.   

    WM_NCCALCSIZE重要的是这个消息,用来确定文本框客户区的大小
    之前对文本框自定义绘制也有过研究,主要是绘制边框,背景透明等。。
      

  5.   

    我自己做了一下,效果不太令人满意,只能在窗体刚打开时和onmouseleave后,红色的框就不存在了。再说,我不可能在这么多的地方都去调用MyEditColor吧,有没有一劳永逸的办法呢?
    请高手赐教。procedure TForm1.MyEditColor(MyControl:TControl);
    var
      MyCanvas:TControlCanvas;
      fRect: TRect;
    begin
      fRect.Left := MyControl.Width-7;
      fRect.Top := 0;
      fRect.Right := MyControl.Width;
      fRect.Bottom := 4;
      MyCanvas:=TControlCanvas.Create;
      MyCanvas.Control := MyControl;
      MyCanvas.Brush.Color:=clRed;
      MyCanvas.FillRect(fRect);
    end;procedure TForm1.Edit1Change(Sender: TObject);
    begin
      MyEditColor(Edit1);
    end;procedure TForm1.Edit1MouseLeave(Sender: TObject);
    begin
    MyEditColor(Edit1);
    end;procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    MyEditColor(Edit1);
    end;
      

  6.   

    unit ExcelEdit;interfaceuses
      Windows, SysUtils, Messages, Classes, Controls, Graphics, Forms, Menus,
      StdCtrls, CommCtrl, ComCtrls, ActnList,Math;type  TExcelEdit = class(TCustomEdit)
      protected
        procedure CMMouseEnter(Var Message:TMessage);message CM_MOUSEENTER;
        procedure CMMouseLeave(Var message:TMessage);message CM_MOUSELEAVE;
        procedure WMPaint(var Message:TMessage );message WM_Paint;
        procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
        procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
      end;
    implementation
    procedure TExcelEdit.CMMouseEnter(var Message: TMessage);
    begin
      INherited;
      SendMessage(Handle, WM_NCPAINT, 0, 0);end;procedure TExcelEdit.CMMouseLeave(var message: TMessage);
    begin
      INherited;
      SendMessage(Handle, WM_NCPAINT, 0, 0);end;procedure TExcelEdit.WMNCCalcSize(var Message: TWMNCCalcSize);
    begin
      inherited;
      Message.CalcSize_Params^.rgrc[0].Right:=Message.CalcSize_Params^.rgrc[0].Right-2;
    end;procedure TExcelEdit.WMNCPaint(var Message: TMessage);
    var
      R:TRect;
      DC: HDC;
      Brush:HBrush;
    begin
      inherited;
      if BorderStyle = bsNone then
      begin
        Message.Result := 1;
        Exit;
      end;
      DC := GetWindowDC(Handle);
      try
        GetWindowRect(Handle, R);
        OffsetRect(R, -R.Left, -R.Top);
        R.Left:=R.Right-4;
        Brush:=Windows.CreateSolidBrush(clRed);
        Windows.FillRect(DC,R,Brush  )
      finally
        DeleteObject(Brush);
        ReleaseDC(Handle, DC);
      end;
    end;procedure TExcelEdit.WMPaint(var Message:TMessage );
    begin
      inherited;
      SendMessage(Handle, WM_NCPAINT, 0, 0);
    end;
    end.
      

  7.   

    你也真是。。就不能想想问题出来哪里,,
    我在D7下运行OK的
    如果不行,你自己再测测
    加了对CMMOUSEENTER和CMMOUSELEAVE事件进行重绘。。应该能够OK。