c++ - InvalidateRect in Windows API, Charles Petzold checker4.c program -
full program here:
http://examples.oreilly.com/9781572319950/cd_contents/chap07/checker4/checker4.c
the code in childwndproc
confuses me:
case wm_lbuttondown : setwindowlong (hwnd, 0, 1 ^ getwindowlong (hwnd, 0)) ; setfocus (hwnd) ; invalidaterect (hwnd, null, false) ; return 0 ; // focus messages, invalidate window repaint case wm_setfocus: idfocus = getwindowlong (hwnd, gwl_id) ; // fall through case wm_killfocus: invalidaterect (hwnd, null, true) ; return 0 ;
why in childwndproc
in case of message wm_lbuttondown
:
the last statement before return 0 invalidaterect
, since right before program sends wm_setfocus
message setfocus
function, falls through wm_killfocus
, has invalidaterect
, last argument true
, instead of false
.
in understanding program should work without invalidaterect
in wm_lbuttondown
since calls setfocus
, makes invalidate window, when comment out invalidaterect
wm_lbuttondown
, program doesn't repaint window after mouse clicks or button presses.
why , why in wm_lbuttondown
invalidaterect
last argument false
, in wm_killfocus
true
?
i running ms visual studio c++ 2010 express in windows xp 32bit.
calling setfocus()
doesn't unconditionally send wm_setfocus
message. if window has focus before call, setfocus()
not anything.
put way, wm_setfocus
message sent if focus changed.
as true
/false
parameter, that's berase
, whether erase whole window before re-drawing it, or whether paint on what's there. is, in book, performance hack. if know can away not erasing window (because updating small part of it), can pass true
here.
i don't think in 2015 there's value in optimization. if need high performance display updates, you'd use opengl or directx anyway.
Comments
Post a Comment