Programming Windows程式开发设计指南->第六章 例子程序2

此程序在客户区显示Windows向窗口消息处理程序发送的八种不同的键盘消息及其详细信息。通过滚动展示最新的键盘输入状态,包括按键、字符消息及扩展属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*_############################################################################
  _##
  _##  Programming Windows程式开发设计指南->第六章 例子程序2
  _##  Author: xwlee                        
  _##  Time: 2007.06.21
  _##  Chang'an University
  _##  Development condition: win2003 Server+VC6.0
  _##
  _##  程序6-2  KEYVIEW1
  _##  KEYVIEW1.C 文件
  _##  该程序在客户区显示Windows向窗口消息处理程序发送的8种不同键盘消息的全部信息
  _##  程序只是进行验证
  _## 
  _##
  _##    KEYVIEW1.C --    Displays Keyboard and Character Messages
  _##     (c) Charles Petzold, 1998
  _##  
  _##########################################################################*/
#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                                   PSTR szCmdLine, int iCmdShow)

{

       static TCHAR szAppName[]  = TEXT ("KeyView1") ;

       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 ("This program requires Windows NT!"),

                                          szAppName, MB_ICONERROR) ;

              return 0 ;

       }

    

       hwnd = CreateWindow (szAppName, TEXT ("Keyboard Message Viewer #1"),

                                                 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 int   cxClientMax, cyClientMax, cxClient, cyClient, cxChar, cyChar ;

       static int   cLinesMax, cLines ;

       static PMSG  pmsg ;

       static RECT  rectScroll ;

       static TCHAR szTop[] = TEXT ("Message Key   Char ")

                                                        TEXT ("Repeat Scan Ext ALT Prev Tran") ;

       static TCHAR szUnd[] = TEXT ("_______        ___       ____     ")

                                                        TEXT ("______ ____ ___ ___ ____ ____") ;

 

       static TCHAR * szFormat[2] = {

                            TEXT ("%-13s %3d %-15s%c%6u %4d %3s %3s %4s %4s"),

                            TEXT ("%-13s  0x%04X%1s%c %6u %4d %3s %3s %4s %4s") } ;

              static TCHAR * szYes  = TEXT ("Yes") ;

              static TCHAR * szNo   = TEXT ("No") ;

              static TCHAR * szDown = TEXT ("Down") ;

              static TCHAR * szUp   = TEXT ("Up") ;

 

              static TCHAR * szMessage [] = {

              TEXT ("WM_KEYDOWN"), TEXT ("WM_KEYUP"),

              TEXT ("WM_CHAR"),        TEXT ("WM_DEADCHAR"),

              TEXT ("WM_SYSKEYDOWN"),TEXT ("WM_SYSKEYUP"),

              TEXT ("WM_SYSCHAR"),   TEXT ("WM_SYSDEADCHAR") } ;

              HDC                     hdc ;

              int                 i, iType ;

              PAINTSTRUCT            ps ;

              TCHAR                szBuffer[128], szKeyName [32] ;

              TEXTMETRIC            tm ;

    

       switch (message)

       {

       case WM_CREATE:

       case WM_DISPLAYCHANGE:

                            // Get maximum size of client area

              cxClientMax = GetSystemMetrics (SM_CXMAXIMIZED) ;

              cyClientMax = GetSystemMetrics (SM_CYMAXIMIZED) ;

 

                            // Get character size for fixed-pitch font

              hdc = GetDC (hwnd) ;

              SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

              GetTextMetrics (hdc, &tm) ;

              cxChar = tm.tmAveCharWidth ;

              cyChar = tm.tmHeight ;

 

              ReleaseDC (hwnd, hdc) ;

                            // Allocate memory for display lines

              if (pmsg)

                     free (pmsg) ;

                     cLinesMax = cyClientMax / cyChar ;

                     pmsg = (struct tagMSG *)malloc (cLinesMax * sizeof (MSG)) ;

                     cLines = 0 ;

                     // fall through

       case WM_SIZE:

              if (message == WM_SIZE)

              {

                     cxClient = LOWORD (lParam) ;

                     cyClient = HIWORD (lParam) ;

              }

                                   // Calculate scrolling rectangle

              rectScroll.left         = 0 ;

              rectScroll.right       = cxClient ;

              rectScroll.top               = cyChar ;

              rectScroll.bottom   = cyChar * (cyClient / cyChar) ;

 

              InvalidateRect (hwnd, NULL, TRUE) ;

              return 0 ;

         

       case WM_KEYDOWN:

       case WM_KEYUP:

       case WM_CHAR:

       case WM_DEADCHAR:

       case WM_SYSKEYDOWN:

       case WM_SYSKEYUP:

       case WM_SYSCHAR:

       case WM_SYSDEADCHAR:

                                   // Rearrange storage array

              for (i = cLinesMax - 1 ; i > 0 ; i--)

              {

                            pmsg[i] = pmsg[i - 1] ;

              }

                                   // Store new message

              pmsg[0].hwnd = hwnd ;

              pmsg[0].message = message ;

              pmsg[0].wParam = wParam ;

              pmsg[0].lParam = lParam ;

 

              cLines = min (cLines + 1, cLinesMax) ;

                                   // Scroll up the display

              ScrollWindow (hwnd, 0, -cyChar, &rectScroll, &rectScroll) ;

              break ;           // i.e., call DefWindowProc so Sys messages work

       case WM_PAINT:

              hdc = BeginPaint (hwnd, &ps) ;

              SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

              SetBkMode (hdc, TRANSPARENT) ;

              TextOut (hdc, 0, 0, szTop, lstrlen (szTop)) ;

              TextOut (hdc, 0, 0, szUnd, lstrlen (szUnd)) ;

 

              for (i = 0 ; i < min (cLines, cyClient / cyChar - 1) ; i++)

              {

                     iType =   pmsg[i].message == WM_CHAR ||

                                   pmsg[i].message == WM_SYSCHAR ||

                                   pmsg[i].message == WM_DEADCHAR ||

                                   pmsg[i].message == WM_SYSDEADCHAR ;

 

                     GetKeyNameText (pmsg[i].lParam, szKeyName,

                                          sizeof (szKeyName) / sizeof (TCHAR)) ;

 

              TextOut (hdc, 0, (cyClient / cyChar - 1 - i) * cyChar, szBuffer,

              wsprintf (szBuffer, szFormat [iType],

              szMessage [pmsg[i].message - WM_KEYFIRST],

              pmsg[i].wParam,

              (PTSTR) (iType ? TEXT (" ") : szKeyName),

              (TCHAR) (iType ? pmsg[i].wParam : ' '),

              LOWORD (pmsg[i].lParam),

              HIWORD (pmsg[i].lParam) & 0xFF,

                            0x01000000 & pmsg[i].lParam ? szYes  : szNo,

                            0x20000000 & pmsg[i].lParam ? szYes  : szNo,

                            0x40000000 & pmsg[i].lParam ? szDown : szUp,

                            0x80000000 & pmsg[i].lParam ? szUp   : szDown)) ;

              }

              EndPaint (hwnd, &ps) ;

              return 0 ;

 

       case WM_DESTROY:

              PostQuitMessage (0) ;

              return 0 ;

       }

       return DefWindowProc (hwnd, message, wParam, lParam) ;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值