游戏编程入门学习笔记30——菜单篇——窗口子类

我的目标是做一个各对战平台打dota时自定义快捷键的那种对话框。

 

一开始的想法是只允许对话框输入一个大写字母,然后每次获得焦点时清空对话框。

但是这样明显存在一个问题,就是无法使用TABCTRL等游戏时常会用的快捷键。

默认的edit是不接受这些非文本键输入的,所以预期需要对键盘消息进行处理,然后自定义相应的显示字符。

 

因此重看《windows程序设计》关于键盘的章节。

 

然后我试着在DlgProc里添加键盘消息处理语句,发现不奏效。

“一般来说,对话框过程只是在对话框创建时初始化子窗口控件,其后处理子窗口传来的消息,最后结束对话框。对话过程一般既不处理WM_PAINT消息,也不直接处理键盘和鼠标的输入。” ——《Windows程序》385

这里要注意“对话框过程”和“对话框窗口过程”的区别,前者是我们自己写的可见的proc函数,而后者似乎隐藏在系统中。前者只处理部分消息,剩余的全部交给后者。

对话框过程只接受子窗口控件的WM_COMMAND,而edit窗口又不接受tabcaps等键输入。

似乎一筹莫展了。

 

这时我在百度上搜到一篇文章《使用子类化技术,让对话框中的 Edit 控件接受 TAB 键(纯属抄袭MSDN)》

http://www.cnblogs.com/henryzc/archive/2005/10/28/263605.html

这时候之前研究的子类窗口技术终于派上用场了。

 

这里说下所谓的窗口子类技术(subclass of the window)是个什么概念。

就是需要对系统提供的控件功能进行扩展或者修正时,可以用setwindowlong函数给子控件定义一个新的过程,在里面处理相关消息。未处理的消息,仍返还给系统原默认的子控件过程。

在MFC中也许可以方便的派生类就搞定了,不过我这用的纯win32 API编程,只能这么麻烦。

 

试着做一个EditSubclassProc,在其中加入对WM_KEYUP消息的处理,并试着对自身发送消息控制显示。

实验成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值