刚才在测试《Delphi5开发人员指南》中的“理解Windows消息”一节时(第119页)中的小例子时,按照作者的说法输入如下代码:    procedure TForm1.WMPaint(var Msg: TWMPaint);
    begin
        MessageBeep(0);
    end;    按照作者所说,由于本过程没有调用“inherited”所以Windows没有机会对WM_PAINT消息进行基本的处理,窗体不会被画出来,但实际情况却是窗体还是显示出来了,为什么?   

解决方案 »

  1.   

    书上说得没错,你理解有误。WM_CREATE:是将窗口创建出来,创建完之后就不管事了。而WM_PAINT是负责将窗体重绘,如果你不用inherited的话,窗体的重绘的任务就交给你了,如果你不处理试试看,将一个窗体覆盖在你创建的窗体上,再移开,你看看窗体会不会自动重绘界面?其实手动处理也不复杂,照着我下面的就可以了,不过只是一个示范
    procedure TForm1.WMPaint(var Msg: TWMPaint);
    var
      PS : TPaintStruct;
    begin
      BeginPaint(Handle,PS);
     //do your something
      EndPaint(Handle,PS);
    end;
      

  2.   

    我试了一下,使用书中的代码,当其它窗体覆盖在这个窗体上并移开后,窗体能够自动重绘,至少从界面上是看不出任何问题的。但有两个问题:
    1:这个程序运行后好象对CPU资源占用极大,系统几乎停止响应,但这个问题又不是每次都会有,只是出现的机率很大;
    2:尽管我的机子上安装了声卡,MessageBeep(0)运行后,但PC机的喇叭仍会响个不停,为什么?
      

  3.   

    由于你没有inherited消息方法,所以系统象陷入了死循环一样,cpu占用率几乎达到100%,每次都会出现,至于为什么,我看还是研究VCL源码吧!
    你的机子虽然装了声卡,但是还要在控制面板中选择声音方案才会使MessageBeep(0)发出不是pc喇叭的声音!