关于消息处理WMPaint的,请求帮助!!! 我用用这种方法把它继承下来的,怎么不会响应呢? TcxlStringGrid = class(TStringGrid) 
public 
procedure WMPaint(var Message: TWMPaint); message wm_Paint; 
end; 
procedure TcxlStringGrid.WMPaint(var Message: TWMPaint); 
var 
rt: TRect; 
tmpc: DWORD; 
begin 
PaintHandler(Message); 
if not (focused) then 
begin 
tmpc := Canvas.font.Color; 
rt := CellRect(selection.Left, selection.Top); 
canvas.Lock; 
canvas.FillRect(rt); 
Canvas.font.Color := font.Color; 
Canvas.TextRect(rt, rt.Left + 2, rt.top + 2, Cells[selection.Left, selection.Top]); 
//canvas.TextOut(rt.Left+2,rt.top+2,Cells[selection.Left,selection.Top]); 
Canvas.font.Color := tmpc; 
canvas.UnLock; 
end; 
end; 

解决方案 »

  1.   

    覆盖 Paint方法不就行了.
    TcxlStringGrid = class(TStringGrid)
    public
      procedure Paint; override;
    end;
    procedure TcxlStringGrid.Paint;
    var
      rt: TRect;
      tmpc: DWORD;
    begin
      inherited Paint;
      if not (Focused) then
      begin
        tmpc := Canvas.font.Color;
        rt := CellRect(selection.Left, selection.Top);
        canvas.Lock;
        canvas.FillRect(rt);
        Canvas.font.Color := font.Color;
        Canvas.TextRect(rt, rt.Left + 2, rt.top + 2, Cells[selection.Left, selection.Top]);
        //canvas.TextOut(rt.Left+2,rt.top+2,Cells[selection.Left,selection.Top]);
        Canvas.font.Color := tmpc;
        canvas.UnLock;
      end;
    end;
      

  2.   

    是啊,还是重载Paint函数吧。你的应该是没有收到WM_Paint消息,你手动发一个WM_Paint就可以了。解决楼主问题的办法是在获得/释放焦点的时候重画。
      

  3.   

    试过了,还是不能调用!我是想利用这个函数实现以下功能:
    在一个StringGrid1中,当点击某一个单元格时,要求这个单元格的颜色变成红色,字体变成蓝色,也就是改变背景和字体的颜色,而StringGrid没有提供单个单元格的重画方法,请问用这个可以吗?有没有更好的方法?
      

  4.   


    TcxlStringGrid = class(TStringGrid)
    public
      procedure Paint; override;
    end;
    ...
    procedure TcxlStringGrid.Paint;
    var
      rt: TRect;
    begin
      inherited Paint;
      if (Focused) then
      begin
        rt := CellRect(selection.Left, selection.Top);
        canvas.Lock;
        Canvas.Brush.Color:=clRed;
        canvas.FillRect(rt);
        Canvas.font.Color := clBlue;
        Canvas.TextRect(rt, rt.Left + 2, rt.top + 2, Cells[selection.Left, selection.Top]);
        canvas.UnLock;
      end;
    end;
      

  5.   

    是啊,用你这个方法重载以后,还是不能调用,CxlStringGrid根本就没有Paint这个过程名,强制用这个过程后系统老提示undeclared indentifier:'Paint'!是怎么回事啊!非常感谢你,请指点!
      

  6.   

    我看你还是去stringgrid的ownerdraw事件里写吧  想则么折腾都可以
      

  7.   

    不好意思,我是菜鸟,有很多地方不懂!请你指导细一点!
    按你这个复制过去后,CxlStringGrid的Code Complete中根本就没有Paint这个过程名,强制用这个过程后(CxlStringGrid.paint;)系统老提示undeclared indentifier:'Paint'!不知怎么回事?
      

  8.   

    yinxd6112 你好!我是想利用这个函数实现以下功能: 
    在一个StringGrid1中,当点击某一个单元格时,要求这个单元格的颜色变成红色,字体变成蓝色,也就是改变背景和字体的颜色,而StringGrid没有提供单个单元格的重画方法,请问用ownerdraw怎么做呢?