日期:2014-05-19  浏览次数:20957 次

netframework 界面重绘的处理
最近在看   .netframework   的源代码.
当看到winform   的   ListBox   控件时,知道它是用   DrawItem   事件来绘制子项目的
但我在它的代码中看到它是这样调用的.
private   void   WmReflectDrawItem(ref   Message   m)
{
    ...具体函数实现略过
        //此处调用   OnDrawIten
        this.OnDrawItem(new   DrawItemEventArgs(graphics,   this.Font,   rect,   lParam.itemID,   (DrawItemState)   lParam.itemState,   this.ForeColor,   this.BackColor));
}

那么   WmReflectDrawItem   又是在哪调用的呢,我再查,发现是在   WndProc,   也就是控件的主消息循环中
protected   override   void   WndProc(ref   Message   m)
{
        int   msg   =   m.Msg;
        switch   (msg)
        {
                case   0x202b:
                        this.WmReflectDrawItem(ref   m);
                        return;

                case   0x202c:
                        this.WmReflectMeasureItem(ref   m);
                        return;

                case   0x317:
                        this.WmPrint(ref   m);
                        return;

                default:
                        if   (msg   !=   0x2111)
                        {
                                goto   Label_029F;
                        }
                        this.WmReflectCommand(ref   m);
                        return;
        }
}
函数调用是明白了,问题也就来了,以上这几个消息ID(0x202B,0x2111等)我从没见过,在   winuser.h   中也查不到,且值都大于   WM_USER   (0x0400), 而且我发现很多控件中都有   WmReflectCommand,   WmReflectDrawItem   等函数,其对应的消息ID都一样,   难道是   windows的隐藏消息.
望高人解答.

------解决方案--------------------
因该是.net的新消息吧
------解决方案--------------------
顺便问下lz看到移动窗体时候的消息是什么了么?
记得以前处理移动的时候有个消息和sizechange有关
------解决方案--------------------
不好意思,我问一下,你看的是哪里的源代码?


------解决方案--------------------
应该是新消息。
------解决方案--------------------
我感觉像是项目自定义的消息,所以才会使用WM_USER大的值。
------解决方案--------------------
http://msdn2.microsoft.com/zh-tw/library/system.windows.forms.listbox.wmreflectcommand(VS.80).aspx