如题:如何在edit上实现类似excel单元格批注一样的右上角的红色三角形
解决方案 »
- Indy最大连接线程数是600吗?如何提高呢?急。。。在线等
- 为何 Socket 发送流后,接收端接收的大小与发送的大小不一致(接收的数据总是大于发送的数据)?
- ADOQuery数据怎么不能自动更新.......顺便放分!
- 在未装DELPHI的情况下任何进行BDE设置?
- 如何用动态TQUERY动态生成TDECISION CUBE的字段及TDECISION GRAPH ???
- 一个简单问题,请勿见笑!
- 初级问题,挺恼火,哈哈
- 开发三层结构的数据库系统,DELPHI和VB.NET谁比较适合?
- 我在用SQL server建一个数据库为:mei331后,我用ADOconnection来连,可出来错误了请看
- 大侠!各位!如何从数据集里面再提取一些数据记录?给各方法和提示或思路?可以吗?急!急!急!急!
- 对Array Of PChar赋值的问题
- delphi7能安装ralib这个第三方控件吗
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.
之前对文本框自定义绘制也有过研究,主要是绘制边框,背景透明等。。
请高手赐教。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;
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.
我在D7下运行OK的
如果不行,你自己再测测
加了对CMMOUSEENTER和CMMOUSELEAVE事件进行重绘。。应该能够OK。