From 63c49be4879b71220f073f31d3a15c41f8e7f5a7 Mon Sep 17 00:00:00 2001 From: Ashod Nakashian Date: Tue, 25 Nov 2014 17:20:54 -0500 Subject: [PATCH] highgui: Support to change trackbar count in setTrackbarPos and replaced deprecated CreateToolbarEx in Windows. --- .../include/opencv2/highgui/highgui_c.h | 1 + modules/highgui/src/window.cpp | 5 ++ modules/highgui/src/window_QT.cpp | 13 ++++++ modules/highgui/src/window_cocoa.mm | 31 +++++++++++++ modules/highgui/src/window_gtk.cpp | 37 +++++++++++++++ modules/highgui/src/window_w32.cpp | 46 +++++++++++++++++-- 6 files changed, 129 insertions(+), 4 deletions(-) diff --git a/modules/highgui/include/opencv2/highgui/highgui_c.h b/modules/highgui/include/opencv2/highgui/highgui_c.h index e56b56bbf..36195e528 100644 --- a/modules/highgui/include/opencv2/highgui/highgui_c.h +++ b/modules/highgui/include/opencv2/highgui/highgui_c.h @@ -158,6 +158,7 @@ CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name /* retrieve or set trackbar position */ CVAPI(int) cvGetTrackbarPos( const char* trackbar_name, const char* window_name ); CVAPI(void) cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos ); +CVAPI(void) cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval); enum { diff --git a/modules/highgui/src/window.cpp b/modules/highgui/src/window.cpp index 1e47bf6ee..94d11d629 100644 --- a/modules/highgui/src/window.cpp +++ b/modules/highgui/src/window.cpp @@ -545,6 +545,11 @@ CV_IMPL void cvSetTrackbarPos( const char*, const char*, int ) CV_NO_GUI_ERROR( "cvSetTrackbarPos" ); } +CV_IMPL void cvSetTrackbarMax(const char*, const char*, int) +{ + CV_NO_GUI_ERROR( "cvSetTrackbarMax" ); +} + CV_IMPL void* cvGetWindowHandle( const char* ) { CV_NO_GUI_ERROR( "cvGetWindowHandle" ); diff --git a/modules/highgui/src/window_QT.cpp b/modules/highgui/src/window_QT.cpp index bdf696e33..69dc6052a 100644 --- a/modules/highgui/src/window_QT.cpp +++ b/modules/highgui/src/window_QT.cpp @@ -643,6 +643,19 @@ CV_IMPL void cvSetTrackbarPos(const char* name_bar, const char* window_name, int } +CV_IMPL void cvSetTrackbarMax(const char* name_bar, const char* window_name, int maxval) +{ + if (maxval >= 0) + { + QPointer t = icvFindTrackBarByName(name_bar, window_name); + if (t) + { + t->slider->setMaximum(maxval); + } + } +} + + /* assign callback for mouse events */ CV_IMPL void cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param) { diff --git a/modules/highgui/src/window_cocoa.mm b/modules/highgui/src/window_cocoa.mm index 74f6c0554..40240e096 100644 --- a/modules/highgui/src/window_cocoa.mm +++ b/modules/highgui/src/window_cocoa.mm @@ -61,6 +61,7 @@ CV_IMPL int cvCreateTrackbar2(const char* trackbar_name,const char* window_name, CV_IMPL void cvSetMouseCallback( const char* name, CvMouseCallback function, void* info) {} CV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name ) {return 0;} CV_IMPL void cvSetTrackbarPos(const char* trackbar_name, const char* window_name, int pos) {} +CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) {} CV_IMPL void* cvGetWindowHandle( const char* name ) {return NULL;} CV_IMPL const char* cvGetWindowName( void* window_handle ) {return NULL;} CV_IMPL int cvNamedWindow( const char* name, int flags ) {return 0; } @@ -424,6 +425,36 @@ CV_IMPL void cvSetTrackbarPos(const char* trackbar_name, const char* window_name __END__; } +CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) +{ + CV_FUNCNAME("cvSetTrackbarPos"); + + CVWindow *window = nil; + CVSlider *slider = nil; + NSAutoreleasePool* localpool5 = nil; + + __BEGIN__; + //cout << "cvSetTrackbarPos" << endl; + if(trackbar_name == NULL || window_name == NULL) + CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" ); + + if (localpool5 != nil) [localpool5 drain]; + localpool5 = [[NSAutoreleasePool alloc] init]; + + window = cvGetWindow(window_name); + if(window) { + slider = [[window sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; + if(slider) { + if(maxval >= 0) { + [[slider slider] setMaxValue:maxval]; + } + } + } + [localpool5 drain]; + + __END__; +} + CV_IMPL void* cvGetWindowHandle( const char* name ) { //cout << "cvGetWindowHandle" << endl; diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index 46ac61bfb..c91e27d46 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -1381,6 +1381,43 @@ CV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_nam } +CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) +{ + CV_FUNCNAME("cvSetTrackbarMax"); + + __BEGIN__; + + if (maxval >= 0) + { + CvWindow* window = 0; + CvTrackbar* trackbar = 0; + + if (trackbar_name == 0 || window_name == 0) + { + CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name"); + } + + window = icvFindWindowByName( window_name ); + if (window) + { + trackbar = icvFindTrackbarByName(window, trackbar_name); + if (trackbar) + { + trackbar->maxval = maxval; + + CV_LOCK_MUTEX(); + + gtk_range_set_range(GTK_RANGE(trackbar->widget), 0, trackbar->maxval); + + CV_UNLOCK_MUTEX(); + } + } + } + + __END__; +} + + CV_IMPL void* cvGetWindowHandle( const char* window_name ) { void* widget = 0; diff --git a/modules/highgui/src/window_w32.cpp b/modules/highgui/src/window_w32.cpp index fb5b6b5e4..97712d580 100644 --- a/modules/highgui/src/window_w32.cpp +++ b/modules/highgui/src/window_w32.cpp @@ -1827,7 +1827,7 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name, if( !window_name || !trackbar_name ) CV_ERROR( CV_StsNullPtr, "NULL window or trackbar name" ); - if( count <= 0 ) + if( count < 0 ) CV_ERROR( CV_StsOutOfRange, "Bad trackbar maximal value" ); window = icvFindWindowByName(window_name); @@ -1848,9 +1848,14 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name, { const int default_height = 30; - window->toolbar.toolbar = CreateToolbarEx( - window->frame, WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE, - 1, 0, 0, 0, 0, 0, 16, 20, 16, 16, sizeof(TBBUTTON)); + // CreateToolbarEx is deprecated and forces linking against Comctl32.lib. + window->toolbar.toolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, + WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON, + 0, 0, 0, 0, + window->frame, NULL, GetModuleHandle(NULL), NULL); + // CreateToolbarEx automatically sends this but CreateWindowEx doesn't. + SendMessage(window->toolbar.toolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + GetClientRect(window->frame, &rect); MoveWindow( window->toolbar.toolbar, 0, 0, rect.right - rect.left, default_height, TRUE); @@ -2098,6 +2103,39 @@ CV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_nam } +CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) +{ + CV_FUNCNAME( "cvSetTrackbarMax" ); + + __BEGIN__; + + if (maxval >= 0) + { + CvWindow* window = 0; + CvTrackbar* trackbar = 0; + if (trackbar_name == 0 || window_name == 0) + { + CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name"); + } + + window = icvFindWindowByName(window_name); + if (window) + { + trackbar = icvFindTrackbarByName(window, trackbar_name); + if (trackbar) + { + // The position will be min(pos, maxval). + trackbar->maxval = maxval; + SendMessage(trackbar->hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, (LPARAM)maxval); + } + } + } + + __END__; +} + + + CV_IMPL void* cvGetWindowHandle( const char* window_name ) { void* hwnd = 0;