当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 > 第4章 Windows应用程序中的键盘与鼠标 > 4-2 键盘的操作应用举例 > 4-2
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表
好!下面
我们再通过一个键盘操作的例子
帮助大家进一步的熟练掌握键盘的操作
这个例子是这样的
我们要求
在键盘上输入一定的内容
然后,在窗口的客户区中显示对应的字符
比如说用户在窗口区输入
“这是一个有关键盘操作的示例程序”这个字符串
然后,我们如果程序的缓冲区
只设30个字符
那么请大家注意
一个汉字占两个字符的位置因为一个汉字是两个字节
而一个英文字符,是占一个字节
所以这一点,在输入汉字的时候大家要注意
当缓冲区满的时候
如果这个时候,再输入字符
就会出现(1)号提示错误
那么我这里标的是(1)号提示错误
就是出现这个错误信息
当用户按下左箭头直到光标到达本行的起始位置时
这时候箭头无法再往左移动
这时候出现(2)提示错误信息
这里(2)说你已经移动到起始位置
不能再往左移动了
就一个错误消息提示框
如果字符缓冲区中已经没有任何字符
这时候你还在按下Delete键的时候
就会出现(5)号错误信息
缓冲区已空
没有字符可供删除
如果当前光标位置处于本行的起始位置
这个时候,如果按下回退键BackSpace
就会出现(4)号错误
当前位置是文本的起始位置
不能回退的
因为你按BackSpace是回退
如果只是按下Esc键
就会出现(3)号错误
就是说你现在不能按Esc键
继续其他操作
实际上就是说
大家知道将来你编写应用程序的时候
想把某一些按键的功能给它锁死
不让它操作
你就可以这么做
比如说对Esc操作
给它过滤掉
说你不能这么按
继续别的操作
实际上,就把Esc键呢功能给它过滤掉了
好!我们仍然只讲WndProc
假设我们设置了缓冲区大小为30
然后设置了一个静态数组
这个字符数组
这个用来保存输入的字符
那么这个,我们用define宏定义的话
就是定义成数组大小为30
30的话,大家知道最多只能输入15个汉字
那么这时候,我们要计算已经输入的字符个数
或者说在操作过程中
我们对字符进行的删除
删除后剩下的字符个数
还有,当前字符的位置
当然,还有字符的宽度和高度
这是字符的信息
以及定义了字符信息的tm
和绘图信息的结构体变量PtStr
好了!我们相应的字符消息
如果字符消息是BackSpace回退键
那么这时候如果当前位置是0
已经到文件的起始位置
那么这时候是不能再回退的
我们通过一个MessageBox在当前的窗口中
显示错误提示信息
那么这个MB_OK是什么
MB_OK就是这个按钮的ID
那么你单击这按钮
这个提示框就关闭了
所以这里面
有一个MessageBox里面有一个MB_OK
那么单击这个按钮,这个消息框就关闭
这个是消息框里面显示的错误信息
那么我们说,如果是遇到BackSpace
这个时候光标的位置已经到0
也就是起始位置的时候
就不能再BackSpace
否则的话,每按一次BackSpace当前位置就要减一
就要回退一个位置
回退一个位置
因为BackSpace具有删除功能
所以每回退一个字符
当前缓冲区的字符个数就要减掉一个
那么这是对字符总数进行计数
然后的话,由于减掉一个字符后
屏幕内容就要刷新
刷新完,显示减掉字符后的剩下的字符
所以要求刷新
刷新就要发送WM_PAINT消息
好!那么WM_PAINT消息,我们回头再介绍
我们就要求这里,就是说
遇到BackSpace键的时候它发出的响应
如果遇到Esc键
这是用Esc的虚拟键
这里,通过一个消息框告诉它
“您现在不能按Esc键,请继续别的操作”
那么这个,也是按OK按钮关闭消息对话框
那么实际上你按了Esc键后没有做任何操作
只得到了一个错误提示
所以实际上,已经把Esc过滤掉了
在这里边如果当前的字符个数
就是输入的字符个数
超出缓冲区的大小
因为我们缓冲区设置的是长度为30个字符的缓冲区
也就是说只能输入15个汉字
那么这时候,会有一个消息
“缓冲区已满,不能再输入字符了”
这里,是一个换行
“如果需要删除字符,请用BackSpace键”
然后,这里仍然有一个回车
错误消息提示框里面有两行内容
我们看,这个地方就是这个
缓冲区已满
是吧不能再输入字符
如果要删除字符的话请用BackSpace键
这一块代码,实际上它的作用是在于光标的位置
插入字符
大家知道如果说我这屏幕上有那么几个字符在这
那么光标,比如说在这个位置
但原来这里是有字符的
我如果插入字符的话,应该把这里的字符
先往后移
腾出空的位置
那么往后移,一般是这样
就是说如果我们这个缓冲区足够长的话应该把
这倒数这往后移
然后呢这一个往后移
这样一个一个移过来后
那么这一个位置就空的就腾出来
插入字符
所以,我们通过这么一个循环
实现了字符往后移的操作
所以,这样是x-1的位置
放到x的位置
然后,它是从总字符数
循环起始点是字符数
然后到当前的位置
所以是从后面开始移动的
就是从后面一个一个先往后挪
你如果说前面这里移过来
然后再从这里移过来
实际上会把字符冲掉
就会只剩下一个字符
所以的话,一定是从后面开始挪的
挪完了,腾出当前位置之后
我们就获取了这个当前位置的这个下标
然后插入字符后
那么当前位置就加1了
为什么,因为插入字符后光标自动往下走
所以说当前位置就是光标所在的位置
当然插入一个字符后,字符的总数也是加1的
所以这一块代码呢实现的是插入一个字符的操作
那么我们看一下窗口程序运行的时候
我们这个地方
WM_CREATE消息
WM_CREATE消息大家知道是程序一运行
它马上就执行的消息
那么也是获取DC
获取字符消息以及它的高度宽度
就获取这些
那么我们接收到按键消息的时候
如果是按下
如果按下的时候
按下是VK_END键消息
那么这时候
这是字符个数
把字符个数的值作为当前位置的值
那么如果按下的是HOME键
那么光标是移到起始位置的
所以当前位置呢就变成0
如果遇到Delete消息
删除消息
那么Delete消息是删除消息
这个删除消息,就是说
光标可以在任意位置的时候,按下Delete键
那么删除的时候
就从这个位置开始删除
那么这样的话
如果字符位置是结束的位置
就是当前的位置是等于
本行的末尾
这时候呢
如果按删除键
这个时候缓冲区里已经空了
没有字符可供删除
因为,字符的个数等于它的位置的情况下
那么这个时候,光标应该是在最末尾
光标是在最末尾
所以没有可供删除的
所以这里就有一个提示
消息已空
那么如果不是的话
那么这时候按删除键
可以在x等于这个是光标当前所在位置开始
到最后是字符串的长度
就是字符的总个数处
从当前位置到结束位置
就可以这么理解
那么就是往后移
把后面的内容的话
加1的字符,放到前面来
那么实际上
就是当前位置删除
后面内容移到前面来
移到前面来总个数就要减1
然后刷新
这里是VK_LEFT
按下左方向键的时候
左方向键就是左箭头键
如果这时候当前位置的值大于0
那么你就位置减1
那么按键盘的左键的时候
是不会删除任何字符的
只是当前光标位置往左移
所以的话它不会影响字符总数的这个值
而只影响当前光标位置的值
那么如果呢不大于0
那最多只能等于0
不会小于0
那么这时候
就是说你已经移到起始位置
不能再往左移动了
那么如果我按下的是右箭头
右键头的时候
就是说如果现在这个总数
就是字符的总数
还大于当前位置
那说明光标的位置没有到本行的结尾
那么这个时候位置可以加1
仍然跟前面一样
只移动光标当前位置
不会改变字符的总个数
那么对WM_PAINT消息来说
我们很简单
就是BeginPaint获取一个DC
然后输出文本
那么这个文本,是哪里的文本
是cCharBuf里面的文本
-讨论实录
--0-0
-1-1 Windows应用程序的特点
--1-1
-1-2 可视化编程
--1-2
-1-3 关于API
--1-3-1
--1-3-2
-1-4 Windows应用程序组成及编程步骤
--1-4-1
--1-4-2
-1-5 应用程序举例
--1-5-1
--1-5-2
--1-5-3
-02-1 Windows图形设备接口
-02-2 绘图工具与颜色
-02-3 常用绘图函数
-02-4 例题和作业
-第2章源代码
--外部链接
--外部链接
-3-1 设置文本的设备环境
-3-2 文本的输出过程
-3-3 例题和作业
-第3章源代码
--外部链接
-4-1 Windows 应用程序中的键盘与鼠标
--4-1
-4-2 键盘的操作应用举例
--4-2
-4-3 例题
--4-3
-4-3 鼠标在应用程序中的应用
--4-3
-4-4 例题4-4
--4-4
-第4章源代码
--外部链接
-5-1 菜单和加速键资源及其应用
--5-1
-5-1(例1)
--5-1(例1)
-5-2 位图资源及其应用
--5-2
-5-3 对话框资源及其应用
--5-3-1
--5-3-2
-5-4 图标资源的应用
--5-4
-第5章源代码
--外部链接
-第一次作业
--第一次作业--作业
-第二次作业
--第二次作业--作业
-第三次作业
--第三次作业--作业