我对一个EDIT进行重绘,加一条竖线来对用户的输入进行长度提示。平时的话显示正常,但是只要用户一输入字符,就会看到竖线被一个白色的色块挡住(无论是否输入到该位置)。请问是否重绘的时候写得不对呢?代码如下(FCanvas为TControlCanvas):
procedure TMyEdit.WMPaint(var AMsg: TMessage);
var
  iCharWidth: Integer;
begin
  inherited;
  //重绘控件,画提示线
  if FShowCardNumInputLengthHintLine then
  begin
    FCanvas.Font.Assign(Self.Font);
    iCharWidth := FCanvas.TextWidth('1');
    FCanvas.Pen.Color := FCardNumInputLengthHintLineColor;
    FCanvas.Pen.Width := 2;
    FCanvas.MoveTo(iCharWidth * FCardNumInputLengthHintLinePosition + 1, 0);
    FCanvas.LineTo(iCharWidth * FCardNumInputLengthHintLinePosition + 1, Self.Height);
  end;
end;

解决方案 »

  1.   

    你所说输入的字符是中文字符吗
    iCharWidth := FCanvas.TextWidth('1');这个只是判断英文字符的宽度,如果是中文字符后面的计算可能就要出问题了
      

  2.   

    "FShowCardNumInputLengthHintLine" 这是说明命名法则啊?
      

  3.   

    FShowCardNumInputLengthHintLine是一个布尔变量
      

  4.   

    WM_PAINT,是处理不了Edit画文字的!被色块挡住,就是因为画文字时画了个实心矩形!所以,还要拦截WM_DRAWITEM、WM_ERASEBKGND!
      

  5.   


    处理这几个消息:WM_PAINT,WM_ERASEBKGND,WM_SETTEXT,WM_DRAWITEM!一样是画那条线!至于还有没有其他消息要处理,一时想不出。另外,你那样测量文字是很不准确的!用DrawText(……,DT_SINGLELINE or DT_NOCLIP OR DT_CALCRECT);
    计算出字符串的绑定矩形,才是绝对可靠的!
      

  6.   

    把这个iCharWidth * FCardNumInputLengthHintLinePosition 换成一个常量试试
      

  7.   

    结帖。最终需要处理的消息有:
    WM_PAINT, WM_DRAWITEM, WM_SETTEXT, WM_ERASEBKGND, WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_MOUSEMOVE, WM_LBUTTONUP, WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_RBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONDBLCLK, WM_MBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONDBLCLK