Windows API中的InvalidateRect,Charles Petzold checker4.c程序

时间:2015-05-15 11:16:59

标签: c++ c windows winapi

完整的计划在这里:

http://examples.oreilly.com/9781572319950/cd_contents/Chap07/Checker4/Checker4.c

//class creation public class MyThread extends Thread { public void run() { //disable the button that the user has to press button.setEnable(false); //add what you want to show to make him know that he loose //so execute your code or call a function } } //On your main class execution, do the following when screen loaded MyThread timerThread = new MyThread(); timerThread.execute(); //continue with your code 中的代码让我困惑:

ChildWndProc

为什么在消息 case WM_LBUTTONDOWN : SetWindowLong (hwnd, 0, 1 ^ GetWindowLong (hwnd, 0)) ; SetFocus (hwnd) ; InvalidateRect (hwnd, NULL, FALSE) ; return 0 ; // For focus messages, invalidate the window for repaint case WM_SETFOCUS: idFocus = GetWindowLong (hwnd, GWL_ID) ; // Fall through case WM_KILLFOCUS: InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; 的情况下ChildWndProc

返回0之前的最后一个语句是WM_LBUTTONDOWN,因为在它之前,程序使用InvalidateRect函数向WM_SETFOCUS函数发送SetFocus消息,该函数落到WM_KILLFOCUS,它也有InvalidateRect,只有最后一个参数是TRUE,而不是FALSE

根据我的理解,该程序应该在InvalidateRect中没有WM_LBUTTONDOWN的情况下正常运行,因为它会调用SetFocus,然后会使窗口无效,但是当我注释掉{{1}时从InvalidateRect开始,程序在鼠标点击或按下按钮后不会正确重新绘制窗口。

为什么这个以及为什么WM_LBUTTONDOWN WM_LBUTTONDOWN中的最后一个参数是InvalidateRectFALSE中的WM_KILLFOCUSTRUE

我在Windows XP 32bit中运行MS Visual Studio C ++ 2010 Express。

1 个答案:

答案 0 :(得分:1)

致电SetFocus()并非无条件发送WM_SETFOCUS条消息。如果在通话前窗口已经有焦点,SetFocus()将不会执行任何操作。

换句话说,只有在焦点改变后才会发送WM_SETFOCUS消息。

至于TRUE / FALSE参数,即bErase,是否在重新绘制之前擦除整个窗口,或者是否绘制了什么&#39已经存在了。在我的书中,它是一个性能黑客。如果你知道你可以逃避不擦除窗口(因为你只是更新它的一小部分),你可以在这里传递TRUE

我不认为2015年在此次优化中有很大的价值。如果您需要高性能显示更新,无论如何都要使用OpenGL或DirectX。