首先,我用的是net。 但我知道net 也是基于基础的消息循环的。  其实,我大概知道,是通过windows操作系统的消息循环,向窗口发送消息,然后由执行相应的绘制的代码。  只是,我现在比较困惑的是两点。  一: 消息是一层一层的发送的,还是直接发送的。
          比如: 一个窗口Form1,(我习惯叫窗体), 上面有几个控件。button,textbox,或者还有其他的控件。
 
        当此窗体form1的某部分需要重绘时,比如,某个控件被挡住了, 或控件发生其他的单击啊 或者程序控制的一些事件了。
        是操作系统先将消息发到窗体,然后窗体再发到控件呢,还是操作系统直接就发到控件,然后控件自己执行自身的绘制代码就ok了。  二  控件与所属的窗体的 关系怎么看,影响控件的显示吗?      其实,从我试验的角度,应该是影响的。但是我就是没搞明白问题在哪。      问题的核心是涉及到两个  一个是继承,一个是controls 集合属性。    1  比如  我拖一个窗体,然后往上面再拖几个控件,那么这时候,运行没问题。正常显示。
                看自动生成的代码,
              窗体是class  form1:form      而控件  都是form1的 private 私有 字段。  然后在构造函数中 实例化那些字段--控件并添加到form1实例的controls集合中。
     
      但,如果我再设计一个类  class form2:form1      那么,在form1中有的那些控件,将无法显示,运行还会报错。  2  如果 ,仍然是form1。
      我添加一个控件 grid。然后,把一个控件比如button, 通过代码添加到grid.controls集合中。那么,显示仍然正常。      所以,不清楚这个控件类在哪声明变量(作为哪一个类的字段),然后,在哪实例化(有可能在窗体的构造函数,也有可能在某个控件的构造函数),添加到那个窗口或控件实例的controls属性,到底是起到什么作用。区别在哪。 

解决方案 »

  1.   

    第一个问题:简单理解,消息是直接发给控件的,但是Label是个例外
       如果一个控件有Handel的话,也就是C++里面的hWnd就可以直接接收来自系统的消息   如果挡住了窗体和上面的几个控件,系统会直接发送消息到窗体和每个控件的,不会中转
      

  2.   

    1.你所说的控件被挡住之类的概念,其实就是所谓的“无效区域”,一旦窗体上出现了无效区域,那么窗体就会被引发onpaint事件。其实控件就是窗体,只是是比较特殊的窗体。
    如果根据无效区域的理解来看的话,那么就可以理解为控件被挡住了,有个无效区域了,那么这个控件应该会自动重绘,控件的重绘应该与外面的载体FOrm无关,毕竟控件就是一个比较特殊的form。
    非要说消息机制的话,我个人认为系统在出现控件的无效区域之后,使用的是sendmessage直接发送到控件,而不是使用那个postmessage发送到窗体的消息队列中。2.继承的问题,首先form1中的控件是form1的私有变量,你用form2继承form1,你怎么调用父类的私有变量??这肯定是有问题的嘛。gird控件是你在form中申明的变量(控件对象),那么这个gird就属于form1,然后你添加一个button到gird的控件类中,那么button就属于gird的控件了。
    你show窗体的时候,form1显示gird,而gird显示他自己的控件button,我实在没弄明白你是在什么地方弄糊涂了。
    其实gird是个控件也是个窗体,你这样做的话,就好比在form1窗体中你建立了一个form对象form2,在form2中你建立一个button,在你显示form1的时候,你再显示form2,form2中有button,这样有问题吗?你将控件也看成窗体好了。