我对一个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;
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;
解决方案 »
- fastreport打印问题
- ADOQUERY1.append后,用adoquery1.fieldbyname('f1').asstring赋值,不判断赋值的长度,是否安全?
- 妖哥好帅哦,上昨天的社区标兵榜了,一天就抢526分
- 求几个控件的下载地址 delphi7
- otstring前的ot是什么意思?
- ado 能否使用batchmove?
- 第一次做网络版的小游戏,请教
- 求教: 如何在双击打开任意一个文件之前显示一个提示?
- 北京Delphi程序员生存现状
- adoquery1查询得到空记录,再adoquery1.close就报错如下
- ehlib最高版本是什么?增加了什么功能。
- 请教一个由句柄获取对象实例的问题
iCharWidth := FCanvas.TextWidth('1');这个只是判断英文字符的宽度,如果是中文字符后面的计算可能就要出问题了
处理这几个消息:WM_PAINT,WM_ERASEBKGND,WM_SETTEXT,WM_DRAWITEM!一样是画那条线!至于还有没有其他消息要处理,一时想不出。另外,你那样测量文字是很不准确的!用DrawText(……,DT_SINGLELINE or DT_NOCLIP OR DT_CALCRECT);
计算出字符串的绑定矩形,才是绝对可靠的!
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