如下代码
protected override void WndProc(ref Message m) 

  const int WM_ERASEBKGND=0x14; 
  if (m.Msg!=WM_ERASEBKGND) 
      base.WndProc(ref m); 
}
问题 1 上述代码屏蔽WM_ERASEBKGND?去掉base.WndProc(ref m)会怎样,请解释WndProc原理。
问题 2 如何知道0x14代表WM_ERASEBKGND,有什么好的查询手册吗? 

解决方案 »

  1.   

    去掉base.WndProc(ref m),又不自己处理,那就会所有的消息都没有处理,那会怎么样呢?
    WndProc是从C++来的吧,原理好复杂问题2,当然是要查MSDN了,也可以从网上搜索Windows消息手册
      

  2.   

    我试验了下,
     protected override void WndProc(ref Message m)
            {            
               // base.WndProc(ref m);
            }去掉base.WndProc(ref m),提示 创建窗口句柄时出错。
    很迷惑,那个帮忙解释下报这个错的来龙去脉,心急!WndProc扮演的什么角色?
    分不够可以再加!
      

  3.   

    问题 1 上述代码屏蔽WM_ERASEBKGND?去掉base.WndProc(ref m)会怎样,请解释WndProc原理。 
    -----------------------------------------------------------
    代码对非WM_ERASEBKGND消息才进行处理,就是达到屏蔽的效果了.
    WndProc不能去掉.它是窗体主要的消息处理函数.去掉它什么也干不了.
    WndProc的实现大概是这样的:
    protected void WndProc(ref Message m) 

      switch(m)
      {
         case WM_QUIT: /*处理退出消息....;*/ break;
         case WM_PAINT:/*处理paint消息...*/ break;
         ... ...
         default:
           defWndProc(ref m);   //其他消息调用默认的消息处理函数
      }

    问题 2 如何知道0x14代表WM_ERASEBKGND,有什么好的查询手册吗? msdn
      

  4.   


    你好。
    我 去掉base.WndProc(ref m),提示 创建窗口句柄时出错。窗口句柄创建与WndProc有什么关系?
      

  5.   

    因为你在overwrite重写这个wndproc,把base.WndProc注释掉的话,程序就不能处理消息了.
    创建窗体时发送的WM_CREATE消息这些都处理不了,当然出错了.如果想了解多一点的消息机制,你可以找<windows编程>看一下,第一章讲的就是这个.
      

  6.   

    恩,受教了。
    我现在就去书城买 Windows编程去。
      

  7.   

    导致窗口函数接收到ERASEBKGND消息后不能分发
      

  8.   


    请问base.WndProc(ref m); 为什么要用ref m,消息为什么要用引用类型?
      

  9.   

    一个窗口人产生到显示出来操作系统处理了N多消息,比如WM_CREATE,WM_PAINT等等,如果没有处理WM_CREATE消息,窗口就不会创建,当然该窗口的句柄也没有产生。
    至于你的第二个问题还不太好查,MSDN上是找不到消息值的,如果你装了VC++有关内容的话,可以到VC++ 目录下找winuser.h还是windef.h里面有消息的宏定义,具体那个我不记得了
    base.WndProc(ref m);这个函数执行的次数年是非常大的,引用会提高效率。
      

  10.   

    传导windows消息,base.WndProc里面有处理消息最终的API
      

  11.   

    base.WndProc(ref m);这个函数执行的次数年是非常大的,引用会提高效率。?
    ref m这样解释是不是很牵强啊?还是确实有理?