《Windows程序设针》第7章鼠标 CHECKER4.C中部分代码看不懂。

lywangchong 2011-09-11 07:33:39
只贴出有用部分。完整代码有些多。
程序创建一个父窗口,25个子窗口。
idFocus的取值应该为0 - 24。它用于引索子窗口。


int idFocus = 0;
int x, y;
……

case WM_KEYDOWN:
x = idFocus & 0xFF ;
y = idFocus >> 8 ;

switch (wParam)
{
case VK_UP: y-- ; break ;
case VK_DOWN: y++ ; break ;
case VK_LEFT: x-- ; break ;
case VK_RIGHT: x++ ; break ;
case VK_HOME: x = y = 0 ; break ;
case VK_END: x = y = DIVISIONS - 1 ; break ;
default: return 0 ;
}

x = (x + DIVISIONS) % DIVISIONS ;
y = (y + DIVISIONS) % DIVISIONS ;

idFocus = y << 8 | x ;

SetFocus (GetDlgItem (hwnd, idFocus)) ;
return 0 ;
……


程序先用x代表idFocus变量的低8位。用y代表idFocus的高8位。
然后分别对x和y做增减运算。
最后,再把x和y还原成idFocus。

问题:
设想,当x=0,y=3时
idFocus = y << 8 | x ;
变为:
idFocus = 0000001100000000 | 00000000 ;
即idFocus = 768 ;
那么就不对了。
...全文
70 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ozhuihen 2012-07-10
  • 打赏
  • 举报
回复
顶之[Quote=引用 5 楼 的回复:]
SetFocus 就是把焦点设置为指定的窗口或控件上

GetDlgItem 获取窗口 hwnd 中控件的句柄

768 就是控件的资源编号,也就是 CreateWindow 时 (HMENU) (y << 8 | x) 这项指定的值

反推一下,x=0,y=3,那就是焦点设置为 hwndChild[0][3]
[/Quote]
lywangchong 2011-09-11
  • 打赏
  • 举报
回复
谢谢谢谢谢谢谢谢
fox000002 2011-09-11
  • 打赏
  • 举报
回复
SetFocus 就是把焦点设置为指定的窗口或控件上

GetDlgItem 获取窗口 hwnd 中控件的句柄

768 就是控件的资源编号,也就是 CreateWindow 时 (HMENU) (y << 8 | x) 这项指定的值

反推一下,x=0,y=3,那就是焦点设置为 hwndChild[0][3]
lywangchong 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fox000002 的回复:]
查了一下代码

idFocus 可不是 0 - 24,而是下面 y << 8 | x 的取值范围


C/C++ code
for (x = 0 ; x < DIVISIONS ; x++)
for (y = 0 ; y < DIVISIONS ; y++)
hwndChild[x][y] = CreateWindow (szChildClass, NULL,
……
[/Quote]

那么SetFocus (GetDlgItem (hwnd, idFocus)) ;
即SetFocus (GetDlgItem (hwnd, 768));
是什么意思?
luciferisnotsatan 2011-09-11
  • 打赏
  • 举报
回复
调试运行下看看
fox000002 2011-09-11
  • 打赏
  • 举报
回复
查了一下代码

idFocus 可不是 0 - 24,而是下面 y << 8 | x 的取值范围

for (x = 0 ; x < DIVISIONS ; x++)
for (y = 0 ; y < DIVISIONS ; y++)
hwndChild[x][y] = CreateWindow (szChildClass, NULL,
WS_CHILDWINDOW | WS_VISIBLE,
0, 0, 0, 0,
hwnd, (HMENU) (y << 8 | x),
(HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),
NULL) ;
Ol_lO 2011-09-11
  • 打赏
  • 举报
回复
lz为什么不设置断点调试下看看呢

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧