完整的计划在这里:
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
中的最后一个参数是InvalidateRect
而FALSE
中的WM_KILLFOCUS
是TRUE
?
我在Windows XP 32bit中运行MS Visual Studio C ++ 2010 Express。
答案 0 :(得分:1)
致电SetFocus()
并非无条件发送WM_SETFOCUS
条消息。如果在通话前窗口已经有焦点,SetFocus()
将不会执行任何操作。
换句话说,只有在焦点改变后才会发送WM_SETFOCUS
消息。
至于TRUE
/ FALSE
参数,即bErase
,是否在重新绘制之前擦除整个窗口,或者是否绘制了什么&#39已经存在了。在我的书中,它是一个性能黑客。如果你知道你可以逃避不擦除窗口(因为你只是更新它的一小部分),你可以在这里传递TRUE
。
我不认为2015年在此次优化中有很大的价值。如果您需要高性能显示更新,无论如何都要使用OpenGL或DirectX。