Fork me on GitHub

VC学习笔记:回车键

VC学习笔记:回车键

SkySeraph NOV.9th 2009 HQU

Email-zgzhaobo@gmail.com  QQ-452728574

Latest Modified Date:NOV.9th 2010 HQU

回车键实现 输入焦点的传递

0  前期:建立单文档工程;新增对话框,关联类CTestDlg;新增菜单,添加View类消息处理函数;View头文件中包含CTestDlg

1  实现功能:当在第一个编辑框中按下回车键后,将输入焦点转移到第二个编辑框...,首先需要屏蔽回车键关闭对话框功能

缺省按钮

默认情况下,OK按钮的属性中默认选上了Default button,屏蔽只需要双击/右击,选择注销OnOk响应中的Cdialg::OK()

编辑框按钮

选上Multiline,接受多行,才能效应回车键;WS_TABSTOP默认选上

默认按钮

当用户按下回车键时,先检查对话框中是否存在指定的默认按钮(Default button),如果有,则调用该默认按钮的消息响应函数;若没有,会调用虚拟的OnOK函数。

2  焦点的转移实现的两种方法:①为编辑框关联类,利用此类来捕获按钮消息  ②修改编辑框窗口过程函数

窗口所有消息都要到窗口过程中报到的,修改制定窗口的属性采用SetWindowLong函数

LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong);

//返回值为窗口制定的32位整形值,如果nIndex为GWL_WNDPROC, 则返回该窗口制定的窗口过程的地址

3 把SetWindowLong函数放哪?

放WM_CREATE消息响应函数中?

在响应这个消息时,对话框的子控件还未创建完成,只有在消息处理完毕之后,对话框及子控件才创建完成

在程序运行时,当对话框及其子窗口创建完成,将要显示之前会发生一个消息:WM_INITDIADLG,[在CTestDlg类添加此消息响应函数]

4  程序

//①编辑编辑框 窗口过程

WNDPROC preProc;

LRESULT CALLBACK MyProc

(                HWND hwnd,

UINT uMsg,

WPARAM wParam,

LPARAM lParam

)

{

if(uMsg==WM_CHAR && wParam ==0x0d)//截取WM_CHAR消息并作相应判断和处理,因为对于WM_CHAR消息,其wParam参数保存的是字符的ASC码

{

//获得窗口句柄的方法

//法一

//::SetFocus(GetNextWindow(hwnd ,GW_HWNDNEXT)); //MyProc是全局函数,不能调用CWnd类的成员函数,只能使用相应的SDK函数

//HWND GetNextWindow(HWND hWnd,UINT wCmd);

//法二

//SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));

//HWND GetWindow(HWND hWnd,UINT uCmd);

//法三

SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));

//HWND GetNextDlgTabItem(HWND hDlg,HWND hCtl,BOOL bPrevious);

return 1;

}

else

{

return preProc(hwnd,uMsg,wParam,lParam);

}

}

//②改变窗口属性

BOOL CTestDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO:  在此添加额外的初始化

preProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)MyProc);

//LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong);

//返回值为窗口制定的32位整形值,如果nIndex为GWL_WNDPROC, 则返回该窗口制定的窗口过程的地址

return TRUE;  // return TRUE unless you set the focus to a control

// 异常: OCX 属性页应返回 FALSE

}

//③依次传递功能的实现

void CTestDlg::OnBnClickedOk()

{

//把Multiline属性去掉

//GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();//不能实现功能

//GetFocus()->GetNextWindow()->SetFocus();//最后一个控件调用此函数时,返回的这个窗口指针式NULL,再调用SetFocus时非法访问

//GetFocus()->GetWindow()->SetFocus();//同上

GetNextDlgTabItem(GetFocus())->SetFocus();//OK

//OnOK();

}

总结:① ② ③

  • 参考:孙鑫视频-7

 

VC回车键和关闭

当用VC建立对话框之后,直接点击回车键之后,对话框就自动关闭了,如果要实现点击回车键不关闭对话框,且能实现相关的功能,则需要重新定义PreTranslateMessage函数。其基本流程如下:

 1.在对话框中,鼠标右键>>ClassWizard。

 2.选择添加PreTranslateMessage函数:

 3.编辑函数PreTranslateMessage:

BOOL RegisterDllDialog::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class

 

/*** @如果敲击回车键,响应检测用户是否正确的函数.*/

if( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN )

{

/*@自己定义的函数*/

   OnCheckuser();

   return true;

}

return CDialog::PreTranslateMessage(pMsg);

}

这样再点击回车键的时候就会调用您自己定义的函数,当然如果不定义的话,敲击回车键,不会有任何反应。

 

对于对话框右上角的关闭按钮,其响应函数为OnClose,只需要在上面第二张图中的Message中选择WM_CLOSE,添加函数就可以出来OnClose函数。如果你想在用户点击这个关闭按钮的时候,做一些响应,就可以而对这个函数进行处理。

void RegisterDllDialog::OnClose()

{

// TODO: Add your message handler code here and/or call default

CDialog::OnClose();

}

 源文档 <http://hi.baidu.com/hg60/blog/item/f9322d856f8449d5bd3e1e49.html>

 

Author:         SKySeraph

Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

From:         http://www.cnblogs.com/skyseraph/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。

posted @ 2010-11-13 22:13  SkySeraph  阅读(3982)  评论(0编辑  收藏  举报