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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。
作者:skyseraph
出处:http://www.cnblogs.com/skyseraph/
更多精彩请直接访问SkySeraph个人站点:http://skyseraph.com//
Email/GTalk: zgzhaobo@gmail.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。