菜鸟问题:如何在一控件重绘时对另一控件也重绘?

Aeolian 2004-11-19 09:58:52
我想通过拦截WM_Paint消息来处理,怎样能够判断当前的WM_Paint消息来自哪个控件?
...全文
107 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
linzhengqun 2004-11-19
  • 打赏
  • 举报
回复
type
TForm1 = class(TForm)
Shape1: TShape;
Shape2: TShape;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
OldProc: TWndMethod;
public
{ Public declarations }
procedure NewWinProc(var Message: TMessage);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
OldProc:=Shape1.WindowProc;
Shape1.WindowProc:=NewWinProc;
end;

procedure TForm1.NewWinProc(var Message: TMessage);
begin
if Message.Msg=WM_PAINT then
begin
Shape1.Shape:=stCircle;
Shape2.Invalidate;//重绘
end;
OldProc(Message);
end;

end.
whitetiger8 2004-11-19
  • 打赏
  • 举报
回复
一般用OnPaint即可了。
拦截的话也有句柄可以判断
aiirii 2004-11-19
  • 打赏
  • 举报
回复
你這樣實現應該有問題的,
我的想法,要麼實現兩個控件的關聯, 如 dataSource 和 dataset 的方式,
要麼, 在A控件內部的處理OnPaint, 然後, 發消息通知所屬窗口,
或者, 自己遍歷所屬窗口的子控件
Aeolian 2004-11-19
  • 打赏
  • 举报
回复
声明:
procedure WMTabPaint(var AMsg:TWMPaint); Message WM_Paint;

procedure TForm1.WMTabPaint(var AMsg: TWMPaint);
begin
if AMsg.DC=getdc(控件.Handle) then begin
另一控件.Repaint;
end else inherited;
end;

但AMsg.Dc总不等于getdc(控件.Handle),请大虾们指正
ssq237712 2004-11-19
  • 打赏
  • 举报
回复
如果是控件,你可以给控件定义个OnPaint事件,不要轻易拦截WM_Paint消息,处理的不好就会死循环
ICMGDCHN 2004-11-19
  • 打赏
  • 举报
回复
拦截PAINT会死循环呀
aiirii 2004-11-19
  • 打赏
  • 举报
回复
消息一般都會帶有一個 handle, handle 對應的就是相應的控件的handle

function FindControl(Handle: HWnd): TWinControl;

應該可以找到

5,388

社区成员

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

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