终于懂了:Delphi消息的Result域出现的原因——要代替回调函数的返回值!(MakeObjectInstance不会帮助处理(接收)消息回调函数的返回值)
2016-04-06 21:33
183 查看
MakeObjectInstance应该不会帮助处理(接收)消息回调函数的返回值,可是有时候又确实需要这个返回值,这可怎么办呢?我是看到这段文字的时候,想到这个问题的:
http://note.sdo.com/u/432181446/NoteContent/pMF36~jDXzSFnM1rg001sf
可是Delphi的WndProc都是procedure,根本没有返回值,比如:
----------------------------------------------------------------------------------------------
可以看看VC是怎么使用回调函数的返回值的,待续。。。
----------------------------------------------------------------------------------------------
结论:终于懂了,Delphi的回调函数是没有返回值,但是每个消息都有Result域,这就是Result域出现的原因——要代替回调函数的返回值!!!真是昏倒,如此深意,真是没想到。之前还自以为是懂了Delphi消息的Result是生造出来的(还沾沾自喜了一阵),原来也不是。
当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息. 如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE. 当WM_PAINT由InvalidateRect产生时,先发送WM_PAINT消息(异步),如果InvalidateRect的bErase为TRUE,BeginPaint检查到更新区域需要删除背景,向窗口发送一个WM_ERASEBKGND消息,如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE. 如果pt.fErase标记为TRUE,指示应用程序应该处理背景,但是应用程序不一定需要处理,pt.fErase只是作为一个标记. 补充:DefWindowProc(hWnd, message, wParam, lParam)处理WM_ERASEBKGND消息时默认用下面的画刷清除背景 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); WM_ERASEBKGND返回TRUE和返回FALSE是一个规范,一般情况下没有什么区别,但是如果什么时候用到了,会根据函数返回值判断后续处理。因此最好按照要求返回数据.
http://note.sdo.com/u/432181446/NoteContent/pMF36~jDXzSFnM1rg001sf
可是Delphi的WndProc都是procedure,根本没有返回值,比如:
procedure TWinControl.WndProc(var Message: TMessage); var Form: TCustomForm; begin case Message.Msg of WM_NCHITTEST: begin inherited WndProc(Message); if (Message.Result = HTTRANSPARENT) and (ControlAtPos(ScreenToClient( SmallPointToPoint(TWMNCHitTest(Message).Pos)), False) <> nil) then Message.Result := HTCLIENT; Exit; end; end; inherited WndProc(Message); end;
----------------------------------------------------------------------------------------------
可以看看VC是怎么使用回调函数的返回值的,待续。。。
----------------------------------------------------------------------------------------------
结论:终于懂了,Delphi的回调函数是没有返回值,但是每个消息都有Result域,这就是Result域出现的原因——要代替回调函数的返回值!!!真是昏倒,如此深意,真是没想到。之前还自以为是懂了Delphi消息的Result是生造出来的(还沾沾自喜了一阵),原来也不是。
相关文章推荐
- iOS js与objective-c的交互(转)(文中所说的只适用于macOsx)
- 1 | Objective-C入门
- Object-c 归档--源自技术
- 用objective-c 实现常用算法(冒泡、选择、快速、插入)
- 序列化TList of objects(摘自danieleteti的网站)
- 【hibernate】org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
- $.isEmptyObject():检查对象是否为空(不包含任何属性)。
- OSError: libiomp5.so: cannot open shared object file: No such file or directory
- objective-c 中 category 和 extension 的区别
- Effective Objective-C学习笔记
- Objective-C Runtime分析(三)-objc_msgSend
- iOS学习笔记:Object-C基础语法(OC介绍与Foundation初步)
- Objective-C中,ARC下的 strong和weak指针原理解释
- oc开发笔记1 录音和播放
- Objective-C assign、retain、copy区别
- Objective-c的@property 详解
- 使用Coredata数据库出现的错误 CoreData: Cannot load NSManagedObjectModel. nil is an illegal URL parameter
- Objective-C编程中语句和变量的一些编写规范建议
- [Angular 2] Interpolation: check object exists
- Objective-C中的面向对象编程