TYPER.docx

上传人:b****3 文档编号:10465644 上传时间:2023-05-26 格式:DOCX 页数:11 大小:16.65KB
下载 相关 举报
TYPER.docx_第1页
第1页 / 共11页
TYPER.docx_第2页
第2页 / 共11页
TYPER.docx_第3页
第3页 / 共11页
TYPER.docx_第4页
第4页 / 共11页
TYPER.docx_第5页
第5页 / 共11页
TYPER.docx_第6页
第6页 / 共11页
TYPER.docx_第7页
第7页 / 共11页
TYPER.docx_第8页
第8页 / 共11页
TYPER.docx_第9页
第9页 / 共11页
TYPER.docx_第10页
第10页 / 共11页
TYPER.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

TYPER.docx

《TYPER.docx》由会员分享,可在线阅读,更多相关《TYPER.docx(11页珍藏版)》请在冰点文库上搜索。

TYPER.docx

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);

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2