zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    洛谷 [P1024]一元三次方程求解
    洛谷 [P1426] 通往奥格瑞玛的道路
    洛谷 [p1439] 最长公共子序列 (NlogN)
    洛谷 [P1182] 数列分段
    洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
    洛谷 [P1280] 尼克的任务
    洛谷 [P1801] 黑匣子
    洛谷 [p1196] 银河英雄传说
    洛谷 [P2024] 食物链
    洛谷 [P1198] 最大数
  • 原文地址:https://www.cnblogs.com/skyseraph/p/1876706.html
Copyright © 2011-2022 走看看