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

来源:互联网 发布:西门子plc200编程100例 编辑:程序博客网 时间:2024/06/01 09:22


基于对话框的程序中,每当用户按下回车键时,程序都会退出,其效果和按下对话框中的默认"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 valueDC_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