今天在写一个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);
}