把消息送到默认窗口函数里,并非一点用都没有,可能会产生新的消息(以WM_WINDOWPOSCHANGED为例)

我在追踪执行:

procedure TForm1.Button1Click(Sender: TObject);
begin
  panel1.Left:=panel1.Left-10;
end;

并且屏蔽TWinControl.WMWindowPosChanged里的UpdateBounds函数后

procedure TWinControl.WMWindowPosChanged(var Message: TWMWindowPosChanged);
var
  Framed, Moved, Sized: Boolean;
begin
  Framed := FCtl3D and (csFramed in ControlStyle) and (Parent <> nil) and (Message.WindowPos^.flags and SWP_NOREDRAW = 0);
  Moved := (Message.WindowPos^.flags and SWP_NOMOVE = 0) and IsWindowVisible(FHandle); // API
  Sized := (Message.WindowPos^.flags and SWP_NOSIZE = 0) and IsWindowVisible(FHandle);
  if Framed and (Moved or Sized) then InvalidateFrame;
  // if not (csDestroyingHandle in ControlState) then UpdateBounds; // 屏蔽这句
  inherited; 

  if Framed and ((Moved or Sized) or (Message.WindowPos^.flags and (SWP_SHOWWINDOW or SWP_HIDEWINDOW) <> 0)) then
    InvalidateFrame; // 类函数,简单调用API
end;

继续追踪WM_WINDOWPOSCHANGED过程中,意外发现它一旦执行了:

procedure TWinControl.DefaultHandler(var Message);
begin
   Result := CallWindowProc(FDefWndProc, FHandle, Msg, WParam, LParam);
end;

就会更改相应的panel1.left属性值。原因是,默认窗口函数会发送WM_SIZE和WM_MOVE消息,因此panel1.left的值仍得以改变。

具体参考MSDN: https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms632652(v=vs.85).aspx

时间: 2024-08-09 13:12:56

把消息送到默认窗口函数里,并非一点用都没有,可能会产生新的消息(以WM_WINDOWPOSCHANGED为例)的相关文章

用SendNotifyMessage代替PostMessage避免消息丢失(WIN7下消息队列的默认长度是10000,队列满后消息将被丢弃)

大家都知道PostMessage会丢消息,但是消息队列的大小是多少呢,下面做了一个测试. 代码: 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, StdCtrls; 8 9 const 10 UM_ADD = WM_USER + 100; 11 12 type 13 TForm1 = class(

SpringCloud学习之Stream消息驱动【默认通道】(十)

在实际开发过程中,服务与服务之间通信经常会使用到消息中间件,而以往使用了中间件比如RabbitMQ,那么该中间件和系统的耦合性就会非常高,如果我们要替换为Kafka那么变动会比较大,这时我们可以使用SpringCloudStream来整合我们的消息中间件,来降低系统和中间件的耦合性. 一.消息中间的几大应用场景 1.异步处理 比如用户在电商网站下单,下单完成后会给用户推送短信或邮件,发短信和邮件的过程就可以异步完成.因为下单付款是核心业务,发邮件和短信并不属于核心功能,并且可能耗时较长,所以针对

理解自组织:敏捷里的自组织团队都是骗人的

引子 当他们说,实施敏捷需要自组织团队的时候,我没有做声. 当他们说,敏捷里的自组织团队不需要管理者的时候,我也没有做声. 当他们说,敏捷里的自组织团队没有明确角色,每一个人都自我管理.具备跨职能技能的时候,我依然没做声. 现在,当我想说,敏捷里的自组织团队都是骗人的.这时,他们也不做声. 正文 在敏捷宣言的十二条原则中有这样一条:"最好的架构.需求和设计出自自组织团队."在目前的敏捷大潮中,人们更关注的始终还是各种实践,这一条往往只有在敏捷实施失败的时候才被人提到:"自组织

如何去掉论坛右下角的新短消息提醒

如何去掉论坛右下角的新短消息提醒打开\template\default\common\footer.htm文件,然后找到137-150行的代码删除即可 <script type="text/javascript"> var h5n = new Html5notification(); if(h5n.issupport()) { <!--{if $_G[member][newpm] && $_GET[do] != 'pm'}--> h5n.show

Caused by:java.sql.SQLException:ORA-01008:并非所有变量都已绑定

1.错误描述 Caused by:java.sql.SQLException:ORA-01008:并非所有变量都已绑定 2.错误原因 3.解决办法

面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

package siweifasan_6_5; /** * @Description:在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. * @Parameters: // Parameters: // numbers: an array of integers //

剑指offer(Java版)第一题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 *请找出数组中任意一个重复的数字。 *例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。

/*在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3.*/ import java.util.*; public class Class1 { static class findRepeatedNumber{ public int findRepeatedN

delphi 发送Windwos消息控制按钮(控制计算器里的某一个按钮)

[delphi] view plaincopyprint? procedure TfrmMain.btnSendClick(Sender: TObject); var hCalc, h1: Cardinal; begin WinExec('calc', SW_SHOWNORMAL);//运行计算器 hCalc := FindWindow('SciCalc', nil); //查找计算器主窗口句柄,通过Spy++可查看到类名等 h1 := FindWindowEx(hCalc, 0, 'Butto

Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和。先处理自己队列中的消息,然后再处理系统消息队列中的消息)

Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事件: 按键按下和松开. 鼠标事件: 鼠标移动,鼠标按键的按下和松开. 拖放事件: 用鼠标进行拖放. 滚轮事件: 鼠标滚轮滚动. 绘屏事件: 重绘屏幕的某些部分. 定时事件: 定时器到时. 焦点事件: 键盘焦点移动. 进入和离开事件: 鼠标移入widget之内,或是移出. 移动事件: widget的位