MFC制作程序界面锁定 .

来源:互联网 发布:ws软件 编辑:程序博客网 时间:2024/05/21 06:46
首先,我们先来思考一下,我们的需求是什么?

 

    我们需要锁住程序界面,效果是,当锁住界面后,点击界面的任何一处都没有反应,或者弹出解锁对话框.

 

    第二步,我们思考一下,如何完成这样一个需求?

 

   我们可以这样做,我们需要捕获用户的鼠标或者键盘消息,然后让其按照我们的需求来做事情,对不对?比如,当用户点击界面时,捕获住鼠标左键的动作,然后弹出解锁对话框,当用户成功解锁后,不再捕获鼠标消息,当用户解锁失败后,我们仍然继续捕获鼠标消息.

   当然,我们可做的更完善一些,当界面锁定时,我们可以改变鼠标的样式,将其变成我们自定义的鼠标锁定样式.

 

   大致思路,我们已经想好了,接下来,我们可以动手开始做了.

 

   1。在你的锁定按钮事件里添加如下代码:

m_bLockSys = TRUE;    //类中定义的BOOL型变量,判断界面是否锁定 PostMessage(WM_SETCURSOR);     //发消息改变鼠标样式,需要添加消息函数,接下来会介绍,见2 PeekAndPump();    //用于捕获鼠标消息,见3

  

   2。在你的类中添加如下消息函数,用于改变鼠标样式:

头文件中:

afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);

实现文件中:

BEGIN_MESSAGE_MAP(..., ....)

...

     ON_WM_SETCURSOR()    //添加消息循环

...

END_MESSAGE_MAP()

 

OnSetCursor函数实现:

//当程序会被锁住时,改变鼠标的图标 BOOL yourClass::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(m_bLockSys) { ::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_LOCKSYS)); return TRUE; } return CUIDialog::OnSetCursor(pWnd, nHitTest, message); }

 

    3PeekAndPump()函数的实现:

//当加锁时,过滤鼠标消息 BOOL yourClass::PeekAndPump() { static MSG msg; while(m_bLockSys) { if (::PeekMessage(&msg,NULL,0,0, PM_REMOVE))    

          //PeekMessage该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的msg结构中。
  { if (msg.message >= WM_MOUSEMOVE && msg.message <= WM_MBUTTONDBLCLK) { if (msg.message == WM_LBUTTONDOWN) { SendMessage(WM_SYS_UNLOCK,NULL,NULL);    //发送自定义消息,我在自定义消息函数中弹出解锁对话框 } } else { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } Sleep(1); } return TRUE; }

 

  4。解锁的实现:

在弹出对话框后,根据对话框的返回值,决定是改变鼠标样式为正常并结束捕获鼠标消息还是继续捕获

以下是自定义消息WM_SYS_UNLOCK中的代码:

m_bLockSys = FALSE; CLockDialog dlgLockSys; if(IDOK == dlgLockSys.DoModal()) { PostMessage(WM_SETCURSOR);    //返回值为IDOK时则结束捕获,并复原鼠标样式 } else { m_bLockSys = TRUE; PeekAndPump();    //继续捕获鼠标消息 }

原创粉丝点击