VCL存在一些非API消息以供其内部使用,为什么要这样做呢?这要从WM_COMMAND & WM_NOTIFY消息说起,我们说WM_COMMAND消息并不是直接发给实际产生消息的窗体,而是发送到它的父窗体。但是父窗体几乎不可能用通常方法处理这些根本不知道如何处理的消息,于是父窗体把这个消息加上CN_BASE在分发到实际的子窗体中,然后由实际的子窗体处理——解释够清楚的

比如TBitBtn元件为了在按钮表面绘制图象,处理了CN_DRAWITEM消息,这个消息处理函数是这样写的:

FCanvas.Handle := DrawItemStruct.hDC;
  R := ClientRect;

… //省略一部分
  if IsDown then
   OffsetRect(R, 1, 1);
  TButtonGlyph(FGlyph).Draw(FCanvas, R, Point(0,0), Caption, FLayout, FMargin,
   FSpacing, State, False, DrawTextBiDiModeFlags(0));

  if IsFocused and IsDefault then
  begin
   R := ClientRect;
   InflateRect(R, -4, -4);
   FCanvas.Pen.Color := clWindowFrame;
   FCanvas.Brush.Color := clBtnFace;
   DrawFocusRect(FCanvas.Handle, R);
  end;

  FCanvas.Handle := 0;

可以看出这和通常处理Paint的方法差不多,其实都是在HDC上作图。如果你学习过SDK的话,其实我们可以自己处理WM_NOTIFY消息来处理那些由控件产生的消息,只不过VCL替我们封装了一下而已。

参考:http://www.rrzxw.net/biancheng/VC/2012/0304/7615.html

------------------------------------------------------------------------------

但是还欠缺一个CN_消息详细说明的例子和运行过程,有空补上

最新文章

  1. Netty里的设计模式
  2. csv
  3. Meteor+AngularJS:超快速Web开发
  4. python学习 操作mysql 环境搭建
  5. 通过telnet来实践HTTP协议。
  6. Java.web-application-development-environments-for-macosx
  7. thinkphp对数据库操作有哪些内置函数
  8. IOS 多级列表展开控件
  9. 【Java】IO技术的使用——用IO实现大文件的复制
  10. 教你搞定Android自定义View
  11. 牛逼的 弹出层 layer !!!
  12. BZOJ 1046: [HAOI2007]上升序列(LIS)
  13. SAE开发一个应用(不仅仅是建站)
  14. 【NOIP2014提高组】解方程
  15. Nginx集群之WCF分布式消息队列
  16. 重新设置Eclipse的workspace路径
  17. Protostuff序列化分析
  18. WordPress安装官方文档教程
  19. LeetCode第十五题-找出数组中三数和为0的答案
  20. 12.Flask-Restful

热门文章

  1. MST最小生成树及Prim普鲁姆算法
  2. [RxJS] Utility operator: do
  3. 第二篇:从 GPU 的角度理解并行计算
  4. excel中VBA对多个文件的操作
  5. objective-c相关知识点
  6. throw 导致 Error C2220, wraning C4702错误
  7. SGU 153.Playing with matches
  8. in_array 判断问题的疑惑解决。
  9. 永久关闭防火墙和selinux
  10. 百度分享 ajax 或分页后显示不出问题解决方案