第六章 KEYVIEW1

#include<windows.h>
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;
	PAINTSTRUCT ps;
	TCHAR szBuffer[128],szKeyName[32];
	TEXTMETRIC tm;
	switch(message)
	{
	case WM_CREATE:
	case WM_DISPLAYCHANGE:
		cxClientMax=GetSystemMetrics(SM_CXMAXIMIZED);        //窗口最大化后的客户区
		cyClientMax=GetSystemMetrics(SM_CYMAXIMIZED);
		hdc=GetDC(hWnd);
		SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
		GetTextMetrics(hdc,&tm);
		cxChar=tm.tmAveCharWidth;
		cyChar=tm.tmHeight;
		ReleaseDC(hWnd,hdc);
		if(pmsg)
			free(pmsg);
		cLinesMax=cyClientMax/cyChar;                       //每页最大显示的行数
		pmsg=(PMSG)malloc(cLinesMax*sizeof(MSG));
		cLines=0;
	case WM_SIZE:
		if(message==WM_SIZE)
		{
			cxClient=LOWORD(lParam);
			cyClient=HIWORD(lParam);
		}
		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_DEADCHAR:
	case WM_SYSKEYDOWN:
	case WM_SYSKEYUP:
	case WM_CHAR:
	case WM_SYSCHAR:
	case WM_SYSDEADCHAR:
		for(int 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);
		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(int i=0;i<min(cLines,cyClient/cyChar-1);i++)
		{
			int 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);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,int nCmdShow)
{
	static TCHAR szAppName[]=TEXT("keyview");
	HWND hWnd;
	MSG msg;
	WNDCLASS wndclass;

	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WndProc;
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=szAppName;
	wndclass.style=CS_VREDRAW|CS_HREDRAW;
	
	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("Error"),szAppName,MB_ICONERROR);
		return 0;
	}
	
	hWnd=CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);

	while(GetMessage(&msg,hWnd,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值