<>里的一个程序,看过的请进.
ML20 2003-12-28 12:12:13 刚才看了第九章的第一个程序btnlook.c,有许多问题:
首先是程序运行后产生一个WM_DRAWITEM,这个消息应该是绘制左下角的BS_OWNERDRAW button 而产生的吧?
接着在处理WM_PAINT时,第一行用了
InvalidateRect(hwnd,&rect,TRUE);
假如我没记错的话,我看过的代码中都是在非WM_PAINT消息中使用这个函数,作用是把rect设为要刷新的区域.
在我印象中一旦这个函数被调用,就要产生一个WM_PAINT,假如真是这样的话,那在WM_PAINT中再产生WM_PAINT,如此循环下去程序是如何处理的.
最后一个参数也是我要问的,如果设为TRUE,则当调用BeginPaint时将删除这个区域,否则保留.可我觉得一旦调用这个函数后,无论最后一个参数设为TRUE还是FALSE,只要对rect区域进行更新时,都要删除原来的内容,重新绘制.
随后处理WM_COMMAND时,第一行
ScrollWindow(hwnd,0,-cyChar,&rect,&rect);
应该会产生一个WM_PAINT消息,可在WM_PAINT中,并没有对如何保留WM_COMMAND消息前的rect区域进行处理.难道是系统在处理ScrollWindow时自动将原rect的区域进行保留并更新?
处理WM_COMMAND的最后一行代码是
ValidateRect(hwnd,&rect);
这是为了强行使rect有效,防止再次进行WM_PAINT吧?
最后当单击左下角的BS_OWNERDRAW button时,会产生三个WM_DRAWITEM消息,这是怎么回事呢?