TYPER.docx
- 文档编号:24279469
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:11
- 大小:16.65KB
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;y for(x=0;x BUFFER(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;x BUFFER(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;y for(x=0;x BUFFER(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;y TextOut(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); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TYPER