| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 549 人关注过本帖
标题:按位与和键盘消息问题
只看楼主 加入收藏
yang0401
Rank: 2
等 级:论坛游民
帖 子:84
专家分:57
注 册:2011-5-23
结帖率:69.23%
收藏
已结贴  问题点数:20 回复次数:1 
按位与和键盘消息问题
程序代码:
#include <windows.h>
#define DIVISIONS 5

LRESULT CALLBACK WndProc   (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK ChildWndProc (HWND, UINT, WPARAM, LPARAM) ;
int   idFocus = 0 ;
TCHAR szChildClass[] = TEXT ("Checker4_Child") ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                            PSTR szCmdLine, int iCmdShow)
{
         static TCHAR     szAppName[] = TEXT ("Checker4") ;
         HWND                         hwnd ;
         MSG                          msg ;
         WNDCLASS                     wndclass ;
    
         wndclass.style                         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc                   = WndProc ;
         wndclass.cbClsExtra                    = 0 ;
         wndclass.cbWndExtra                    = 0 ;
         wndclass.hInstance                     = hInstance ;
         wndclass.hIcon                      = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor                      = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground             = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName              = NULL ;
         wndclass.lpszClassName             = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {
                  MessageBox (NULL, TEXT ("Program requires Windows NT!"),
                                                  szAppName, MB_ICONERROR) ;
                  return 0 ;
         }
    
         wndclass.lpfnWndProc                   = ChildWndProc ;
         wndclass.cbWndExtra                    = sizeof (long) ;
         wndclass.hIcon                         = NULL ;
         wndclass.lpszClassName             = szChildClass ;
    
         RegisterClass (&wndclass) ;
         hwnd = CreateWindow (    szAppName, TEXT ("Checker4 Mouse Hit-Test Demo"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL) ;
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
         {
                      TranslateMessage (&msg) ;
                      DispatchMessage (&msg) ;
         }
         return msg.wParam ;
}

LRESULT CALLBACK WndProc (    HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
    static HWND     hwndChild[DIVISIONS][DIVISIONS] ;
         int                    cxBlock, cyBlock, x, y ;
    
         switch (message)
         {
         case WM_CREATE :
                  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) ;
                  return 0 ;
         case     WM_SIZE :
                  cxBlock = LOWORD (lParam) / DIVISIONS ;
                  cyBlock = HIWORD (lParam) / DIVISIONS ;
         
                  for (x = 0 ; x < DIVISIONS ; x++)
                                for (y = 0 ; y < DIVISIONS ; y++)
                            MoveWindow (    hwndChild[x][y],
                             x * cxBlock, y * cyBlock,
                                 cxBlock, cyBlock, TRUE) ;
                  return 0 ;
                      
         case     WM_LBUTTONDOWN :
                  MessageBeep (0) ;
                  return 0 ;

                  // On set-focus message, set focus to child window
         case     WM_SETFOCUS:
                  SetFocus (GetDlgItem (hwnd, idFocus)) ;
                  return 0 ;

        // On key-down message, possibly change the focus window

         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 ;

         case     WM_DESTROY :
                  PostQuitMessage (0) ;
                  return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
}

LRESULT CALLBACK ChildWndProc (HWND hwnd, UINT message,
                   WPARAM wParam, LPARAM lParam)
{
         HDC                             hdc ;
         PAINTSTRUCT                     ps ;
         RECT                            rect ;
    
     switch (message)
     {
         case     WM_CREATE :
                  SetWindowLong (hwnd, 0, 0) ;       // on/off flag
                  return 0 ;

         case     WM_KEYDOWN:
                           // Send most key presses to the parent window
         
                  if (wParam != VK_RETURN && wParam != VK_SPACE)
                  {
                       SendMessage (GetParent (hwnd), message, wParam, lParam) ;
                       return 0 ;
                  }
                           // For Return and Space, fall through to toggle the square
         
         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 ;
         
        case     WM_PAINT :
                  hdc = BeginPaint (hwnd, &ps) ;
         
                  GetClientRect (hwnd, &rect) ;
                  Rectangle (hdc, 0, 0, rect.right, rect.bottom) ;

                           // Draw the "x" mark
         
                  if (GetWindowLong (hwnd, 0))
                  {
                           MoveToEx (hdc, 0,          0, NULL) ;
                           LineTo   (hdc, rect.right, rect.bottom) ;
                           MoveToEx (hdc, 0,          rect.bottom, NULL) ;
                           LineTo   (hdc, rect.right, 0) ;
                  }
                           // Draw the "focus" rectangle
         
                  if (hwnd == GetFocus ())
                  {
                           rect.left   += rect.right / 10 ;
                           rect.right  -= rect.left ;
                           rect.top    += rect.bottom / 10 ;
                           rect.bottom -= rect.top ;

                           SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
                           SelectObject (hdc, CreatePen (PS_DASH, 0, 0)) ;
                           Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
                           DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN))) ;
                  }

                  EndPaint (hwnd, &ps) ;
                  return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
}
很奇怪,我按下回车键会跳转到鼠标右键消息执行,还有就是能解释下 x = idFocus & 0xFF ;y = idFocus >> 8 ;idFocus = y << 8 | x ;
的作用吗,感谢了

搜索更多相关主题的帖子: 键盘 
2013-07-22 16:36
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:20 
x y 保存在idfocus的分别高低位置上吧,分别为 0 -7 位 和8 - 15位。这个很好理解的

x = idFocus & 0xFF ;y = idFocus >> 8 ;   (1)
idFocus = y << 8 | x ;                   (2)

(1)(2)这两句不是互相做了对方的解析吗?

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-07-22 18:37
快速回复:按位与和键盘消息问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056102 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved