TYPER.docx
《TYPER.docx》由会员分享,可在线阅读,更多相关《TYPER.docx(11页珍藏版)》请在冰点文库上搜索。
TYPER
/*--------------------------------------
TYPER.C--TypingProgram
(c)CharlesPetzold,1998
--------------------------------------*/
#include
#defineBUFFER(x,y)*(pBuffer+y*cxBuffer+x)
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
PSTRszCmdLine,intiCmdShow)
{
staticTCHARszAppName[]=TEXT("Typer");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
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("ThisprogramrequiresWindowsNT!
"),
szAppName,MB_ICONERROR);
return0;
}
hwnd=CreateWindow(szAppName,TEXT("TypingProgram"),
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);
}
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
staticDWORDdwCharSet=DEFAULT_CHARSET;
staticintcxChar,cyChar,cxClient,cyClient,cxBuffer,cyBuffer,
xCaret,yCaret;
staticTCHAR*pBuffer=NULL;
HDChdc;
intx,y,i;
PAINTSTRUCTps;
TEXTMETRICtm;
switch(message)
{
caseWM_INPUTLANGCHANGE:
dwCharSet=wParam;
//fallthrough
caseWM_CREATE:
hdc=GetDC(hwnd);
SelectObject(hdc,CreateFont(0,0,0,0,0,0,0,0,
dwCharSet,0,0,0,FIXED_PITCH,NULL));
GetTextMetrics(hdc,&tm);
cxChar=tm.tmAveCharWidth;
cyChar=tm.tmHeight;
DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));
ReleaseDC(hwnd,hdc);
//fallthrough
caseWM_SIZE:
//obtainwindowsizeinpixels
if(message==WM_SIZE)
{
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
}
//calculatewindowsizeincharacters
cxBuffer=max(1,cxClient/cxChar);
cyBuffer=max(1,cyClient/cyChar);
//allocatememoryforbufferandclearit
if(pBuffer!
=NULL)
free(pBuffer);
pBuffer=(TCHAR*)malloc(cxBuffer*cyBuffer*sizeof(TCHAR));
for(y=0;yfor(x=0;xBUFFER(x,y)='';
//setcarettoupperleftcorner
xCaret=0;
yCaret=0;
if(hwnd==GetFocus())
SetCaretPos(xCaret*cxChar,yCaret*cyChar);
InvalidateRect(hwnd,NULL,TRUE);
return0;
caseWM_SETFOCUS:
//createandshowthecaret
CreateCaret(hwnd,NULL,cxChar,cyChar);
SetCaretPos(xCaret*cxChar,yCaret*cyChar);
ShowCaret(hwnd);
return0;
caseWM_KILLFOCUS:
//hideanddestroythecaret
HideCaret(hwnd);
DestroyCaret();
return0;
caseWM_KEYDOWN:
switch(wParam)
{
caseVK_HOME:
xCaret=0;
break;
caseVK_END:
xCaret=cxBuffer-1;
break;
caseVK_PRIOR:
yCaret=0;
break;
caseVK_NEXT:
yCaret=cyBuffer-1;
break;
caseVK_LEFT:
xCaret=max(xCaret-1,0);
break;
caseVK_RIGHT:
xCaret=min(xCaret+1,cxBuffer-1);
break;
caseVK_UP:
yCaret=max(yCaret-1,0);
break;
caseVK_DOWN:
yCaret=min(yCaret+1,cyBuffer-1);
break;
caseVK_DELETE:
for(x=xCaret;xBUFFER(x,yCaret)=BUFFER(x+1,yCaret);
BUFFER(cxBuffer-1,yCaret)='';
HideCaret(hwnd);
hdc=GetDC(hwnd);
SelectObject(hdc,CreateFont(0,0,0,0,0,0,0,0,
dwCharSet,0,0,0,FIXED_PITCH,NULL));
TextOut(hdc,xCaret*cxChar,yCaret*cyChar,
&BUFFER(xCaret,yCaret),
cxBuffer-xCaret);
DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));
ReleaseDC(hwnd,hdc);
ShowCaret(hwnd);
break;
}
SetCaretPos(xCaret*cxChar,yCaret*cyChar);
return0;
caseWM_CHAR:
for(i=0;i<(int)LOWORD(lParam);i++)
{
switch(wParam)
{
case'\b':
//backspace
if(xCaret>0)
{
xCaret--;
SendMessage(hwnd,WM_KEYDOWN,VK_DELETE,1);
}
break;
case'\t':
//tab
do
{
SendMessage(hwnd,WM_CHAR,'',1);
}
while(xCaret%8!
=0);
break;
case'\n':
//linefeed
if(++yCaret==cyBuffer)
yCaret=0;
break;
case'\r':
//carriagereturn
xCaret=0;
if(++yCaret==cyBuffer)
yCaret=0;
break;
case'\x1B':
//escape
for(y=0;yfor(x=0;xBUFFER(x,y)='';
xCaret=0;
yCaret=0;
InvalidateRect(hwnd,NULL,FALSE);
break;
default:
//charactercodes
BUFFER(xCaret,yCaret)=(TCHAR)wParam;
HideCaret(hwnd);
hdc=GetDC(hwnd);
SelectObject(hdc,CreateFont(0,0,0,0,0,0,0,0,
dwCharSet,0,0,0,FIXED_PITCH,NULL));
TextOut(hdc,xCaret*cxChar,yCaret*cyChar,
&BUFFER(xCaret,yCaret),1);
DeleteObject(
SelectObject(hdc,GetStockObject(SYSTEM_FONT)));
ReleaseDC(hwnd,hdc);
ShowCaret(hwnd);
if(++xCaret==cxBuffer)
{
xCaret=0;
if(++yCaret==cyBuffer)
yCaret=0;
}
break;
}
}
SetCaretPos(xCaret*cxChar,yCaret*cyChar);
return0;
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdc,CreateFont(0,0,0,0,0,0,0,0,
dwCharSet,0,0,0,FIXED_PITCH,NULL));
for(y=0;yTextOut(hdc,0,y*cyChar,&BUFFER(0,y),cxBuffer);
DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));
EndPaint(hwnd,&ps);
return0;
caseWM_DESTROY:
PostQuitMessage(0);
return0;
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}