现在的位置: 首页 > 综合 > 正文

MFC制作程序界面锁定

2014年01月26日 ⁄ 综合 ⁄ 共 1599字 ⁄ 字号 评论关闭

    首先,我们先来思考一下,我们的需求是什么?

 

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

 

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

 

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

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

 

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

 

   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;
CLock
Dialog dlgLockSys;
if(IDOK == dlgLockSys.DoModal())
{
PostMessage(WM_SETCURSOR);
    //返回值为IDOK时则结束捕获,并复原鼠标样式
}
else
{
m_bLockSys = TRUE;
PeekAndPump();
    //继续捕获鼠标消息
}

抱歉!评论已关闭.