天天看点

禁用CvNamedWindow中的关闭按钮

  摘http://www.cnblogs.com/zby03/articles/807495.html

直接摘来如下:

今天在写一个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创建的窗口的关闭按钮可用,就调用一下该函数即可,参数很简单,就是窗口名字,试了一下,还是不错的!这样就不用担心误点了叉号关闭窗口后进程无法退出了,因为根本点不了了!哈哈

继续阅读