好像是没有刷新。请问怎么改?

nnnnyyyy 2006-04-13 08:28:00

我自己写了一个控件继承了TCustomEdit.添加了一个功能:在Edit右边内部添加了一块按钮。出现了
这样一些问题:
1、内部按钮本来是填充有颜色,但是当Edit获得焦点(点进去)时,填充色就变为白色了。
2、当我动态赋值的时候。里面值不会变化必须获得焦点才能看到(点进去).
procedure TForm1.Button3Click(Sender: TObject);
begin
I := I + 1;
Self.Edit1.Text := IntToStr(I);
Self.SpreadEdit1.Text := IntToStr(I);
end;
请问怎么解决?
...全文
190 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nnnnyyyy 2006-05-19
  • 打赏
  • 举报
回复
谢谢了
hahafan 2006-04-18
  • 打赏
  • 举报
回复
TCustomEdit由系统绘制,所以会出现你这样的问题。
你的代码中缺少的就是使用EM_SETRECTNP来重新设置edit的编辑区域和调用DefaultHandler来调用edit的系统绘制过程。
大概的修改过程如下:
首先:
由于EM_SETRECTNP只对多行edit有效,所以需要重载CreateParams,如下:
procedure CreateParams(var Params: TCreateParams); override;
里面的代码应如下:
inherited CreateParams(Params);
Params.Style := Params.Style or ES_MULTILINE;
其次:
需要在DrawSelectType中使用EM_SETRECTNP来对edit的编辑区域进行设置,代码如下:
SendMessage(Self.Handle, EM_SETRECTNP, 0, LongInt(@ARect1));
其中的ARect1是个TRect就是需要设置的编辑区域,也就是edit除去绘制按钮的其他区域
最后:
在WMPaint中调用DefaultHandler,在finally之前调用即可,代码如下:
var
msg: TMessage;
msg.Msg := WM_PAINT;
msg.WParam := FCanvas.Handle;
msg.LParam := 0;
msg.Result := 0;
DefaultHandler(msg);
另外:
调用BeginPaint需相应调用EndPaint,在finally中加入如下代码:
if Message.DC = 0 then EndPaint(Handle, PS);

以上所有代码仅供参考
建议:
多看看vcl源码,很多情况下你可以看到与你问题相似的东西,然后发现解决问题的方法
nnnnyyyy 2006-04-18
  • 打赏
  • 举报
回复
有没有知道?
nnnnyyyy 2006-04-17
  • 打赏
  • 举报
回复
有没有知道?
xiaoerliao 2006-04-14
  • 打赏
  • 举报
回复
友情up一下
bluesky23 2006-04-14
  • 打赏
  • 举报
回复
GZ
nnnnyyyy 2006-04-14
  • 打赏
  • 举报
回复
procedure TSpreadEdit.WMPaint(var Message: TWMPaint);
var
DC: HDC;
PS: TPaintStruct;
begin
if FCanvas = nil then
begin
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
end;

DC := Message.DC;

if DC = 0 then
DC := BeginPaint(Handle, PS); //window ApI

FCanvas.Handle := DC;
try
FCanvas.Font := Font;

if (FButtonStyle = bsDropdown) then
begin
DrawSelectType(FCanvas); //下拉按钮
end;
finally
FCanvas.Handle := 0;
end;
end;


procedure TSpreadEdit.DrawSelectType(ACanvas: TControlCanvas);
var
ARect: TRect;
ATop, ALeft, ARight, ABottom, AWidth, AHeight: Integer;
begin
with ACanvas do
begin
{填充附加按钮 默认宽为20; 如果小于此标准按实际宽与高}
if (ClientWidth > ButtonWidth) then
begin
SetRect(ARect, ClientWidth - ButtonWidth, 0, ClientWidth, ClientHeight);
end
else
begin
SetRect(ARect, ClientWidth, 0, ClientWidth, ClientHeight);
end;

Brush.Color := ButtonColor;
FillRect(ARect);
Frame3D(FCanvas, ARect, clBtnHighlight, clBtnShadow, 2);

{画三角.默认宽为8; 高为6; 如果小于此标准按实际宽与高}
Brush.Color := ButttonFillColor;
AWidth := 8;
AHeight := 4;

if (AWidth > (ARect.Right - ARect.Left)) then
begin
AWidth := ARect.Right - ARect.Left;
end;
if (AHeight > (ARect.Bottom - ARect.Top))then
begin
AHeight := ARect.Bottom - ARect.Top;
end;
ATop := ARect.Top + (ARect.Bottom - ARect.Top - AHeight) div 2;
ABottom := ARect.Bottom - (ARect.Bottom - ARect.Top - AHeight) div 2;
ALeft := ARect.Left + (ARect.Right - ARect.Left - AWidth) div 2;
ARight := ARect.Right - (ARect.Right - ARect.Left - AWidth) div 2;

Polygon([Point(ALeft , ATop),
Point(ARight, ATop),
Point(((ARight - ALeft) div 2 + ALeft) , ABottom)]);

end;
end;

这是关键代码了。
aiirii 2006-04-13
  • 打赏
  • 举报
回复
应该是setText 那个函数里面没有调用
refresh, repaint, Invalidate 之类的函数,最好将关键代码贴出
GARNETT2183 2006-04-13
  • 打赏
  • 举报
回复
在Edit的Paint里面进行重画..

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧