如何重画stringgrid的标题栏?(100分)

  • 主题发起人 主题发起人 Lion_sj
  • 开始时间 开始时间
L

Lion_sj

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在鼠标点击stringgrid的标题栏时,出现一效果,比如说,选择的一列标题栏凹下去

当鼠标在stringgrid标题栏双击时,如何让它不响应stringgrid的双击事件
 
设置一个全局变量,控制是否响应事件
 
以下代码实现“选择的一列标题栏凹下去”效果。
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Column, Row: Longint;
r:TRect;
DC: THandle;
begin
StringGrid1.MouseToCell(X, Y, Column, Row);
if ((Column<StringGrid1.FixedCols) and (Row>=0) ) or ((Row<StringGrid1.FixedRows) and (Column>=0)) then
begin
DC:= StringGrid1.Canvas.Handle;
r:=StringGrid1.CellRect(Column, Row);
DrawEdge(DC, R, BDR_SUNKENINNER, BF_TOPLEFT); { black }
DrawEdge(DC, R, BDR_SUNKENOUTER, BF_BOTTOMRIGHT); { btnhilite }
Dec(R.Bottom);
Dec(R.Right);
Inc(R.Top);
Inc(R.Left);
DrawEdge(DC, R, BDR_SUNKENOUTER, BF_TOPLEFT or BF_MIDDLE); { btnshadow }
end;
end;

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Column, Row: Longint;
r:TRect;
DC: THandle;
begin
StringGrid1.MouseToCell(X, Y, Column, Row);
if ((Column<StringGrid1.FixedCols) and (Row>=0 )) or ((Row<StringGrid1.FixedRows) and (Column>=0)) then
begin
DC:= StringGrid1.Canvas.Handle;
r:=StringGrid1.CellRect(Column, Row);
DrawEdge(DC, R, BDR_RAISEDOUTER, BF_BOTTOMRIGHT); { black }
Dec(R.Bottom);
Dec(R.Right);
DrawEdge(DC, R, BDR_RAISEDINNER, BF_TOPLEFT); { btnhilite }
Inc(R.Top);
Inc(R.Left);
DrawEdge(DC, R, BDR_RAISEDINNER, BF_BOTTOMRIGHT or BF_MIDDLE); { btnshadow }
end;
end;
-----------------------------------------
该代码存在的缺陷就是:MouseDown后拖动鼠标到其他的cell中再MouseUp,
StringGrid1.MouseToCell(X, Y, Column, Row)得到的就不是原来MouseDown下的cell了。
当然你可以定义一个全局变量保存MouseDown下的cell了。
你试试看,自己优化一下吧:)

 
接受答案
 
后退
顶部