转自:https://blog.youkuaiyun.com/ahuang1900/article/details/17386611
在opencv中可以通过cvGetWindowHandle获取窗口句柄。cvGetWindowHandle的返回值解释为:函数cvGetWindowHandle返回原始的窗口句柄(在Win32情况下返回HWND,GTK+情况下返回GtkWidget)。一开始的处理时,通过以下方法:
-
cvNamedWindow("raw");
-
HWND hWnd = (HWND)cvGetWindowHandle("raw");
-
ShowWindow(hWnd, 0); //0的时候表示隐藏窗口
结果显示为:
从上面看,窗口显然没有隐藏起来。经过一番验证,原来hWnd指向的不是“raw”窗口的句柄。通过查看cvNameWindow代码,原来cvNameWindow创建窗口的时候会创建两个窗口,一个主窗口,一个子窗口。
代码如下:
-
CV_IMPL int cvNamedWindow( const char* name, int flags )
-
{
-
...... ......
-
HWND hWnd, mainhWnd;
-
CvWindow* window;
-
DWORD defStyle = WS_VISIBLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
-
...... ......
-
mainhWnd = CreateWindow( "Main HighGUI class", name, defStyle | WS_OVERLAPPED,
-
rect.x, rect.y, rect.width, rect.height, 0, 0, hg_hinstance, 0 );
-
if( !mainhWnd )
-
CV_ERROR( CV_StsError, "Frame window can not be created" );
-
ShowWindow(mainhWnd, SW_SHOW);
-
//YV- remove one border by changing the style
-
hWnd = CreateWindow("HighGUI class", "", (defStyle & ~WS_SIZEBOX) | WS_CHILD, CW_USEDEFAULT, 0, rect.width, rect.height, mainhWnd, 0, hg_hinstance, 0);
-
if( !hWnd )
-
CV_ERROR( CV_StsError, "Frame window can not be created" );
-
ShowWindow(hWnd, SW_SHOW);
-
...... ......
-
}
通过查看源代码,恍然大悟,于是将代码改成如下,即可。
-
cvNamedWindow("raw");
-
HWND hWnd = (HWND)cvGetWindowHandle("raw");
-
HWND hRawWnd = ::GetParent(hWnd); //获得父窗口句柄
-
ShowWindow(hWnd, 0); //0:的时候表示隐藏子窗口
-
ShowWindow(hRawWnd, 0); //0:的时候表示隐藏父窗口
这样,opencv的窗口就不在显示了。看来以后要多跟跟源代码,这样可以减少一些不必要的功夫。