窗口过程在应用程序进程里面
就算你不用api自己创建窗台,delphi也把这些过程封装了这个重画是windows控制的吧,与应用程序没有关系吧不知道是否正确

解决方案 »

  1.   

    和程序当然有关,比如你重载WM_PAINT消息处理过程,画一些东西出来
    showmessage出来后,这些画出来的东西依然可以被重画!
    所以我认为你的解释不能令人信服!
      

  2.   

    你重载wm_paint不用inherited吗?那就是执行父类的代码啊,在那里一直回溯到系统的处理中了;
    还有,showmessage不是另开了一个线程,只是有自己的消息循环而已;
    你可以到csdn的首页上找的候捷主页,在“电子书下载”中,有一本书专门讨论了这个问题;
    三本都是好书,值得好好研究的;
      

  3.   

    窗口过程是为了响应系统发送给窗口的消息创建的,它的执行肯定是在应用程序的线程里了.系统发送给窗口的所有消息都是由窗口的窗体过程处理的,包括WM_PAINT在内.对于模态窗体的实现,你可能是理解为是用sendmessage实现的,主窗体处在消息阻塞的状态,需要等待消息的返回.实际上模态窗体的显示是一个函数过程,把窗体显示出来,而主窗体在模态窗体没有返回之前不可用,应用程序的消息循环照常进行,不是阻塞的.你可以做个小测试,向显示模态窗体窗体的主窗体发送消息,主窗体是能响应消息的.
      

  4.   

    yansea(思宏) 可能没有理解我的问题!那是我的错!
    说得不够清楚!!!!
     kmzym() 也误解了我的问题!也是我的错!!谈具体一点
    有个过程如下!!!!!
    procedure Proc;
    begin
      showmessage('Just a test');  //Line 1
      //do other events            //Line 2
    end;我假定Proc由主线程调用,那么在Proc调用之后到showmessage 时
    除非showmessage返回,否则//do other events是不会执行的!!
    我想这一点是没问题!!!那么既然主线程在这里停下了它的执行脚步
    那么它凭什么还有能力去响应消息???除非消息处理不是由主线程
    完成的!!!!
      

  5.   

    “我假定Proc由主线程调用,那么在Proc调用之后到showmessage 时
    除非showmessage返回,否则//do other events是不会执行的!!”这是不对的!!你可以用一个时间控件试一下,showmessage后,到时间后时间实践还是可以执行的,而且这个执行时间事件的过程也是在主线成中的
      

  6.   

    sorry
    是“主线程在这里停下了它的执行脚步”这句话不对
      

  7.   

    呵呵,是我没有详细说!首先我们应该取得一致意见的是showmessage显示的是一个模态窗体。在模态窗体是通过ShowModal这个函数实现的,仔细研究ShowModal就发现这样的代码
    ...
    ...
    repeat
      Application.HandleMessage;-->处理发向应用程序的消息
      if Application.FTerminate then ModalResult := mrCancel else
      if ModalResult <> 0 then CloseModal;
    until ModalResult <> 0;
    ...
    所以在ModalResult 的值返回之前,应用程序一直在循环处理消息,所以在模态窗体返回之前,如过有发向主窗体的WM_PAINT的消息,会由Application.HandleMessage把消息处理了,而不是等到模态窗体返回之后再来处理,这样你因该理解为什么程序可以处理WM_PAINT的消息而不去执行//do other events            //Line 2 的原因了吧
      

  8.   

    kmzym()  Very Good!!
    忘了去查看一下ShowModal的代码,呵呵!!!谢谢你啦!分点分给GreenWaterBlueSky(碧水蓝天我的家),我想你不会介意的!!
    感谢: GreenWaterBlueSky(碧水蓝天我的家) 的热心帮助!!!!