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
[解决办法]
JF
[解决办法]
JF
[解决办法]
hbxtlhx(平民百姓) ( ) 信誉:112 Blog 加为好友 2007-05-11 13:13:48 得分: 0
你可以如下得到这些消息的字符描述:
protected override void WndProc(ref Message m)
{
Console.WriteLine(m);
base.WndProc(ref m);
}
这个是输出到哪里的?如何输出到即时窗口啊?