天天看點

禁用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建立的視窗的關閉按鈕可用,就調用一下該函數即可,參數很簡單,就是視窗名字,試了一下,還是不錯的!這樣就不用擔心誤點了叉号關閉視窗後程序無法退出了,因為根本點不了了!哈哈

繼續閱讀