zoukankan      html  css  js  c++  java
  • CN消息的来源——父窗口不知道怎么处理,于是把这个消息加上CN_BASE在分发到实际的子窗体

    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_消息详细说明的例子和运行过程,有空补上

  • 相关阅读:
    240 Search a 2D Matrix II 搜索二维矩阵 II
    239 Sliding Window Maximum 滑动窗口最大值
    bzoj5029: 贴小广告&&bzoj5168: [HAOI2014]贴海报
    bzoj5178: [Jsoi2011]棒棒糖
    bzoj5293: [Bjoi2018]求和
    bzoj5194: [Usaco2018 Feb]Snow Boots
    bzoj2007: [Noi2010]海拔
    bzoj4956: [Wf2017]Secret Chamber at Mount Rushmore
    bzoj3296: [USACO2011 Open] Learning Languages
    bzoj4887: [Tjoi2017]可乐
  • 原文地址:https://www.cnblogs.com/findumars/p/4748976.html
Copyright © 2011-2022 走看看