VC 程序中定制对话框中的回车键


基于对话框的程序中,每当用户按下回车键时,程序都会退出,其效果和按下对话框中的默认"OK"按钮是一样的,即使去掉"OK"按钮的  

BS_DEFPUSHBUTTON
属性也没用。那么如何定制回车键的行为呢?


要解决问题,必须搞清楚背后所发生的一切,在 Spy++ 中可以看到,当用户按下回车键时,Windows发送一个特殊的 DM_GETDEFID 消息来获得缺省的命令ID,Windows再将它作为 WM_COMMAND 发送。所以,我们要做的就是重载 DM_GETDEFID 消息。

在有关 Windows 的文档中是这样描述 DM_GETDEFID 返回值的:"如果有缺省的按钮,则返回值的高位字包含 DC_HASDEFID,低位字包含控制的标识符。否则,返回值是零"。根据这段描述,假设如果没有缺省得按钮,则返回值应该是零。如果想要 disable 缺省的 ID,必须在低位字中返回0,在高位字中返回 DC_HASDEFID,。因此定义和实现消息映射函数如下:


BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
      ON_MESSAGE(DM_GETDEFID, OnGetDefID)
      ...
END_MESSAGE_MAP()

LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp) 
{
    return MAKELONG(0, DC_HASDEFID); 
}

因为 MFC 没有对应 DM_GETDEFID 的宏,你必须使用通用的 ON_MASSAGE 宏。这样用户可以随意按回车键,但什么事都不会发生。


附:MSDN 的解释:

DM_GETDEFID message


Parameters

wParam

This parameter is not used and must be zero.

lParam

This parameter is not used and must be zero.

Return value

If a default push button exists, the high-order word of the return value contains the value DC_HASDEFID and the low-order word contains the control identifier. Otherwise, the return value is zero.

Remarks

The DefDlgProc function processes this message. 




注:本文参考:http://www.cnblogs.com/MayGarden/archive/2010/12/29/1920949.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值