VC对话框焦点转换问题

建立一个基于对话框的应用程序,可以看到在CXxxApp的InitInstance()函数中:

    CDlgaDlg dlg;

    m_pMainWnd = &dlg;

应用程序启动时,必须对CXxxApp的成员变量m_pMainWnd进行赋值,否则无法运行。在单文档的工程中,我们看不到这种赋值操作,它是在

   if (!ProcessShellCommand(cmdInfo))

       return FALSE;

在ProcessShellCommand函数中对m_pMainWnd赋了值。

一、return false和return ture的区别:

1. 在CXxxApp的InitInstance()函数中:

return false:退出应用程序,不进入消息循环。

return ture:应用程序进入消息循环。

2. 在对话框类中的OnInitDialog()中:

return false:如果在OnInitDialog()函数中设置了某控件得到焦点,如:

      GetDlgItem(IDC_EDIT1))->SetFocus();

      应return false,否则上一句代码不会生效。

return ture:在OnInitDialog()函数中没有设置了某控件得到焦点,应return ture。

说明:要使对话框上的某个控件在一显示对话框,就具有焦点,还可以将该控件的

      Table Order设为1。

二、在对话框中响应回车键:

在对话框中回车,会执行缺省按钮(Default Button)的函数,默认的缺省按钮是IDOK。如果没有缺省按钮,会执行对话框中的OnOK()函数。所以,在一个对话框中要控制回车键,可以采用下面的方法:

1. 在OnOK()函数中添加代码:

在对话框中添加四个文本框,我们想用户按回车键时,四个文本框依次循环得到焦点:

if(GetFocus()==GetDlgItem(IDC_EDIT4))    //如果第四个文本框得到焦点

        GetDlgItem(IDC_EDIT1)->SetFocus();   //使第一个文本框得到焦点

else if (GetFocus()->GetDlgCtrlID()==IDOK)   //如果“确定”按钮得到焦点

        CDialog::OnOK();            //对话框返回

else

        GetFocus()->GetNextWindow()->SetFocus(); 

//使当前具有焦点窗口的下一个(按照Table Order顺序)窗口得到焦点

2. 添加按钮,将其设置为缺省按钮,Visible属性设为false,为它添加响应函数,在其中编程(代码类似1)。

3. 更换回调函数:

我们更换第一个文本框的回调函数,让它不响应回车键。

i.                     定义一个全局变量WNDPROC  oldProc; 用于保存原来的回调函数的指针。

ii.                   在对话框类中的OnInitDialog()中用SetWindowLong函数更换第一个文本框的回调函数为newProc

oldProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(long) newProc);

iii.                  定义newProc函数:

  LRESULT CALLBACK newProc (

HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)

{

       if(uMsg==WM_CHAR)     //如果是字符消息

       {

              if(0xd==wParam)   //如果是回车键

                     return 1;     //不处理就返回,即不响应回车键

       }

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

              //其它消息仍由原来的回调函数处理

}

说明:此种方法要文本设置文本框的MultiLine 和Want return属性设为有效。

三、制作一个可以响应WM_MOUSEMOVE消息的按钮:

1. 新建一个类CHide ,从CButton派生,增加成员对象CHide *m_btnFriend,在类中响应WM_MOUSEMOVE消息,在OnMouseMove中添加代码:

    ShowWindow(SW_HIDE);

    m_pmyFriend->ShowWindow(SW_NORMAL);

2. 在对话框的头文件中加入#include “hide.h”

3. 为对话框上的“确定”和“取消”按钮添加捆绑变量

i.                     静态绑定:

a.       用ClassWizard为对话框上的“确定”和“取消”按钮添加捆绑变量,

     CHide             m_btnOK;

       CHide             m_btnCancel;

并将其中一个按钮的Visible属性设为false。

b.       此种方法会在对话框的DoDataExchange函数中添加

       DDX_Control(pDX, IDCANCEL, m_btnCancel);

       DDX_Control(pDX, IDOK, m_btnOK);

c.       在对话框类中的OnInitDialog()中添加代码:

     m_btnOK.m_pmyFriend=&m_btnCancel;

       m_btnCancel.m_pmyFriend=&m_btnOK;

ii.                   动态绑定:

a.       定义两个成员变量:

     CHide             m_btnOK;

       CHide             m_btnCancel;

b.       在对话框类中的OnInitDialog()中添加代码:

     m_btnOK.m_pmyFriend=&m_btnCancel;

m_btnCancel.m_pmyFriend=&m_btnOK;

m_btnOK.SubclassDlgItem(IDOK,this);

m_btnCancel.SubclassDlgItem(IDCANCEL,this);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值