CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

窗体移动时,窗体上的控件会收到什么消息呢?

楼主markov(沉默的异常)2002-12-05 14:55:45 在 Delphi / Windows SDK/API 提问

苦!我已试过无数消息了。都没有反应!试过之后再来发言哦,不要想当然的说什么paint事件、……事件。 问题点数:20、回复次数:14Top

1 楼jianzhang(zhangjian)回复于 2002-12-05 15:09:27 得分 0

WM_MOUSEMOVETop

2 楼markov(沉默的异常)回复于 2002-12-05 15:17:53 得分 0

我正在写vcl组件,该组件需要在窗体位置改变时处理代码。Top

3 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2002-12-05 15:25:23 得分 0

至少会得到   WM_PAINTTop

4 楼jianzhang(zhangjian)回复于 2002-12-05 15:28:40 得分 0

会得到   WM_MOVING   事件  
  如:unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ComCtrls;  
   
  type  
      TForm1   =   class(TForm)  
          StatusBar1:   TStatusBar;  
      private  
          {   Private   declarations   }  
          procedure   FormMove(var   msg:TMessage);message   WM_MOVING;  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  {   TForm1   }  
   
  procedure   TForm1.FormMove(var   msg:   TMessage);  
  var  
      Rect:^Trect;  
  begin  
   
      Rect:=Pointer(msg.LParam);  
      StatusBar1.Panels.Items[0].Text:='Left='+inttostr(Rect.Left);  
      StatusBar1.Panels.Items[1].Text:='Top='+inttostr(Rect.Top);  
      StatusBar1.Panels.Items[2].Text:='Right='+inttostr(Rect.Right);  
      StatusBar1.Panels.Items[3].Text:='Bottom='+inttostr(Rect.Bottom);  
   
  end;  
   
  end.Top

5 楼jianzhang(zhangjian)回复于 2002-12-05 15:44:24 得分 0

控件不会收到任何事件Top

6 楼scu96124678(冰河)回复于 2002-12-05 16:05:04 得分 0

WM_MOUSEMOVE  
  Top

7 楼markov(沉默的异常)回复于 2002-12-05 20:19:43 得分 0

拜托,不要说“至少”。自己试一下就知道理想于现实有多少差距。WM_PAINT  
  没有被触发。really。不信自己看了。Top

8 楼cuihl(存在即是合理)回复于 2002-12-05 22:19:35 得分 0

控件不会收到任何事件,你的问题可以这样解决:  
      TMyControl   =   class(TCustomControl)  
          private  
              OldProc:   TWndMethod;  
              procedure   MyWndProc(var   Message:   TMessage);  
          public  
              constructor   Create(AOwner:   TComponent);   override;  
              destructor   Destroy;override;  
              procedure   SetMyWndProc;  
              procedure   ReleaseMyWndProc;  
      end;  
   
  implementation  
   
  {   TMyControl   }  
   
  constructor   TMyControl.Create(AOwner:   TComponent);  
  begin  
      inherited;  
  end;  
   
  destructor   TMyControl.Destroy;  
  begin  
      inherited;  
      if   Assigned(OldProc)   then   ReleaseMyWndProc;  
  end;  
   
  procedure   TMyControl.MyWndProc(var   Message:   TMessage);  
  begin  
      if   Message.Msg   =   WM_MOVING   then  
          ShowMessage('');  
      if   Assigned(OldProc)   then   OldProc(Message);  
  end;  
   
  procedure   TMyControl.ReleaseMyWndProc;  
  begin  
      if   Assigned(OldProc)   then    
          parent.WindowProc   :=   OldProc;  
  end;  
   
  procedure   TMyControl.SetMyWndProc;  
  begin  
      OldProc   :=   Parent.WindowProc;  
      Parent.WindowProc   :=   MyWndProc;  
  end;  
  Top

9 楼cuihl(存在即是合理)回复于 2002-12-05 22:24:33 得分 0

调用时  
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      MyCon   :=   TMyControl.Create(self);  
      MyCon.Parent   :=   self;  
      MyCon.SetMyWndProc;  
  end;  
  Top

10 楼ehom(?!)回复于 2002-12-05 23:01:13 得分 0

WM_SYSCOMMANDTop

11 楼ehom(?!)回复于 2002-12-05 23:01:45 得分 0

WM_MOVINGTop

12 楼markov(沉默的异常)回复于 2002-12-05 23:31:46 得分 0

cuihl,thanks   very   much.   我会仔细研究你的方案的,看得出来,你不是庸手!nice。Top

13 楼markov(沉默的异常)回复于 2002-12-05 23:55:42 得分 0

cuihl,我的想法和你的相似,我考虑给parent的onXX事件赋值,但是我担心会出现access   invalidate错误,没有尝试。如果真的收不到消息,只能这样了。我很失望。window机制就是这样吗?我不愿相信。Top

14 楼cuihl(存在即是合理)回复于 2002-12-06 10:45:02 得分 20

window机制没有问题,因为窗口移动时,需要处理的无非就是重新绘制窗口,而所有控件都在窗口内,所以只要窗口绘制成功,控件就没有必要重新画了。假设  
  所有控件都要重新绘制,每个控件(窗口)都会有一个WM_PAINT消息,这些消息都会放到线程的消息队列里面,但是Windows会把消息队列里面的所有WM_PAINT消息组合成一个WM_PAINT消息,并组合每个WM_PAINT中的绘制区域,以提高效率。Top

相关问题

  • 如何通过控件移动窗体?
  • 为什么控件在窗体中不能移动?
  • 窗体控件为什么不能移动?----------在线等待
  • 如何使窗体上的控件随着鼠标的移动而移动??
  • 在一个无标题窗体中加载一个用户控件,如何移动窗体
  • 如何运行时移动label控件和保存移动控件后的窗体(在线)
  • 谁有在窗体里移动控件而能正常显示的方法?
  • 谁有窗体的控件!!!
  • 创建窗体及控件
  • MDI窗体控件问题.

关键词

  • 控件
  • 消息
  • 窗体
  • tmycontrol
  • oldproc
  • mywndproc
  • releasemywndproc
  • 绘制
  • statusbar
  • tmessage

得分解答快速导航

  • 帖主:markov
  • cuihl

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo