icvUpdateWindowPos(window);
InvalidateRect(window->hwnd, 0, 0);
// philipg: this is not needed and just slows things down
-// UpdateWindow(window->hwnd);
+ // UpdateWindow(window->hwnd);
__END__;
}
switch(uMsg)
{
case WM_COPY:
- ::WindowProc(hwnd, uMsg, wParam, lParam); // call highgui proc. There may be a better way to do this.
+ ::SendMessage(window->hwnd, uMsg, wParam, lParam);
break;
case WM_DESTROY:
}
}
+static void showSaveDialog(CvWindow* window)
+{
+#ifndef HAVE_OPENGL
+ if (!window || !window->image)
+ return;
+
+ SIZE sz;
+ int channels;
+ void* data;
+ if (icvGetBitmapData(window, &sz, &channels, &data))
+ return; // nothing to save
+
+ char szFileName[MAX_PATH] = "";
+ // try to use window title as file name
+ GetWindowText(window->frame, szFileName, MAX_PATH);
+
+ OPENFILENAME ofn;
+ ZeroMemory(&ofn, sizeof(ofn));
+#ifdef OPENFILENAME_SIZE_VERSION_400
+ // we are not going to use new fields any way
+ ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+#else
+ ofn.lStructSize = sizeof(ofn);
+#endif
+ ofn.hwndOwner = window->hwnd;
+ ofn.lpstrFilter = "Portable Network Graphics files (*.png)\0*.png\0"
+ "JPEG files (*.jpeg;*.jpg;*.jpe)\0*.jpeg;*.jpg;*.jpe\0"
+ "Windows bitmap (*.bmp;*.dib)\0*.bmp;*.dib\0"
+ "TIFF Files (*.tiff;*.tif)\0*.tiff;*.tif\0"
+ "JPEG-2000 files (*.jp2)\0*.jp2\0"
+ "WebP files (*.webp)\0*.webp\0"
+ "Portable image format (*.pbm;*.pgm;*.ppm;*.pxm;*.pnm)\0*.pbm;*.pgm;*.ppm;*.pxm;*.pnm\0"
+ "OpenEXR Image files (*.exr)\0*.exr\0"
+ "Radiance HDR (*.hdr;*.pic)\0*.hdr;*.pic\0"
+ "Sun raster files (*.sr;*.ras)\0*.sr;*.ras\0"
+ "All Files (*.*)\0*.*\0";
+ ofn.lpstrFile = szFileName;
+ ofn.nMaxFile = MAX_PATH;
+ ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOREADONLYRETURN | OFN_NOCHANGEDIR;
+ ofn.lpstrDefExt = "png";
+
+ if (GetSaveFileName(&ofn))
+ {
+ cv::Mat tmp; cv::flip(cv::Mat(sz.cy, sz.cx, CV_8UC(channels), data), tmp, 0);
+ cv::imwrite(szFileName, tmp);
+ }
+#else
+ (void)window;
+#endif // HAVE_OPENGL
+}
CV_IMPL int
cvWaitKey( int delay )
case WM_KEYDOWN:
TranslateMessage(&message);
- if( (message.wParam >= VK_F1 && message.wParam <= VK_F24) ||
- message.wParam == VK_HOME || message.wParam == VK_END ||
- message.wParam == VK_UP || message.wParam == VK_DOWN ||
- message.wParam == VK_LEFT || message.wParam == VK_RIGHT ||
- message.wParam == VK_INSERT || message.wParam == VK_DELETE ||
- message.wParam == VK_PRIOR || message.wParam == VK_NEXT )
+ if( (message.wParam >= VK_F1 && message.wParam <= VK_F24) ||
+ message.wParam == VK_HOME || message.wParam == VK_END ||
+ message.wParam == VK_UP || message.wParam == VK_DOWN ||
+ message.wParam == VK_LEFT || message.wParam == VK_RIGHT ||
+ message.wParam == VK_INSERT || message.wParam == VK_DELETE ||
+ message.wParam == VK_PRIOR || message.wParam == VK_NEXT )
{
DispatchMessage(&message);
is_processed = 1;
// Intercept Ctrl+C for copy to clipboard
if ('C' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
- ::PostMessage(message.hwnd, WM_COPY, 0, 0);
+ ::SendMessage(message.hwnd, WM_COPY, 0, 0);
+
+ // Intercept Ctrl+S for "save as" dialog
+ if ('S' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
+ showSaveDialog(window);
default:
DispatchMessage(&message);