Windows程序设计第五版源代码---KEYVIEW1

源代码如下:

#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 Window NT!"), zAppName, 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 = (tagMSG*)malloc(cLinesMax * sizeof(MSG));        
		cLines = 0;            
	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:                
		
		//Rectangle storage array        
		for(i = cLinesMax - 1; i > 0; i--)            
			pmsg[i] = pmsg[i - 1];                
		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;        
		
	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);
}

结果如图如下:

未点击键盘前:
在这里插入图片描述

点击键盘的 a b c d e f g h i 等键:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃不起饭的小陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值