opencv中窗口置顶的方法

来源:互联网 发布:sql数据库还原 编辑:程序博客网 时间:2024/05/19 01:13

转:http://blog.csdn.net/sing_sing/article/details/6126466

今天想将opencv中的窗口置顶,以便在任何时候都可以看到摄像头显示的内容。

opencv中通过cvGetWindowHandle可以获取窗口句柄。cvGetWindowHandle的返回值解释如下:

函数cvGetWindowHandle返回原始的窗口句柄(在Win32情况下返回HWND,GTK+情况下返回GtkWidget)

刚开始处理时,通过以下方法:

 HWND hWnd = (HWND)cvGetWindowHandle("raw");
  if (hWnd!= NULL) {
  BOOL bRet = ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_NOMOVE);
  assert(bRet);
 }

返回值正确,但确没达到效果。经过一番验证,原来hWnd指向的不是“raw”窗口的句柄。通过GetWindowText获取的窗口标题为空的。查看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);

 ...... ......

}

恍然大悟,于是将代码改成如下,F5运行,ok。搞定。

 HWND hWnd = (HWND)cvGetWindowHandle("raw");
 HWND hRawWnd = ::GetParent(hWnd);
 if (hRawWnd != NULL) {
  BOOL bRet = ::SetWindowPos(hRawWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_NOMOVE);
  assert(bRet);
 }

 

看来以后要多跟跟源代码,这样可以减少一些不必要的功夫。

0 0