禁用cvNamedWindow所创建窗口的系统菜单关闭按钮

来源:互联网 发布:python heatmap 编辑:程序博客网 时间:2024/05/22 14:41
天在写一个MFC程序时,需要临时禁用cvNamedWindow所创建窗口系统菜单上的关闭按钮,开始觉得没什么,直接写代码如下:

HWND hCvWnd=(HWND)cvGetWindowHandle(windowTitle);
CWnd* pCvWnd=CWnd::FromHandle(hCvWnd);
if(pCvWnd!=NULL)
{
     CMenu* pSystemMenu=pCvWnd->GetSystemMenu(FALSE);
     if(pSystemMenu!=NULL)
         pSystemMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);
}

进行测试,没有达到预期目的。开始以为可能是方法不对,用其他几种方法试验,仍达不到预期效果。调试好久,偶然发现使用cvNamedWindow创建窗口时,其实创建了两个窗口,一个容器窗口和一个子窗口,创建时的窗口名称为子窗口的名称。因此将原先的代码修改如下后则可达到预期目的。

HWND hCvWnd=(HWND)cvGetWindowHandle(windowTitle);
CWnd* pCvWnd=CWnd::FromHandle(hCvWnd);
if(pCvWnd!=NULL)
{
     CMenu* pSystemMenu=pCvWnd->GetParent()->GetSystemMenu(FALSE);
     if(pSystemMenu!=NULL)
          pSystemMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);

}


之,然也,但是觉得如果每个窗口都写这么一段岂不是也挺费劲,干脆将其作为一个函数使用,反正参数只有一个即:windowtitle,改为一个全局函数(虽然不太好)

如下:

void CloseDisable(char *title)
{
 HWND hCvWnd = (HWND)cvGetWindowHandle( title );
 CWnd* pCvWnd = CWnd::FromHandle(hCvWnd);
 if(pCvWnd != NULL)
 {
  CMenu* pSystemMenu = pCvWnd->GetParent()->GetSystemMenu(FALSE);
  if(pSystemMenu != NULL)
   pSystemMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);
 } 
}

这样如果不想让cvNamedWindow创建的窗口的关闭按钮可用,就调用一下该函数即可,参数很简单,就是窗口名字,试了一下,还是不错的!这样就不用担心误点了叉号关闭窗口后进程无法退出了,因为根本点不了了!哈哈


原创粉丝点击