static LRESULT CALLBACK HighGUIProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { CvWindow* window = icvWindowByHWND(hwnd); if( !window ) // This window is not mentioned in HighGUI storage // Actually, this should be error except for the case of calls to CreateWindow return DefWindowProc(hwnd, uMsg, wParam, lParam); // Process the message switch(uMsg) { case WM_WINDOWPOSCHANGING: { LPWINDOWPOS pos = (LPWINDOWPOS)lParam; RECT rect = icvCalcWindowRect(window); pos->x = rect.left; pos->y = rect.top; pos->cx = rect.right - rect.left + 1; pos->cy = rect.bottom - rect.top + 1; } break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: case WM_MOUSEMOVE: if( window->on_mouse ) { POINT pt; RECT rect; SIZE size = {0,0}; int flags = (wParam & MK_LBUTTON ? CV_EVENT_FLAG_LBUTTON : 0)| (wParam & MK_RBUTTON ? CV_EVENT_FLAG_RBUTTON : 0)| (wParam & MK_MBUTTON ? CV_EVENT_FLAG_MBUTTON : 0)| (wParam & MK_CONTROL ? CV_EVENT_FLAG_CTRLKEY : 0)| (wParam & MK_SHIFT ? CV_EVENT_FLAG_SHIFTKEY : 0)| (GetKeyState(VK_MENU) < 0 ? CV_EVENT_FLAG_ALTKEY : 0); int event = uMsg == WM_LBUTTONDOWN ? CV_EVENT_LBUTTONDOWN : uMsg == WM_RBUTTONDOWN ? CV_EVENT_RBUTTONDOWN : uMsg == WM_MBUTTONDOWN ? CV_EVENT_MBUTTONDOWN : uMsg == WM_LBUTTONUP ? CV_EVENT_LBUTTONUP : uMsg == WM_RBUTTONUP ? CV_EVENT_RBUTTONUP : uMsg == WM_MBUTTONUP ? CV_EVENT_MBUTTONUP : uMsg == WM_LBUTTONDBLCLK ? CV_EVENT_LBUTTONDBLCLK : uMsg == WM_RBUTTONDBLCLK ? CV_EVENT_RBUTTONDBLCLK : uMsg == WM_MBUTTONDBLCLK ? CV_EVENT_MBUTTONDBLCLK : CV_EVENT_MOUSEMOVE; if( uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN || uMsg == WM_MBUTTONDOWN ) SetCapture( hwnd ); if( uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONUP || uMsg == WM_MBUTTONUP ) ReleaseCapture(); pt.x = LOWORD( lParam ); pt.y = HIWORD( lParam ); GetClientRect( window->hwnd, &rect ); icvGetBitmapData( window, &size, 0, 0 ); window->on_mouse( event, pt.x*size.cx/MAX(rect.right - rect.left,1), pt.y*size.cy/MAX(rect.bottom - rect.top,1), flags, window->on_mouse_param ); } break; case WM_PAINT: if(window->image != 0) { int nchannels = 3; SIZE size = {0,0}; PAINTSTRUCT paint; HDC hdc; RGBQUAD table[256]; // Determine the bitmap's dimensions icvGetBitmapData( window, &size, &nchannels, 0 ); hdc = BeginPaint(hwnd, &paint); SetStretchBltMode(hdc, COLORONCOLOR); if( nchannels == 1 ) { int i; for(i = 0; i < 256; i++) { table[i].rgbBlue = (unsigned char)i; table[i].rgbGreen = (unsigned char)i; table[i].rgbRed = (unsigned char)i; } SetDIBColorTable(window->dc, 0, 255, table); } if(window->flags & CV_WINDOW_AUTOSIZE) { BitBlt( hdc, 0, 0, size.cx, size.cy, window->dc, 0, 0, SRCCOPY ); } else { RECT rect; GetClientRect(window->hwnd, &rect); StretchBlt( hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, window->dc, 0, 0, size.cx, size.cy, SRCCOPY ); } //DeleteDC(hdc); EndPaint(hwnd, &paint); } else { return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; case WM_ERASEBKGND: if(window->image) return 0; break; case WM_DESTROY: icvRemoveWindow(window); // Do nothing!!! //PostQuitMessage(0); break; case WM_SETCURSOR: SetCursor((HCURSOR)icvGetClassLongPtr(hwnd, CV_HCURSOR)); return 0; case WM_KEYDOWN: window->last_key = (int)wParam; return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
static pascal OSStatus windowEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *inUserData) { CvWindow* window = NULL; UInt32 eventKind, eventClass; OSErr err = noErr; int event = 0; UInt32 count = 0; HIPoint point = {0,0}; EventMouseButton eventMouseButton = 0;//FD UInt32 modifiers;//FD WindowRef theWindow = (WindowRef)inUserData; if (theWindow == NULL) return eventNotHandledErr; window = icvWindowByHandle(theWindow); if ( window == NULL) return eventNotHandledErr; eventKind = GetEventKind(theEvent); eventClass = GetEventClass(theEvent); switch (eventClass) { case kEventClassMouse : { switch (eventKind){ case kEventMouseUp : case kEventMouseDown : case kEventMouseMoved : { err = CallNextEventHandler(nextHandler, theEvent); if (err != eventNotHandledErr) return err; err = GetEventParameter(theEvent, kEventParamMouseButton, typeMouseButton, NULL, sizeof(eventMouseButton), NULL, &eventMouseButton); err = GetEventParameter(theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers); err = GetEventParameter(theEvent,kEventParamClickCount,typeUInt32,NULL,sizeof(UInt32),NULL,&count); if (err == noErr){ if (count >1) event += 6; } else { event = CV_EVENT_MOUSEMOVE; } if (eventKind == kEventMouseUp) event +=4; if (eventKind == kEventMouseDown) event +=1; err = GetEventParameter(theEvent, kEventParamWindowMouseLocation, typeHIPoint, NULL, sizeof(point), NULL, &point); if (eventKind != kEventMouseMoved){ switch(eventMouseButton){ case kEventMouseButtonPrimary: if (modifiers & controlKey) /* ctrl-click for right button */ event += 1; break; case kEventMouseButtonSecondary: event += 1; break; case kEventMouseButtonTertiary: event += 2; break; } } int c = icvCountTrackbarInWindow(window); if (window->on_mouse != NULL){ int lx,ly; Rect structure, content; GetWindowBounds(theWindow, kWindowStructureRgn, &structure); GetWindowBounds(theWindow, kWindowContentRgn, &content); lx = point.x - content.left + structure.left; ly = point.y - window->trackbarheight - content.top + structure.top; /* minus la taille des trackbars */ if (window->flags & CV_WINDOW_AUTOSIZE) {//FD //printf("was %d,%d\n", lx, ly); /* scale the mouse coordinates */ lx = lx * window->imageWidth / (content.right - content.left); ly = ly * window->imageHeight / (content.bottom - content.top - window->trackbarheight); //printf("now %d,%d\n", lx, ly); } //fprintf(stdout,"final OpenCV event is %d\n",event); //fprintf(stdout,"event @ %d %d which is localy %d %d offset of %d\n",point.h, point.v ,lx,ly,yOffset); if (lx>0 && ly >0){ /* a remettre dans les coordonnŽes locale */ window->on_mouse(event,lx,ly,0,NULL); } } } default : return eventNotHandledErr; } } case kEventClassWindow : {//FD switch (eventKind){ case kEventWindowBoundsChanged : { /* resize the trackbars */ CvTrackbar *t; Rect bounds; GetWindowBounds(window->window,kWindowContentRgn,&bounds); for ( t = window->toolbar.first; t != 0; t = t->next ) SizeControl(t->trackbar,bounds.right - bounds.left - INTERWIDGETSPACE*3 - LABELWIDTH , WIDGETHEIGHT); } /* redraw the image */ icvDrawImage(window); break; default : return eventNotHandledErr; } } default: return eventNotHandledErr; } return eventNotHandledErr; }
static gboolean icvOnMouse( GtkWidget *widget, GdkEvent *event, gpointer user_data ) { // TODO move this logic to CvImageWidget CvWindow* window = (CvWindow*)user_data; CvPoint2D32f pt32f = {-1., -1.}; CvPoint pt = {-1,-1}; int cv_event = -1, state = 0; CvImageWidget * image_widget = CV_IMAGE_WIDGET( widget ); if( window->signature != CV_WINDOW_MAGIC_VAL || window->widget != widget || !window->widget || !window->on_mouse || !image_widget->original_image) return FALSE; if( event->type == GDK_MOTION_NOTIFY ) { GdkEventMotion* event_motion = (GdkEventMotion*)event; cv_event = CV_EVENT_MOUSEMOVE; pt32f.x = cvRound(event_motion->x); pt32f.y = cvRound(event_motion->y); state = event_motion->state; } else if( event->type == GDK_BUTTON_PRESS || event->type == GDK_BUTTON_RELEASE || event->type == GDK_2BUTTON_PRESS ) { GdkEventButton* event_button = (GdkEventButton*)event; pt32f.x = cvRound(event_button->x); pt32f.y = cvRound(event_button->y); if( event_button->type == GDK_BUTTON_PRESS ) { cv_event = event_button->button == 1 ? CV_EVENT_LBUTTONDOWN : event_button->button == 2 ? CV_EVENT_MBUTTONDOWN : event_button->button == 3 ? CV_EVENT_RBUTTONDOWN : 0; } else if( event_button->type == GDK_BUTTON_RELEASE ) { cv_event = event_button->button == 1 ? CV_EVENT_LBUTTONUP : event_button->button == 2 ? CV_EVENT_MBUTTONUP : event_button->button == 3 ? CV_EVENT_RBUTTONUP : 0; } else if( event_button->type == GDK_2BUTTON_PRESS ) { cv_event = event_button->button == 1 ? CV_EVENT_LBUTTONDBLCLK : event_button->button == 2 ? CV_EVENT_MBUTTONDBLCLK : event_button->button == 3 ? CV_EVENT_RBUTTONDBLCLK : 0; } state = event_button->state; } if( cv_event >= 0 ){ // scale point if image is scaled if( (image_widget->flags & CV_WINDOW_AUTOSIZE)==0 && image_widget->original_image && image_widget->scaled_image ){ // image origin is not necessarily at (0,0) int x0 = (widget->allocation.width - image_widget->scaled_image->cols)/2; int y0 = (widget->allocation.height - image_widget->scaled_image->rows)/2; pt.x = cvRound( ((pt32f.x-x0)*image_widget->original_image->cols)/ image_widget->scaled_image->cols ); pt.y = cvRound( ((pt32f.y-y0)*image_widget->original_image->rows)/ image_widget->scaled_image->rows ); } else{ pt = cvPointFrom32f( pt32f ); } if((unsigned)pt.x < (unsigned)(image_widget->original_image->width) && (unsigned)pt.y < (unsigned)(image_widget->original_image->height) ) { int flags = (state & GDK_SHIFT_MASK ? CV_EVENT_FLAG_SHIFTKEY : 0) | (state & GDK_CONTROL_MASK ? CV_EVENT_FLAG_CTRLKEY : 0) | (state & (GDK_MOD1_MASK|GDK_MOD2_MASK) ? CV_EVENT_FLAG_ALTKEY : 0) | (state & GDK_BUTTON1_MASK ? CV_EVENT_FLAG_LBUTTON : 0) | (state & GDK_BUTTON2_MASK ? CV_EVENT_FLAG_MBUTTON : 0) | (state & GDK_BUTTON3_MASK ? CV_EVENT_FLAG_RBUTTON : 0); window->on_mouse( cv_event, pt.x, pt.y, flags, window->on_mouse_param ); } } return FALSE; }
static pascal OSStatus windowEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *inUserData) { CvWindow* window = NULL; UInt32 eventKind, eventClass; OSErr err = noErr; int event = 0; UInt32 count = 0; HIPoint point = {0,0}; EventMouseButton eventMouseButton = 0;//FD UInt32 modifiers;//FD WindowRef theWindow = (WindowRef)inUserData; if (theWindow == NULL) return eventNotHandledErr; window = icvWindowByHandle(theWindow); if ( window == NULL) return eventNotHandledErr; eventKind = GetEventKind(theEvent); eventClass = GetEventClass(theEvent); switch (eventClass) { case kEventClassMouse : { switch (eventKind){ case kEventMouseUp : case kEventMouseDown : case kEventMouseMoved : case kEventMouseDragged : { err = CallNextEventHandler(nextHandler, theEvent); if (err != eventNotHandledErr) return err; err = GetEventParameter(theEvent, kEventParamMouseButton, typeMouseButton, NULL, sizeof(eventMouseButton), NULL, &eventMouseButton); err = GetEventParameter(theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers); err = GetEventParameter(theEvent,kEventParamClickCount,typeUInt32,NULL,sizeof(UInt32),NULL,&count); if (err == noErr){ if (count >1) event += 6; } else { event = CV_EVENT_MOUSEMOVE; } if (eventKind == kEventMouseUp) event +=4; if (eventKind == kEventMouseDown) event +=1; unsigned int flags = 0; err = GetEventParameter(theEvent, kEventParamWindowMouseLocation, typeHIPoint, NULL, sizeof(point), NULL, &point); if (eventKind != kEventMouseMoved){ switch(eventMouseButton){ case kEventMouseButtonPrimary: if (modifiers & controlKey){ flags += CV_EVENT_FLAG_RBUTTON; event += 1; } else { flags += CV_EVENT_FLAG_LBUTTON; } break; case kEventMouseButtonSecondary: flags += CV_EVENT_FLAG_RBUTTON; event += 1; break; case kEventMouseButtonTertiary: flags += CV_EVENT_FLAG_MBUTTON; event += 2; break; } } if (modifiers&controlKey) flags += CV_EVENT_FLAG_CTRLKEY; if (modifiers&shiftKey) flags += CV_EVENT_FLAG_SHIFTKEY; if (modifiers& cmdKey ) flags += CV_EVENT_FLAG_ALTKEY; if (window->on_mouse != NULL){ int lx,ly; Rect structure, content; GetWindowBounds(theWindow, kWindowStructureRgn, &structure); GetWindowBounds(theWindow, kWindowContentRgn, &content); lx = (int)point.x - content.left + structure.left; ly = (int)point.y - window->trackbarheight - content.top + structure.top; if (window->flags & CV_WINDOW_AUTOSIZE) {//FD //printf("was %d,%d\n", lx, ly); /* scale the mouse coordinates */ lx = lx * window->imageWidth / (content.right - content.left); ly = ly * window->imageHeight / (content.bottom - content.top - window->trackbarheight); } if (lx>0 && ly >0){ window->on_mouse (event, lx, ly, flags, window->on_mouse_param); return noErr; } } } default : return eventNotHandledErr; } } case kEventClassWindow : {//FD switch (eventKind){ case kEventWindowBoundsChanged : { /* resize the trackbars */ CvTrackbar *t; Rect bounds; GetWindowBounds(window->window,kWindowContentRgn,&bounds); for ( t = window->toolbar.first; t != 0; t = t->next ) SizeControl(t->trackbar,bounds.right - bounds.left - INTERWIDGETSPACE*3 - LABELWIDTH , WIDGETHEIGHT); } /* redraw the image */ icvDrawImage(window); break; default : return eventNotHandledErr; } } default: return eventNotHandledErr; } return eventNotHandledErr; }