opencv中窗口置顶的方法

    技术2022-07-04  163

    今天想将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)