欢迎来到天天文库
浏览记录
ID:51492478
大小:103.90 KB
页数:16页
时间:2020-03-25
《Windows编程之插入符号(不是光标).pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Windows编程之插入符号(不是光标)当您往程序中输入文字时,通常有一个底线、竖条或者方框来指示输入的下一个字符将出现在屏幕上的位置。这个标志通常称为「光标」,但是在Windows下写程序,您必须改变这个习惯。在Windows中,它称为「插入符号」。「光标」是指表示鼠标位置的那个位图图像。插入符号函数主要有五个插入符号函数:CreateCaret建立与窗口有关的插入符号SetCaretPos在窗口中设定插入符号的位置ShowCaret显示插入符号HideCaret隐藏插入符号DestroyCaret撤消插入符号另外还有取得插入符号目前位置(GetCaretP
2、os)和取得以及设定插入符号闪烁时间(GetCaretBlinkTime和SetCaretBlinkTime)的函数。在Windows中,插入符号定义为水平线、与字符大小相同的方框,或者与字符同高的竖线。如果使用调和字体,例如Windows内定的系统字体,则推荐使用竖线插入符号。因为调和字体中的字符没有固定大小,水平线或方框不能设定为字符的大小。如果程序中需要插入符号,那么您不应该简单地在窗口消息处理程序的WM_CREATE消息处理期间建立它,然后在WM_DESTROY消息处理期间撤消。其原因显而易见:一个消息队列只能支持一个插入符号。因此,如果您的程序有多个
3、窗口,那么各个窗口必须有效地共享相同的插入符号。其实,它并不像听起来那么多限制。您再想想就会发现,只有在窗口有输入焦点时,窗口内显示插入符号才有意义。事实上,闪烁的插入符号只是一种视觉提示:您可以在程序中输入文字。因为任何时候都只有一个窗口拥有输入焦点,所以多个窗口同时都有闪烁的插入符号是没有意义的。通过处理WM_SETFOCUS和WM_KILLFOCUS消息,程序就可以确定它是否有输入焦点。正如名称所暗示的,窗口消息处理程序在有输入焦点的时候接收到WM_SETFOCUS消息,失去输入焦点的时候接收到WM_KILLFOCUS消息。这些消息成对出现:窗口消息处理
4、程序在接收到WM_KILLFOCUS消息之前将一直接收到WM_SETFOCUS消息,并且在窗口打开期间,此窗口总是接收到相同数量的WM_SETFOCUS和WM_KILLFOCUS消息。使用插入符号的主要规则很简单:窗口消息处理程序在WM_SETFOCUS消息处理期间呼叫CreateCaret,在WM_KILLFOCUS消息处理期间呼叫DestroyCaret。这里还有几条其它规则:插入符号刚建立时是隐蔽的。如果想使插入符号可见,那么您在呼叫CreateCaret之后,窗口消息处理程序还必须呼叫ShowCaret。另外,当窗口消息处理程序处理一条非WM_PAIN
5、T消息而且希望在窗口内绘制某些东西时,它必须呼叫HideCaret隐藏插入符号。在绘制完毕后,再呼叫ShowCaret显示插入符号。HideCaret的影响具有累积效果,如果多次呼叫HideCaret而不呼叫ShowCaret,那么只有呼叫ShowCaret相同次数时,才能看到插入符号。TYPER程序程序6-5所示的TYPER程序使用了本章讨论的所有内容,您可以认为TYPER是一个相当简单的文字编辑器。在窗口中,您可以输入字符,用光标移动键(也可以称为插入符号移动键)来移动光标(I型标),按下Escape键清除窗口的内容等。缩放窗口、改变键盘输入语言时都会清除
6、窗口的内容。本程序没有卷动,没有文字寻找和定位功能,不能储存文件,没有拼写检查,但它确实是写作一个文字编辑器的开始。程序6-5TYPERTYPER.C/*------------------------------------------------------------------------TYPER.C--TypingProgram(c)CharlesPetzold,1998--------------------------------------------------------------------------*/#include7、ws.h>#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_HREDRAW8、CS_VRED9、RAW;wndclass.lpfnWn
7、ws.h>#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
8、CS_VRED
9、RAW;wndclass.lpfnWn
此文档下载收益归作者所有