1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*M/////////////////////////////////////////////////////////////////////////////////////// 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// By downloading, copying, installing or using the software you agree to this license. 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// If you do not agree to this license, do not download, install, 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// copy or use the software. 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Intel License Agreement 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// For Open Source Computer Vision Library 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2000, Intel Corporation, all rights reserved. 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Third party copyrights are property of their respective owners. 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Redistribution and use in source and binary forms, with or without modification, 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// are permitted provided that the following conditions are met: 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * Redistribution's of source code must retain the above copyright notice, 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// this list of conditions and the following disclaimer. 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * Redistribution's in binary form must reproduce the above copyright notice, 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// this list of conditions and the following disclaimer in the documentation 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and/or other materials provided with the distribution. 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * The name of Intel Corporation may not be used to endorse or promote products 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// derived from this software without specific prior written permission. 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// This software is provided by the copyright holders and contributors "as is" and 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// any express or implied warranties, including, but not limited to, the implied 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// warranties of merchantability and fitness for a particular purpose are disclaimed. 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// In no event shall the Intel Corporation or contributors be liable for any direct, 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// indirect, incidental, special, exemplary, or consequential damages 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// (including, but not limited to, procurement of substitute goods or services; 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// loss of use, data, or profits; or business interruption) however caused 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and on any theory of liability, whether in contract, strict liability, 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// or tort (including negligence or otherwise) arising in any way out of 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// the use of this software, even if advised of the possibility of such damage. 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//M*/ 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "precomp.hpp" 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <windowsx.h> // required for GET_X_LPARAM() and GET_Y_LPARAM() macros 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined WIN32 || defined _WIN32 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef __GNUC__ 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# pragma GCC diagnostic ignored "-Wmissing-declarations" 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if (_WIN32_IE < 0x0500) 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#pragma message("WARNING: Win32 UI needs to be compiled with _WIN32_IE >= 0x0500 (_WIN32_IE_IE50)") 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define _WIN32_IE 0x0500 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <commctrl.h> 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <stdlib.h> 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <string.h> 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <stdio.h> 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <assert.h> 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <memory> 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <algorithm> 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <vector> 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <functional> 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/highgui.hpp" 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <GL\gl.h> 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* trackbar_text = 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler" "; 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined _M_X64 || defined __x86_64 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetWindowLongPtr GetWindowLongPtr 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvSetWindowLongPtr( hwnd, id, ptr ) SetWindowLongPtr( hwnd, id, (LONG_PTR)(ptr) ) 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetClassLongPtr GetClassLongPtr 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_USERDATA GWLP_USERDATA 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_WNDPROC GWLP_WNDPROC 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HCURSOR GCLP_HCURSOR 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HBRBACKGROUND GCLP_HBRBACKGROUND 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetWindowLongPtr GetWindowLong 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvSetWindowLongPtr( hwnd, id, ptr ) SetWindowLong( hwnd, id, (size_t)ptr ) 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetClassLongPtr GetClassLong 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_USERDATA GWL_USERDATA 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_WNDPROC GWL_WNDPROC 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HCURSOR GCL_HCURSOR 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HBRBACKGROUND GCL_HBRBACKGROUND 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef WM_MOUSEHWHEEL 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler #define WM_MOUSEHWHEEL 0x020E 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin ) 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32)); 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BITMAPINFOHEADER* bmih = &(bmi->bmiHeader); 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memset( bmih, 0, sizeof(*bmih)); 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bmih->biSize = sizeof(BITMAPINFOHEADER); 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bmih->biWidth = width; 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bmih->biHeight = origin ? abs(height) : -abs(height); 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bmih->biPlanes = 1; 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bmih->biBitCount = (unsigned short)bpp; 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bmih->biCompression = BI_RGB; 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( bpp == 8 ) 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RGBQUAD* palette = bmi->bmiColors; 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for( i = 0; i < 256; i++ ) 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i; 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler palette[i].rgbReserved = 0; 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstruct CvWindow; 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct CvTrackbar 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int signature; 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND hwnd; 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char* name; 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* next; 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* parent; 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND buddy; 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int* data; 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int pos; 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int maxval; 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void (*notify)(int); 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void (*notify2)(int, void*); 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* userdata; 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int id; 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCvTrackbar; 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct CvWindow 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int signature; 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND hwnd; 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char* name; 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* prev; 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* next; 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND frame; 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HDC dc; 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HGDIOBJ image; 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int last_key; 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int flags; 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int status;//0 normal, 1 fullscreen (YV) 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvMouseCallback on_mouse; 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* on_mouse_param; 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler struct 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND toolbar; 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int pos; 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int rows; 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WNDPROC toolBarProc; 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* first; 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler toolbar; 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int width; 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int height; 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // OpenGL support 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool useGl; 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HGLRC hGLRC; 185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvOpenGlDrawCallback glDrawCallback; 187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* glDrawData; 188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 190793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCvWindow; 191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define HG_BUDDY_WIDTH 130 193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBIF_SIZE 195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler #define TBIF_SIZE 0x40 196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TB_SETBUTTONINFO 199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler #define TB_SETBUTTONINFO (WM_USER + 66) 200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBM_GETTOOLTIPS 203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler #define TBM_GETTOOLTIPS (WM_USER + 30) 204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK HighGUIProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK MainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvUpdateWindowPos( CvWindow* window ); 210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWindow* hg_windows = 0; 212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef int (CV_CDECL * CvWin32WindowCallback)(HWND, UINT, WPARAM, LPARAM, int*); 214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWin32WindowCallback hg_on_preprocess = 0, hg_on_postprocess = 0; 215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic HINSTANCE hg_hinstance = 0; 216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* highGUIclassName = "HighGUI class"; 218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* mainHighGUIclassName = "Main HighGUI class"; 219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvCleanupHighgui() 221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvDestroyAllWindows(); 223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UnregisterClass(highGUIclassName, hg_hinstance); 224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UnregisterClass(mainHighGUIclassName, hg_hinstance); 225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 227793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvInitSystem( int, char** ) 228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler static int wasInitialized = 0; 230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // check initialization status 232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !wasInitialized ) 233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Initialize the stogare 235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hg_windows = 0; 236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Register the class 238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WNDCLASS wndc; 239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; 240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.lpfnWndProc = WindowProc; 241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.cbClsExtra = 0; 242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.cbWndExtra = 0; 243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.hInstance = hg_hinstance; 244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.lpszClassName = highGUIclassName; 245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.lpszMenuName = highGUIclassName; 246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.hIcon = LoadIcon(0, IDI_APPLICATION); 247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.hCursor = (HCURSOR)LoadCursor(0, (LPSTR)(size_t)IDC_CROSS ); 248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegisterClass(&wndc); 251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.lpszClassName = mainHighGUIclassName; 253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.lpszMenuName = mainHighGUIclassName; 254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wndc.lpfnWndProc = MainWindowProc; 256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegisterClass(&wndc); 258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler atexit( icvCleanupHighgui ); 259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wasInitialized = 1; 261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler setlocale(LC_NUMERIC,"C"); 264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 0; 266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 268793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvStartWindowThread(){ 269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 0; 270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWindow* icvFindWindowByName( const char* name ) 273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = hg_windows; 275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for( ; window != 0 && strcmp( name, window->name) != 0; window = window->next ) 277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ; 278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return window; 280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWindow* icvWindowByHWND( HWND hwnd ) 284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = (CvWindow*)icvGetWindowLongPtr( hwnd, CV_USERDATA ); 286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return window != 0 && hg_windows != 0 && 287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->signature == CV_WINDOW_MAGIC_VAL ? window : 0; 288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvTrackbar* icvTrackbarByHWND( HWND hwnd ) 292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = (CvTrackbar*)icvGetWindowLongPtr( hwnd, CV_USERDATA ); 294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return trackbar != 0 && trackbar->signature == CV_TRACKBAR_MAGIC_VAL && 295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->hwnd == hwnd ? trackbar : 0; 296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* icvWindowPosRootKey = "Software\\OpenCV\\HighGUI\\Windows\\"; 300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Window positions saving/loading added by Philip Gruebele. 302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//<a href="mailto:pgruebele@cox.net">pgruebele@cox.net</a> 303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Restores the window position from the registry saved position. 304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void 305793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvLoadWindowPos( const char* name, CvRect& rect ) 306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HKEY hkey; 308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char szKey[1024]; 309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler strcpy( szKey, icvWindowPosRootKey ); 310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler strcat( szKey, name ); 311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.x = rect.y = CW_USEDEFAULT; 313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.width = rect.height = 320; 314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( RegOpenKeyEx(HKEY_CURRENT_USER,szKey,0,KEY_QUERY_VALUE,&hkey) == ERROR_SUCCESS ) 316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Yes we are installed. 318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DWORD dwType = 0; 319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DWORD dwSize = sizeof(int); 320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegQueryValueEx(hkey, "Left", NULL, &dwType, (BYTE*)&rect.x, &dwSize); 322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegQueryValueEx(hkey, "Top", NULL, &dwType, (BYTE*)&rect.y, &dwSize); 323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegQueryValueEx(hkey, "Width", NULL, &dwType, (BYTE*)&rect.width, &dwSize); 324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegQueryValueEx(hkey, "Height", NULL, &dwType, (BYTE*)&rect.height, &dwSize); 325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( rect.x != (int)CW_USEDEFAULT && (rect.x < -200 || rect.x > 3000) ) 327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.x = 100; 328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( rect.y != (int)CW_USEDEFAULT && (rect.y < -200 || rect.y > 3000) ) 329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.y = 100; 330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( rect.width != (int)CW_USEDEFAULT && (rect.width < 0 || rect.width > 3000) ) 332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.width = 100; 333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( rect.height != (int)CW_USEDEFAULT && (rect.height < 0 || rect.height > 3000) ) 334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.height = 100; 335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegCloseKey(hkey); 337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Window positions saving/loading added by Philip Gruebele. 342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//<a href="mailto:pgruebele@cox.net">pgruebele@cox.net</a> 343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// philipg. Saves the window position in the registry 344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void 345793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvSaveWindowPos( const char* name, CvRect rect ) 346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler static const DWORD MAX_RECORD_COUNT = 100; 348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HKEY hkey; 349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char szKey[1024]; 350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char rootKey[1024]; 351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler strcpy( szKey, icvWindowPosRootKey ); 352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler strcat( szKey, name ); 353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( RegOpenKeyEx( HKEY_CURRENT_USER,szKey,0,KEY_READ,&hkey) != ERROR_SUCCESS ) 355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HKEY hroot; 357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DWORD count = 0; 358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler FILETIME oldestTime = { UINT_MAX, UINT_MAX }; 359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char oldestKey[1024]; 360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char currentKey[1024]; 361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler strcpy( rootKey, icvWindowPosRootKey ); 363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rootKey[strlen(rootKey)-1] = '\0'; 364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( RegCreateKeyEx(HKEY_CURRENT_USER, rootKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ+KEY_WRITE, 0, &hroot, NULL) != ERROR_SUCCESS ) 365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //RegOpenKeyEx( HKEY_CURRENT_USER,rootKey,0,KEY_READ,&hroot) != ERROR_SUCCESS ) 366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for(;;) 369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DWORD csize = sizeof(currentKey); 371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler FILETIME accesstime = { 0, 0 }; 372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LONG code = RegEnumKeyEx( hroot, count, currentKey, &csize, NULL, NULL, NULL, &accesstime ); 373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( code != ERROR_SUCCESS && code != ERROR_MORE_DATA ) 374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler count++; 376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( oldestTime.dwHighDateTime > accesstime.dwHighDateTime || 377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (oldestTime.dwHighDateTime == accesstime.dwHighDateTime && 378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler oldestTime.dwLowDateTime > accesstime.dwLowDateTime) ) 379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler oldestTime = accesstime; 381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler strcpy( oldestKey, currentKey ); 382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( count >= MAX_RECORD_COUNT ) 386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegDeleteKey( hroot, oldestKey ); 387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegCloseKey( hroot ); 388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( RegCreateKeyEx(HKEY_CURRENT_USER,szKey,0,NULL,REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hkey, NULL) != ERROR_SUCCESS ) 390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegCloseKey( hkey ); 395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( RegOpenKeyEx( HKEY_CURRENT_USER,szKey,0,KEY_WRITE,&hkey) != ERROR_SUCCESS ) 396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegSetValueEx(hkey, "Left", 0, REG_DWORD, (BYTE*)&rect.x, sizeof(rect.x)); 400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegSetValueEx(hkey, "Top", 0, REG_DWORD, (BYTE*)&rect.y, sizeof(rect.y)); 401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegSetValueEx(hkey, "Width", 0, REG_DWORD, (BYTE*)&rect.width, sizeof(rect.width)); 402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegSetValueEx(hkey, "Height", 0, REG_DWORD, (BYTE*)&rect.height, sizeof(rect.height)); 403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RegCloseKey(hkey); 404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetModeWindow_W32(const char* name)//YV 407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double result = -1; 409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvGetModeWindow_W32" ); 411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!name) 417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; // keep silence here 422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = window->status; 424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result; 427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid cvSetModeWindow_W32( const char* name, double prop_value)//Yannick Verdie 430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvSetModeWindow_W32" ); 432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!name) 438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window ) 442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL window" ); 443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->flags & CV_WINDOW_AUTOSIZE)//if the flag CV_WINDOW_AUTOSIZE is set 445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DWORD dwStyle = (DWORD)GetWindowLongPtr(window->frame, GWL_STYLE); 449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvRect position; 450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->status==CV_WINDOW_FULLSCREEN && prop_value==CV_WINDOW_NORMAL) 452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvLoadWindowPos(window->name,position ); 454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetWindowLongPtr(window->frame, GWL_STYLE, dwStyle | WS_CAPTION | WS_THICKFRAME); 455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetWindowPos(window->frame, HWND_TOP, position.x, position.y , position.width,position.height, SWP_NOZORDER | SWP_FRAMECHANGED); 457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->status=CV_WINDOW_NORMAL; 458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->status==CV_WINDOW_NORMAL && prop_value==CV_WINDOW_FULLSCREEN) 463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //save dimension 465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->frame, &rect); 467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvRect RectCV = cvRect(rect.left, rect.top,rect.right - rect.left, rect.bottom - rect.top); 468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSaveWindowPos(window->name,RectCV ); 469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //Look at coordinate for fullscreen 471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HMONITOR hMonitor; 472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MONITORINFO mi; 473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST); 474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mi.cbSize = sizeof(mi); 476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetMonitorInfo(hMonitor, &mi); 477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //fullscreen 479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler position.x=mi.rcMonitor.left;position.y=mi.rcMonitor.top; 480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler position.width=mi.rcMonitor.right - mi.rcMonitor.left;position.height=mi.rcMonitor.bottom - mi.rcMonitor.top; 481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetWindowLongPtr(window->frame, GWL_STYLE, dwStyle & ~WS_CAPTION & ~WS_THICKFRAME); 482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetWindowPos(window->frame, HWND_TOP, position.x, position.y , position.width,position.height, SWP_NOZORDER | SWP_FRAMECHANGED); 484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->status=CV_WINDOW_FULLSCREEN; 485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid cv::setWindowTitle(const String& winname, const String& title) 494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = icvFindWindowByName(winname.c_str()); 496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler namedWindow(winname); 500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(winname.c_str()); 501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_Error(Error::StsNullPtr, "NULL window"); 505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!SetWindowText(window->frame, title.c_str())) 507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_Error_(Error::StsError, ("Failed to set \"%s\" window title to \"%s\"", winname.c_str(), title.c_str())); 508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetPropWindowAutoSize_W32(const char* name) 511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double result = -1; 513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvSetCloseCallback" ); 515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!name) 521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; // keep silence here 526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = window->flags & CV_WINDOW_AUTOSIZE; 528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result; 532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetRatioWindow_W32(const char* name) 535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double result = -1; 537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvGetRatioWindow_W32" ); 539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!name) 545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; // keep silence here 550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = static_cast<double>(window->width) / window->height; 552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result; 556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetOpenGlProp_W32(const char* name) 559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double result = -1; 561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvGetOpenGlProp_W32" ); 564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!name) 570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; // keep silence here 575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = window->useGl; 577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (void)name; 581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result; 583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// OpenGL support 587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace 591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void createGlContext(HWND hWnd, HDC& hGLDC, HGLRC& hGLRC, bool& useGl) 593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "createGlContext" ); 595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler useGl = false; 599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int PixelFormat; 601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler static PIXELFORMATDESCRIPTOR pfd = 603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor 605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1, // Version Number 606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PFD_DRAW_TO_WINDOW | // Format Must Support Window 607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PFD_SUPPORT_OPENGL | // Format Must Support OpenGL 608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PFD_DOUBLEBUFFER, // Must Support Double Buffering 609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PFD_TYPE_RGBA, // Request An RGBA Format 610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 32, // Select Our Color Depth 611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, 0, 0, 0, 0, 0, // Color Bits Ignored 612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, // No Alpha Buffer 613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, // Shift Bit Ignored 614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, // No Accumulation Buffer 615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, 0, 0, 0, // Accumulation Bits Ignored 616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 32, // 32 Bit Z-Buffer (Depth Buffer) 617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, // No Stencil Buffer 618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, // No Auxiliary Buffer 619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PFD_MAIN_PLANE, // Main Drawing Layer 620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, // Reserved 621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, 0, 0 // Layer Masks Ignored 622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }; 623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hGLDC = GetDC(hWnd); 625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!hGLDC) 626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Create A GL Device Context" ); 627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PixelFormat = ChoosePixelFormat(hGLDC, &pfd); 629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!PixelFormat) 630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Find A Suitable PixelFormat" ); 631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!SetPixelFormat(hGLDC, PixelFormat, &pfd)) 633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Set The PixelFormat" ); 634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hGLRC = wglCreateContext(hGLDC); 636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!hGLRC) 637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Create A GL Rendering Context" ); 638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!wglMakeCurrent(hGLDC, hGLRC)) 640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" ); 641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler useGl = true; 643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void releaseGlContext(CvWindow* window) 648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //CV_FUNCNAME( "releaseGlContext" ); 650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->hGLRC) 654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wglDeleteContext(window->hGLRC); 656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->hGLRC = NULL; 657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->dc) 660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ReleaseDC(window->hwnd, window->dc); 662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->dc = NULL; 663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->useGl = false; 666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void drawGl(CvWindow* window) 671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "drawGl" ); 673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!wglMakeCurrent(window->dc, window->hGLRC)) 677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" ); 678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->glDrawCallback) 682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->glDrawCallback(window->glDrawData); 683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!SwapBuffers(window->dc)) 685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't swap OpenGL buffers" ); 686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void resizeGl(CvWindow* window) 691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "resizeGl" ); 693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!wglMakeCurrent(window->dc, window->hGLRC)) 697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" ); 698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler glViewport(0, 0, window->width, window->height); 700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // HAVE_OPENGL 706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 708793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvNamedWindow( const char* name, int flags ) 709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int result = 0; 711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvNamedWindow" ); 712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND hWnd, mainhWnd; 716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DWORD defStyle = WS_VISIBLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU; 718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int len; 719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvRect rect; 720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool useGl; 722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HDC hGLDC; 723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HGLRC hGLRC; 724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvInitSystem(0,0); 727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !name ) 729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Check the name in the storage 732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window != 0) 734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = 1; 736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !(flags & CV_WINDOW_AUTOSIZE))//YV add border in order to resize the window 740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler defStyle |= WS_SIZEBOX; 741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (flags & CV_WINDOW_OPENGL) 744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler defStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS; 745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvLoadWindowPos( name, rect ); 748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mainhWnd = CreateWindow( "Main HighGUI class", name, defStyle | WS_OVERLAPPED, 750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.x, rect.y, rect.width, rect.height, 0, 0, hg_hinstance, 0 ); 751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !mainhWnd ) 752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsError, "Frame window can not be created" ); 753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowWindow(mainhWnd, SW_SHOW); 755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //YV- remove one border by changing the style 757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hWnd = CreateWindow("HighGUI class", "", (defStyle & ~WS_SIZEBOX) | WS_CHILD, CW_USEDEFAULT, 0, rect.width, rect.height, mainhWnd, 0, hg_hinstance, 0); 758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !hWnd ) 759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsError, "Frame window can not be created" ); 760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef HAVE_OPENGL 762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (flags & CV_WINDOW_OPENGL) 763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlNotSupported, "Library was built without OpenGL support" ); 764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler useGl = false; 766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hGLDC = 0; 767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hGLRC = 0; 768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (flags & CV_WINDOW_OPENGL) 770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler createGlContext(hWnd, hGLDC, hGLRC, useGl); 771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowWindow(hWnd, SW_SHOW); 774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler len = (int)strlen(name); 776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_CALL( window = (CvWindow*)cvAlloc(sizeof(CvWindow) + len + 1)); 777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->signature = CV_WINDOW_MAGIC_VAL; 779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->hwnd = hWnd; 780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->frame = mainhWnd; 781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->name = (char*)(window + 1); 782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memcpy( window->name, name, len + 1 ); 783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->flags = flags; 784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->image = 0; 785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef HAVE_OPENGL 787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->dc = CreateCompatibleDC(0); 788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!useGl) 790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->dc = CreateCompatibleDC(0); 792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->hGLRC = 0; 793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->useGl = false; 794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->dc = hGLDC; 798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->hGLRC = hGLRC; 799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->useGl = true; 800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->glDrawCallback = 0; 803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->glDrawData = 0; 804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->last_key = 0; 807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->status = CV_WINDOW_NORMAL;//YV 808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse = 0; 810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse_param = 0; 811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memset( &window->toolbar, 0, sizeof(window->toolbar)); 813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->next = hg_windows; 815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->prev = 0; 816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( hg_windows ) 817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hg_windows->prev = window; 818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hg_windows = window; 819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr( hWnd, CV_USERDATA, window ); 820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr( mainhWnd, CV_USERDATA, window ); 821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Recalculate window pos 823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateWindowPos( window ); 824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = 1; 826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result; 829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 833793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetOpenGlContext(const char* name) 834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvSetOpenGlContext" ); 836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!name) 842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL window" ); 847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window->useGl) 849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlNotSupported, "Window doesn't support OpenGL" ); 850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!wglMakeCurrent(window->dc, window->hGLRC)) 852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" ); 853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 857793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvUpdateWindow(const char* name) 858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvUpdateWindow" ); 860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!name) 866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window) 870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler InvalidateRect(window->hwnd, 0, 0); 873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 877793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetOpenGlDrawCallback(const char* name, CvOpenGlDrawCallback callback, void* userdata) 878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvCreateOpenGLCallback" ); 880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!name) 886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window ) 890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window->useGl) 893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_OpenGlNotSupported, "Window was created without OpenGL context" ); 894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->glDrawCallback = callback; 896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->glDrawData = userdata; 897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // HAVE_OPENGL 902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvRemoveWindow( CvWindow* window ) 904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = NULL; 906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT wrect={0,0,0,0}; 907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->useGl) 910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler releaseGlContext(window); 911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->frame ) 914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect( window->frame, &wrect ); 915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->name ) 916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSaveWindowPos( window->name, cvRect(wrect.left, wrect.top, 917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler wrect.right-wrect.left, wrect.bottom-wrect.top) ); 918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->hwnd ) 920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr( window->hwnd, CV_USERDATA, 0 ); 921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->frame ) 922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr( window->frame, CV_USERDATA, 0 ); 923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->toolbar.toolbar ) 925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr(window->toolbar.toolbar, CV_USERDATA, 0); 926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->prev ) 928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->prev->next = window->next; 929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hg_windows = window->next; 931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->next ) 933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->next->prev = window->prev; 934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->prev = window->next = 0; 936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->dc && window->image ) 938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DeleteObject(SelectObject(window->dc,window->image)); 939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->dc ) 941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DeleteDC(window->dc); 942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for( trackbar = window->toolbar.first; trackbar != 0; ) 944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* next = trackbar->next; 946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar->hwnd ) 947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr( trackbar->hwnd, CV_USERDATA, 0 ); 949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvFree( &trackbar ); 950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar = next; 952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvFree( &window ); 955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 958793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvDestroyWindow( const char* name ) 959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvDestroyWindow" ); 961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND mainhWnd; 966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!name) 968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name string" ); 969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( name ); 971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window ) 972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mainhWnd = window->frame; 975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->hwnd, WM_CLOSE, 0, 0); 977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage( mainhWnd, WM_CLOSE, 0, 0); 978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Do NOT call _remove_window -- CvWindow list will be updated automatically ... 979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvScreenToClient( HWND hwnd, RECT* rect ) 985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler POINT p; 987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler p.x = rect->left; 988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler p.y = rect->top; 989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ScreenToClient(hwnd, &p); 990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OffsetRect( rect, p.x - rect->left, p.y - rect->top ); 991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Calculatess the window coordinates relative to the upper left corner of the mainhWnd window */ 995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic RECT icvCalcWindowRect( CvWindow* window ) 996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const int gutter = 1; 998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT crect, trect, rect; 999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler assert(window); 1001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(window->frame, &crect); 1003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->toolbar.toolbar) 1004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->toolbar.toolbar, &trect); 1006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvScreenToClient(window->frame, &trect); 1007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SubtractRect( &rect, &crect, &trect); 1008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect = crect; 1011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.top += gutter; 1013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.left += gutter; 1014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.bottom -= gutter; 1015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.right -= gutter; 1016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return rect; 1018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// returns TRUE if there is a problem such as ERROR_IO_PENDING. 1021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic bool icvGetBitmapData( CvWindow* window, SIZE* size, int* channels, void** data ) 1022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BITMAP bmp; 1024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GdiFlush(); 1025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HGDIOBJ h = GetCurrentObject( window->dc, OBJ_BITMAP ); 1026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( size ) 1027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size->cx = size->cy = 0; 1028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( data ) 1029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *data = 0; 1030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (h == NULL) 1032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return true; 1033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (GetObject(h, sizeof(bmp), &bmp) == 0) 1034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return true; 1035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( size ) 1037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size->cx = abs(bmp.bmWidth); 1039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size->cy = abs(bmp.bmHeight); 1040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( channels ) 1043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *channels = bmp.bmBitsPixel/8; 1044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( data ) 1046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *data = bmp.bmBits; 1047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return false; 1049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvUpdateWindowPos( CvWindow* window ) 1053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler assert(window); 1056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( (window->flags & CV_WINDOW_AUTOSIZE) && window->image ) 1058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 1060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE size = {0,0}; 1061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvGetBitmapData( window, &size, 0, 0 ); 1062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Repeat two times because after the first resizing of the mainhWnd window 1064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // toolbar may resize too 1065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for(i = 0; i < (window->toolbar.toolbar ? 2 : 1); i++) 1066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rmw, rw = icvCalcWindowRect(window ); 1068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(window->hwnd, rw.left, rw.top, 1069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rw.right - rw.left + 1, rw.bottom - rw.top + 1, FALSE); 1070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(window->hwnd, &rw); 1071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->frame, &rmw); 1072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Resize the mainhWnd window in order to make the bitmap fit into the child window 1073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(window->frame, rmw.left, rmw.top, 1074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rmw.right - rmw.left + size.cx - rw.right + rw.left, 1075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rmw.bottom - rmw.top + size.cy - rw.bottom + rw.top, TRUE ); 1076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect = icvCalcWindowRect(window); 1080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(window->hwnd, rect.left, rect.top, 1081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.right - rect.left + 1, 1082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.bottom - rect.top + 1, TRUE ); 1083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1085793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void 1086793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvShowImage( const char* name, const CvArr* arr ) 1087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvShowImage" ); 1089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 1091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 1093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE size = { 0, 0 }; 1094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int channels = 0; 1095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* dst_ptr = 0; 1096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const int channels0 = 3; 1097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int origin = 0; 1098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvMat stub, dst, *image; 1099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool changed_size = false; // philipg 1100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !name ) 1102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name" ); 1103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(name); 1105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!window) 1106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvNamedWindow(name, CV_WINDOW_AUTOSIZE); 1108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(name); 1109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window || !arr ) 1112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; // keep silence here. 1113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( CV_IS_IMAGE_HDR( arr )) 1115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler origin = ((IplImage*)arr)->origin; 1116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_CALL( image = cvGetMat( arr, &stub )); 1118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 1120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->useGl) 1121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cv::imshow(name, cv::cvarrToMat(image)); 1123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->image) 1128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // if there is something wrong with these system calls, we cannot display image... 1129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (icvGetBitmapData( window, &size, &channels, &dst_ptr )) 1130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( size.cx != image->width || size.cy != image->height || channels != channels0 ) 1133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler changed_size = true; 1135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uchar buffer[sizeof(BITMAPINFO) + 255*sizeof(RGBQUAD)]; 1137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BITMAPINFO* binfo = (BITMAPINFO*)buffer; 1138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DeleteObject( SelectObject( window->dc, window->image )); 1140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->image = 0; 1141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size.cx = image->width; 1143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size.cy = image->height; 1144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler channels = channels0; 1145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler FillBitmapInfo( binfo, size.cx, size.cy, channels*8, 1 ); 1147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->image = SelectObject( window->dc, CreateDIBSection(window->dc, binfo, 1149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DIB_RGB_COLORS, &dst_ptr, 0, 0)); 1150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvInitMatHeader( &dst, size.cy, size.cx, CV_8UC3, 1153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler dst_ptr, (size.cx * channels + 3) & -4 ); 1154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvConvertImage( image, &dst, origin == 0 ? CV_CVTIMG_FLIP : 0 ); 1155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // ony resize window if needed 1157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (changed_size) 1158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateWindowPos(window); 1159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler InvalidateRect(window->hwnd, 0, 0); 1160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // philipg: this is not needed and just slows things down 1161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // UpdateWindow(window->hwnd); 1162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 1164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if 0 1167793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void 1168793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvShowImageHWND(HWND w_hWnd, const CvArr* arr) 1169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvShowImageHWND" ); 1171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 1173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE size = { 0, 0 }; 1175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int channels = 0; 1176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* dst_ptr = 0; 1177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const int channels0 = 3; 1178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int origin = 0; 1179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvMat stub, dst, *image; 1180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool changed_size = false; 1181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BITMAPINFO tempbinfo; 1182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HDC hdc = NULL; 1183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !arr ) 1185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 1186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !w_hWnd ) 1187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 1188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hdc = GetDC(w_hWnd); 1190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( CV_IS_IMAGE_HDR( arr ) ) 1192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler origin = ((IplImage*)arr)->origin; 1193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_CALL( image = cvGetMat( arr, &stub ) ); 1195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ( hdc ) 1197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //GetBitmapData 1199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BITMAP bmp; 1200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GdiFlush(); 1201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HGDIOBJ h = GetCurrentObject( hdc, OBJ_BITMAP ); 1202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (h == NULL) 1204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 1205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (GetObject(h, sizeof(bmp), &bmp) == 0) //GetObject(): returns size of object, 0 if error 1206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 1207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler channels = bmp.bmBitsPixel/8; 1209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler dst_ptr = bmp.bmBits; 1210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( size.cx != image->width || size.cy != image->height || channels != channels0 ) 1213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler changed_size = true; 1215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uchar buffer[sizeof(BITMAPINFO) + 255*sizeof(RGBQUAD)]; 1217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BITMAPINFO* binfo = (BITMAPINFO*)buffer; 1218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BOOL bDeleteObj = DeleteObject(GetCurrentObject(hdc, OBJ_BITMAP)); 1220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_Assert( FALSE != bDeleteObj ); 1221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size.cx = image->width; 1223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size.cy = image->height; 1224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler channels = channels0; 1225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler FillBitmapInfo( binfo, size.cx, size.cy, channels*8, 1 ); 1227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SelectObject( hdc, CreateDIBSection( hdc, binfo, DIB_RGB_COLORS, &dst_ptr, 0, 0)); 1229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvInitMatHeader( &dst, size.cy, size.cx, CV_8UC3, dst_ptr, (size.cx * channels + 3) & -4 ); 1232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cvConvertImage( image, &dst, origin == 0 ? CV_CVTIMG_FLIP : 0 ); 1233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Image stretching to fit the window 1235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(w_hWnd, &rect); 1237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler StretchDIBits( hdc, 0, 0, rect.right, rect.bottom, 0, 0, image->width, image->height, dst_ptr, &tempbinfo, DIB_RGB_COLORS, SRCCOPY ); 1238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // ony resize window if needed 1240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler InvalidateRect(w_hWnd, 0, 0); 1241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 1243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1246793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvResizeWindow(const char* name, int width, int height ) 1247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvResizeWindow" ); 1249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 1251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 1253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 1254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rmw, rw, rect; 1255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !name ) 1257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name" ); 1258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(name); 1260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!window) 1261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 1262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Repeat two times because after the first resizing of the mainhWnd window 1264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // toolbar may resize too 1265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for(i = 0; i < (window->toolbar.toolbar ? 2 : 1); i++) 1266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rw = icvCalcWindowRect(window); 1268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(window->hwnd, rw.left, rw.top, 1269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rw.right - rw.left + 1, rw.bottom - rw.top + 1, FALSE); 1270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(window->hwnd, &rw); 1271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->frame, &rmw); 1272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Resize the mainhWnd window in order to make the bitmap fit into the child window 1273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(window->frame, rmw.left, rmw.top, 1274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rmw.right - rmw.left + width - rw.right + rw.left, 1275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rmw.bottom - rmw.top + height - rw.bottom + rw.top, TRUE); 1276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect = icvCalcWindowRect(window); 1279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(window->hwnd, rect.left, rect.top, 1280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE); 1281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 1283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1286793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvMoveWindow( const char* name, int x, int y ) 1287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvMoveWindow" ); 1289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 1291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 1293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !name ) 1296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL name" ); 1297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(name); 1299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!window) 1300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 1301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect( window->frame, &rect ); 1303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow( window->frame, x, y, rect.right - rect.left, rect.bottom - rect.top, TRUE); 1304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 1306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK 1310793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) 1311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = icvWindowByHWND( hwnd ); 1313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window ) 1314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return DefWindowProc(hwnd, uMsg, wParam, lParam); 1315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch(uMsg) 1317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_COPY: 1319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ::SendMessage(window->hwnd, uMsg, wParam, lParam); 1320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_DESTROY: 1323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvRemoveWindow(window); 1325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Do nothing!!! 1326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //PostQuitMessage(0); 1327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_GETMINMAXINFO: 1330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !(window->flags & CV_WINDOW_AUTOSIZE) ) 1331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MINMAXINFO* minmax = (MINMAXINFO*)lParam; 1333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LRESULT retval = DefWindowProc(hwnd, uMsg, wParam, lParam); 1335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler minmax->ptMinTrackSize.y = 100; 1337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler minmax->ptMinTrackSize.x = 100; 1338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->toolbar.first ) 1340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect( window->toolbar.first->hwnd, &rect ); 1342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler minmax->ptMinTrackSize.y += window->toolbar.rows*(rect.bottom - rect.top); 1343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler minmax->ptMinTrackSize.x = MAX(rect.right - rect.left + HG_BUDDY_WIDTH, HG_BUDDY_WIDTH*2); 1344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return retval; 1346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_WINDOWPOSCHANGED: 1350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WINDOWPOS* pos = (WINDOWPOS*)lParam; 1352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Update the toolbar pos/size 1354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->toolbar.toolbar) 1355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->toolbar.toolbar, &rect); 1358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(window->toolbar.toolbar, 0, 0, pos->cx, rect.bottom - rect.top, TRUE); 1359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!(window->flags & CV_WINDOW_AUTOSIZE)) 1362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateWindowPos(window); 1363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_WINDOWPOSCHANGING: 1368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Snap window to screen edges with multi-monitor support. // Adi Shavit 1370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LPWINDOWPOS pos = (LPWINDOWPOS)lParam; 1371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->frame, &rect); 1374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HMONITOR hMonitor; 1376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST); 1377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MONITORINFO mi; 1379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mi.cbSize = sizeof(mi); 1380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetMonitorInfo(hMonitor, &mi); 1381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const int SNAP_DISTANCE = 15; 1383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (abs(pos->x - mi.rcMonitor.left) <= SNAP_DISTANCE) 1385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->x = mi.rcMonitor.left; // snap to left edge 1386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (abs(pos->x + pos->cx - mi.rcMonitor.right) <= SNAP_DISTANCE) 1388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->x = mi.rcMonitor.right - pos->cx; // snap to right edge 1389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (abs(pos->y - mi.rcMonitor.top) <= SNAP_DISTANCE) 1391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->y = mi.rcMonitor.top; // snap to top edge 1392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (abs(pos->y + pos->cy - mi.rcMonitor.bottom) <= SNAP_DISTANCE) 1394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->y = mi.rcMonitor.bottom - pos->cy; // snap to bottom edge 1395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_ACTIVATE: 1398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) 1399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetFocus(window->hwnd); 1400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_MOUSEWHEEL: 1403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_MOUSEHWHEEL: 1404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->on_mouse ) 1405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int flags = (wParam & MK_LBUTTON ? CV_EVENT_FLAG_LBUTTON : 0)| 1407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_RBUTTON ? CV_EVENT_FLAG_RBUTTON : 0)| 1408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_MBUTTON ? CV_EVENT_FLAG_MBUTTON : 0)| 1409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_CONTROL ? CV_EVENT_FLAG_CTRLKEY : 0)| 1410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_SHIFT ? CV_EVENT_FLAG_SHIFTKEY : 0)| 1411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (GetKeyState(VK_MENU) < 0 ? CV_EVENT_FLAG_ALTKEY : 0); 1412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int event = (uMsg == WM_MOUSEWHEEL ? CV_EVENT_MOUSEWHEEL : CV_EVENT_MOUSEHWHEEL); 1413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Set the wheel delta of mouse wheel to be in the upper word of 'event' 1415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int delta = GET_WHEEL_DELTA_WPARAM(wParam); 1416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler flags |= (delta << 16); 1417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler POINT pt; 1419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pt.x = GET_X_LPARAM( lParam ); 1420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pt.y = GET_Y_LPARAM( lParam ); 1421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ::ScreenToClient(hwnd, &pt); // Convert screen coordinates to client coordinates. 1422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect( window->hwnd, &rect ); 1425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE size = {0,0}; 1427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvGetBitmapData( window, &size, 0, 0 ); 1428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse( event, pt.x*size.cx/MAX(rect.right - rect.left,1), 1430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pt.y*size.cy/MAX(rect.bottom - rect.top,1), flags, 1431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse_param ); 1432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_ERASEBKGND: 1436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT cr, tr, wrc; 1438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HRGN rgn, rgn1, rgn2; 1439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int ret; 1440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HDC hdc = (HDC)wParam; 1441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->hwnd, &cr); 1442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvScreenToClient(window->frame, &cr); 1443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->toolbar.toolbar) 1444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowRect(window->toolbar.toolbar, &tr); 1446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvScreenToClient(window->frame, &tr); 1447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tr.left = tr.top = tr.right = tr.bottom = 0; 1450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(window->frame, &wrc); 1452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rgn = CreateRectRgn(0, 0, wrc.right, wrc.bottom); 1454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rgn1 = CreateRectRgn(cr.left, cr.top, cr.right, cr.bottom); 1455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rgn2 = CreateRectRgn(tr.left, tr.top, tr.right, tr.bottom); 1456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ret = CombineRgn(rgn, rgn, rgn1, RGN_DIFF); 1457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ret = CombineRgn(rgn, rgn, rgn2, RGN_DIFF); 1458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(ret != NULLREGION && ret != ERROR) 1460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler FillRgn(hdc, rgn, (HBRUSH)icvGetClassLongPtr(hwnd, CV_HBRBACKGROUND)); 1461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DeleteObject(rgn); 1463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DeleteObject(rgn1); 1464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DeleteObject(rgn2); 1465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 1; 1467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return DefWindowProc(hwnd, uMsg, wParam, lParam); 1470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK HighGUIProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) 1474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = icvWindowByHWND(hwnd); 1476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window ) 1477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // This window is not mentioned in HighGUI storage 1478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Actually, this should be error except for the case of calls to CreateWindow 1479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return DefWindowProc(hwnd, uMsg, wParam, lParam); 1480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Process the message 1482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch(uMsg) 1483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_COPY: 1485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!::OpenClipboard(hwnd) ) 1487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HDC hDC = 0; 1490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HDC memDC = 0; 1491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HBITMAP memBM = 0; 1492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // We'll use a do-while(0){} scope as a single-run breakable scope 1494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Upon any error we can jump out of the single-time while scope to clean up the resources. 1495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler do 1496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!::EmptyClipboard()) 1498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!window->image) 1501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Get window device context 1504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (0 == (hDC = ::GetDC(hwnd))) 1505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Create another DC compatible with hDC 1508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (0 == (memDC = ::CreateCompatibleDC( hDC ))) 1509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Determine the bitmap's dimensions 1512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int nchannels = 3; 1513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE size = {0,0}; 1514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvGetBitmapData( window, &size, &nchannels, 0 ); 1515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Create bitmap to draw on and it in the new DC 1517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (0 == (memBM = ::CreateCompatibleBitmap ( hDC, size.cx, size.cy))) 1518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!::SelectObject( memDC, memBM )) 1521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Begin drawing to DC 1524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!::SetStretchBltMode(memDC, COLORONCOLOR)) 1525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RGBQUAD table[256]; 1528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( 1 == nchannels ) 1529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for(int i = 0; i < 256; ++i) 1531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler table[i].rgbBlue = (unsigned char)i; 1533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler table[i].rgbGreen = (unsigned char)i; 1534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler table[i].rgbRed = (unsigned char)i; 1535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!::SetDIBColorTable(window->dc, 0, 255, table)) 1537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // The image copied to the clipboard will be in its original size, regardless if the window itself was resized. 1541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Render the image to the dc/bitmap (at original size). 1543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!::BitBlt( memDC, 0, 0, size.cx, size.cy, window->dc, 0, 0, SRCCOPY )) 1544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Finally, set bitmap to clipboard 1547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ::SetClipboardData(CF_BITMAP, memBM); 1548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } while (0,0); // (0,0) instead of (0) to avoid MSVC compiler warning C4127: "conditional expression is constant" 1549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ////////////////////////////////////////////////////////////////////////// 1551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // if handle is allocated (i.e. != 0) then clean-up. 1552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (memBM) ::DeleteObject(memBM); 1553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (memDC) ::DeleteDC(memDC); 1554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (hDC) ::ReleaseDC(hwnd, hDC); 1555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ::CloseClipboard(); 1556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_WINDOWPOSCHANGING: 1560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LPWINDOWPOS pos = (LPWINDOWPOS)lParam; 1562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect = icvCalcWindowRect(window); 1563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->x = rect.left; 1564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->y = rect.top; 1565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->cx = rect.right - rect.left + 1; 1566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos->cy = rect.bottom - rect.top + 1; 1567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_LBUTTONDOWN: 1571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_RBUTTONDOWN: 1572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_MBUTTONDOWN: 1573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_LBUTTONDBLCLK: 1574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_RBUTTONDBLCLK: 1575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_MBUTTONDBLCLK: 1576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_LBUTTONUP: 1577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_RBUTTONUP: 1578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_MBUTTONUP: 1579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_MOUSEMOVE: 1580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->on_mouse ) 1581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler POINT pt; 1583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int flags = (wParam & MK_LBUTTON ? CV_EVENT_FLAG_LBUTTON : 0)| 1585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_RBUTTON ? CV_EVENT_FLAG_RBUTTON : 0)| 1586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_MBUTTON ? CV_EVENT_FLAG_MBUTTON : 0)| 1587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_CONTROL ? CV_EVENT_FLAG_CTRLKEY : 0)| 1588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (wParam & MK_SHIFT ? CV_EVENT_FLAG_SHIFTKEY : 0)| 1589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (GetKeyState(VK_MENU) < 0 ? CV_EVENT_FLAG_ALTKEY : 0); 1590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int event = uMsg == WM_LBUTTONDOWN ? CV_EVENT_LBUTTONDOWN : 1591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_RBUTTONDOWN ? CV_EVENT_RBUTTONDOWN : 1592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_MBUTTONDOWN ? CV_EVENT_MBUTTONDOWN : 1593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_LBUTTONUP ? CV_EVENT_LBUTTONUP : 1594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_RBUTTONUP ? CV_EVENT_RBUTTONUP : 1595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_MBUTTONUP ? CV_EVENT_MBUTTONUP : 1596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_LBUTTONDBLCLK ? CV_EVENT_LBUTTONDBLCLK : 1597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_RBUTTONDBLCLK ? CV_EVENT_RBUTTONDBLCLK : 1598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uMsg == WM_MBUTTONDBLCLK ? CV_EVENT_MBUTTONDBLCLK : 1599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_EVENT_MOUSEMOVE; 1600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN || uMsg == WM_MBUTTONDOWN ) 1601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetCapture( hwnd ); 1602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONUP || uMsg == WM_MBUTTONUP ) 1603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ReleaseCapture(); 1604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pt.x = GET_X_LPARAM( lParam ); 1606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pt.y = GET_Y_LPARAM( lParam ); 1607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->flags & CV_WINDOW_AUTOSIZE) 1609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // As user can't change window size, do not scale window coordinates. Underlying windowing system 1611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // may prevent full window from being displayed and in this case coordinates should not be scaled. 1612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse( event, pt.x, pt.y, flags, window->on_mouse_param ); 1613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 1614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Full window is displayed using different size. Scale coordinates to match underlying positions. 1615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE size = {0, 0}; 1617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect( window->hwnd, &rect ); 1619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvGetBitmapData( window, &size, 0, 0 ); 1620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse( event, pt.x*size.cx/MAX(rect.right - rect.left,1), 1622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pt.y*size.cy/MAX(rect.bottom - rect.top,1), flags, 1623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse_param ); 1624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_PAINT: 1629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->image != 0) 1630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int nchannels = 3; 1632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE size = {0,0}; 1633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PAINTSTRUCT paint; 1634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HDC hdc; 1635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RGBQUAD table[256]; 1636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Determine the bitmap's dimensions 1638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvGetBitmapData( window, &size, &nchannels, 0 ); 1639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hdc = BeginPaint(hwnd, &paint); 1641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetStretchBltMode(hdc, COLORONCOLOR); 1642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( nchannels == 1 ) 1644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 1646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for(i = 0; i < 256; i++) 1647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler table[i].rgbBlue = (unsigned char)i; 1649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler table[i].rgbGreen = (unsigned char)i; 1650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler table[i].rgbRed = (unsigned char)i; 1651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetDIBColorTable(window->dc, 0, 255, table); 1653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->flags & CV_WINDOW_AUTOSIZE) 1656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BitBlt( hdc, 0, 0, size.cx, size.cy, window->dc, 0, 0, SRCCOPY ); 1658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(window->hwnd, &rect); 1663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler StretchBlt( hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, 1664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->dc, 0, 0, size.cx, size.cy, SRCCOPY ); 1665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //DeleteDC(hdc); 1667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EndPaint(hwnd, &paint); 1668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 1670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if(window->useGl) 1671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler drawGl(window); 1673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return DefWindowProc(hwnd, uMsg, wParam, lParam); 1674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return DefWindowProc(hwnd, uMsg, wParam, lParam); 1679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 0; 1681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_ERASEBKGND: 1683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->image) 1684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 0; 1685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_DESTROY: 1688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvRemoveWindow(window); 1690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Do nothing!!! 1691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //PostQuitMessage(0); 1692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_SETCURSOR: 1695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetCursor((HCURSOR)icvGetClassLongPtr(hwnd, CV_HCURSOR)); 1696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 0; 1697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_KEYDOWN: 1699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->last_key = (int)wParam; 1700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 0; 1701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_SIZE: 1703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->width = LOWORD(lParam); 1704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->height = HIWORD(lParam); 1705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL 1707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window->useGl) 1708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler resizeGl(window); 1709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return DefWindowProc(hwnd, uMsg, wParam, lParam); 1713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) 1717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LRESULT ret; 1719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( hg_on_preprocess ) 1721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int was_processed = 0; 1723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int rethg = hg_on_preprocess(hwnd, uMsg, wParam, lParam, &was_processed); 1724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( was_processed ) 1725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return rethg; 1726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ret = HighGUIProc(hwnd, uMsg, wParam, lParam); 1728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(hg_on_postprocess) 1730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int was_processed = 0; 1732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int rethg = hg_on_postprocess(hwnd, uMsg, wParam, lParam, &was_processed); 1733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( was_processed ) 1734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return rethg; 1735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return ret; 1738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvUpdateTrackbar( CvTrackbar* trackbar, int pos ) 1742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const int max_name_len = 10; 1744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const char* suffix = ""; 1745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char pos_text[32]; 1746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int name_len; 1747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar->data ) 1749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *trackbar->data = pos; 1750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar->pos != pos ) 1752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->pos = pos; 1754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar->notify2 ) 1755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify2(pos, trackbar->userdata); 1756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar->notify ) 1757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify(pos); 1758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler name_len = (int)strlen(trackbar->name); 1760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( name_len > max_name_len ) 1762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int start_len = max_name_len*2/3; 1764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int end_len = max_name_len - start_len - 2; 1765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memcpy( pos_text, trackbar->name, start_len ); 1766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memcpy( pos_text + start_len, "...", 3 ); 1767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memcpy( pos_text + start_len + 3, trackbar->name + name_len - end_len, end_len + 1 ); 1768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memcpy( pos_text, trackbar->name, name_len + 1); 1772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler sprintf( pos_text + strlen(pos_text), "%s: %d\n", suffix, pos ); 1775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetWindowText( trackbar->buddy, pos_text ); 1776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK HGToolbarProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) 1781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = icvWindowByHWND( hwnd ); 1783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!window) 1784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return DefWindowProc(hwnd, uMsg, wParam, lParam); 1785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Control messages processing 1787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch(uMsg) 1788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Slider processing 1790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_HSCROLL: 1791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND slider = (HWND)lParam; 1793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int pos = (int)SendMessage(slider, TBM_GETPOS, 0, 0); 1794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = icvTrackbarByHWND( slider ); 1795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar ) 1797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar->pos != pos ) 1799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateTrackbar( trackbar, pos ); 1800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SetFocus( window->hwnd ); 1803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return 0; 1804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_NCCALCSIZE: 1807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LRESULT ret = CallWindowProc(window->toolbar.toolBarProc, hwnd, uMsg, wParam, lParam); 1809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int rows = (int)SendMessage(hwnd, TB_GETROWS, 0, 0); 1810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(window->toolbar.rows != rows) 1812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0); 1814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = window->toolbar.first; 1815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for( ; trackbar != 0; trackbar = trackbar->next ) 1817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 1819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_GETITEMRECT, 1820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (WPARAM)trackbar->id, (LPARAM)&rect); 1821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(trackbar->hwnd, rect.left + HG_BUDDY_WIDTH, rect.top, 1822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.right - rect.left - HG_BUDDY_WIDTH, 1823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.bottom - rect.top, FALSE); 1824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow(trackbar->buddy, rect.left, rect.top, 1825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HG_BUDDY_WIDTH, rect.bottom - rect.top, FALSE); 1826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.rows = rows; 1828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return ret; 1830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return CallWindowProc(window->toolbar.toolBarProc, hwnd, uMsg, wParam, lParam); 1834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1837793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void 1838793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvDestroyAllWindows(void) 1839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = hg_windows; 1841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while( window ) 1843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND mainhWnd = window->frame; 1845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HWND hwnd = window->hwnd; 1846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = window->next; 1847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage( hwnd, WM_CLOSE, 0, 0 ); 1849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage( mainhWnd, WM_CLOSE, 0, 0 ); 1850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void showSaveDialog(CvWindow* window) 1854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!window || !window->image) 1856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZE sz; 1859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int channels; 1860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* data; 1861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (icvGetBitmapData(window, &sz, &channels, &data)) 1862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; // nothing to save 1863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char szFileName[MAX_PATH] = ""; 1865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // try to use window title as file name 1866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetWindowText(window->frame, szFileName, MAX_PATH); 1867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OPENFILENAME ofn; 1869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ZeroMemory(&ofn, sizeof(ofn)); 1870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef OPENFILENAME_SIZE_VERSION_400 1871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // we are not going to use new fields any way 1872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; 1873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 1874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.lStructSize = sizeof(ofn); 1875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.hwndOwner = window->hwnd; 1877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.lpstrFilter = "Portable Network Graphics files (*.png)\0*.png\0" 1878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "JPEG files (*.jpeg;*.jpg;*.jpe)\0*.jpeg;*.jpg;*.jpe\0" 1879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Windows bitmap (*.bmp;*.dib)\0*.bmp;*.dib\0" 1880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "TIFF Files (*.tiff;*.tif)\0*.tiff;*.tif\0" 1881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "JPEG-2000 files (*.jp2)\0*.jp2\0" 1882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "WebP files (*.webp)\0*.webp\0" 1883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Portable image format (*.pbm;*.pgm;*.ppm;*.pxm;*.pnm)\0*.pbm;*.pgm;*.ppm;*.pxm;*.pnm\0" 1884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "OpenEXR Image files (*.exr)\0*.exr\0" 1885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Radiance HDR (*.hdr;*.pic)\0*.hdr;*.pic\0" 1886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Sun raster files (*.sr;*.ras)\0*.sr;*.ras\0" 1887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "All Files (*.*)\0*.*\0"; 1888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.lpstrFile = szFileName; 1889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.nMaxFile = MAX_PATH; 1890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOREADONLYRETURN | OFN_NOCHANGEDIR; 1891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ofn.lpstrDefExt = "png"; 1892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (GetSaveFileName(&ofn)) 1894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cv::Mat tmp; cv::flip(cv::Mat(sz.cy, sz.cx, CV_8UC(channels), data), tmp, 0); 1896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cv::imwrite(szFileName, tmp); 1897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1900793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int 1901793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvWaitKey( int delay ) 1902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int time0 = GetTickCount(); 1904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for(;;) 1906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 1908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MSG message; 1909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int is_processed = 0; 1910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 ) 1912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return -1; 1913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( delay <= 0 ) 1915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetMessage(&message, 0, 0, 0); 1916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE ) 1917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Sleep(1); 1919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler continue; 1920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for( window = hg_windows; window != 0 && is_processed == 0; window = window->next ) 1923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window->hwnd == message.hwnd || window->frame == message.hwnd ) 1925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler is_processed = 1; 1927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch(message.message) 1928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_DESTROY: 1930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_CHAR: 1931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DispatchMessage(&message); 1932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (int)message.wParam; 1933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_SYSKEYDOWN: 1935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( message.wParam == VK_F10 ) 1936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler is_processed = 1; 1938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (int)(message.wParam << 16); 1939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case WM_KEYDOWN: 1943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TranslateMessage(&message); 1944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( (message.wParam >= VK_F1 && message.wParam <= VK_F24) || 1945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler message.wParam == VK_HOME || message.wParam == VK_END || 1946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler message.wParam == VK_UP || message.wParam == VK_DOWN || 1947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler message.wParam == VK_LEFT || message.wParam == VK_RIGHT || 1948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler message.wParam == VK_INSERT || message.wParam == VK_DELETE || 1949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler message.wParam == VK_PRIOR || message.wParam == VK_NEXT ) 1950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DispatchMessage(&message); 1952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler is_processed = 1; 1953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (int)(message.wParam << 16); 1954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Intercept Ctrl+C for copy to clipboard 1957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ('C' == message.wParam && (::GetKeyState(VK_CONTROL)>>15)) 1958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ::SendMessage(message.hwnd, WM_COPY, 0, 0); 1959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Intercept Ctrl+S for "save as" dialog 1961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ('S' == message.wParam && (::GetKeyState(VK_CONTROL)>>15)) 1962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler showSaveDialog(window); 1963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler default: 1965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DispatchMessage(&message); 1966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler is_processed = 1; 1967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 1968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !is_processed ) 1973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TranslateMessage(&message); 1975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DispatchMessage(&message); 1976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvTrackbar* 1982793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvFindTrackbarByName( const CvWindow* window, const char* name ) 1983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = window->toolbar.first; 1985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for( ; trackbar != 0 && strcmp( trackbar->name, name ) != 0; trackbar = trackbar->next ) 1987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ; 1988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return trackbar; 1990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int 1994793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvCreateTrackbar( const char* trackbar_name, const char* window_name, 1995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int* val, int count, CvTrackbarCallback on_notify, 1996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbarCallback2 on_notify2, void* userdata ) 1997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int result = 0; 1999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "icvCreateTrackbar" ); 2001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 2003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char slider_name[32]; 2005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = 0; 2006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = 0; 2007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int pos = 0; 2008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window_name || !trackbar_name ) 2010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL window or trackbar name" ); 2011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( count < 0 ) 2013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsOutOfRange, "Bad trackbar maximal value" ); 2014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(window_name); 2016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window ) 2017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 2018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar = icvFindTrackbarByName(window,trackbar_name); 2020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !trackbar ) 2021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TBBUTTON tbs = {0}; 2023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TBBUTTONINFO tbis = {0}; 2024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RECT rect; 2025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int bcount; 2026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int len = (int)strlen( trackbar_name ); 2027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // create toolbar if it is not created yet 2029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window->toolbar.toolbar ) 2030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const int default_height = 30; 2032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // CreateToolbarEx is deprecated and forces linking against Comctl32.lib. 2034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.toolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, 2035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON, 2036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, 0, 0, 0, 2037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->frame, NULL, GetModuleHandle(NULL), NULL); 2038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // CreateToolbarEx automatically sends this but CreateWindowEx doesn't. 2039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); 2040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(window->frame, &rect); 2042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MoveWindow( window->toolbar.toolbar, 0, 0, 2043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.right - rect.left, default_height, TRUE); 2044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_AUTOSIZE, 0, 0); 2045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowWindow(window->toolbar.toolbar, SW_SHOW); 2046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.first = 0; 2048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.pos = 0; 2049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.rows = 0; 2050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.toolBarProc = 2051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (WNDPROC)icvGetWindowLongPtr(window->toolbar.toolbar, CV_WNDPROC); 2052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateWindowPos(window); 2054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Subclassing from toolbar 2056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr(window->toolbar.toolbar, CV_WNDPROC, HGToolbarProc); 2057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr(window->toolbar.toolbar, CV_USERDATA, window); 2058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Retrieve current buttons count */ 2061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bcount = (int)SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0); 2062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(bcount > 1) 2064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* If this is not the first button then we need to 2066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler separate it from the previous one */ 2067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.iBitmap = 0; 2068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.idCommand = bcount; // Set button id to it's number 2069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.iString = 0; 2070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.fsStyle = TBSTYLE_SEP; 2071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.fsState = TBSTATE_ENABLED; 2072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_ADDBUTTONS, 1, (LPARAM)&tbs); 2073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Retrieve current buttons count 2075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bcount = (int)SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0); 2076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Add a button which we're going to cover with the slider */ 2079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.iBitmap = 0; 2080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.idCommand = bcount; // Set button id to it's number 2081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.fsState = TBSTATE_ENABLED; 2082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if 0/*!defined WIN64 && !defined EM64T*/ 2083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.fsStyle = 0; 2084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.iString = 0; 2085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 2086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBSTYLE_AUTOSIZE 2088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TBSTYLE_AUTOSIZE 0x0010 2089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 2090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBSTYLE_GROUP 2092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TBSTYLE_GROUP 0x0004 2093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 2094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //tbs.fsStyle = TBSTYLE_AUTOSIZE; 2095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.fsStyle = TBSTYLE_GROUP; 2096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbs.iString = (INT_PTR)trackbar_text; 2097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 2098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_ADDBUTTONS, 1, (LPARAM)&tbs); 2099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Adjust button size to the slider */ 2101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbis.cbSize = sizeof(tbis); 2102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbis.dwMask = TBIF_SIZE; 2103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler GetClientRect(window->hwnd, &rect); 2105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tbis.cx = (unsigned short)(rect.right - rect.left); 2106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_SETBUTTONINFO, 2108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (WPARAM)tbs.idCommand, (LPARAM)&tbis); 2109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Get button pos */ 2111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_GETITEMRECT, 2112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (WPARAM)tbs.idCommand, (LPARAM)&rect); 2113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Create a slider */ 2115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar = (CvTrackbar*)cvAlloc( sizeof(CvTrackbar) + len + 1 ); 2116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->signature = CV_TRACKBAR_MAGIC_VAL; 2117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify = 0; 2118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify2 = 0; 2119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->parent = window; 2120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->pos = 0; 2121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->data = 0; 2122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->id = bcount; 2123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->next = window->toolbar.first; 2124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->name = (char*)(trackbar + 1); 2125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler memcpy( trackbar->name, trackbar_name, len + 1 ); 2126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.first = trackbar; 2127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler sprintf(slider_name, "Trackbar%p", val); 2129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->hwnd = CreateWindowEx(0, TRACKBAR_CLASS, slider_name, 2130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WS_CHILD | WS_VISIBLE | TBS_AUTOTICKS | 2131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TBS_FIXEDLENGTH | TBS_HORZ | TBS_BOTTOM, 2132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.left + HG_BUDDY_WIDTH, rect.top, 2133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.right - rect.left - HG_BUDDY_WIDTH, 2134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.bottom - rect.top, window->toolbar.toolbar, 2135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (HMENU)(size_t)bcount, hg_hinstance, 0); 2136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler sprintf(slider_name,"Buddy%p", val); 2138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->buddy = CreateWindowEx(0, "STATIC", slider_name, 2139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WS_CHILD | SS_RIGHT, 2140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rect.left, rect.top, 2141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler HG_BUDDY_WIDTH, rect.bottom - rect.top, 2142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->toolbar.toolbar, 0, hg_hinstance, 0); 2143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvSetWindowLongPtr( trackbar->hwnd, CV_USERDATA, trackbar ); 2145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Minimize the number of rows */ 2147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage( window->toolbar.toolbar, TB_SETROWS, 2148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAKEWPARAM(1, FALSE), (LPARAM)&rect ); 2149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 2151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->data = 0; 2153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify = 0; 2154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify2 = 0; 2155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->maxval = count; 2158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Adjust slider parameters */ 2160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(trackbar->hwnd, TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0); 2161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(trackbar->hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, (LPARAM)count); 2162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(trackbar->hwnd, TBM_SETTICFREQ, (WPARAM)1, (LPARAM)0 ); 2163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( val ) 2164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos = *val; 2165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(trackbar->hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos ); 2167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(window->toolbar.toolbar, TB_AUTOSIZE, 0, 0); 2168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->pos = -1; 2170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateTrackbar( trackbar, pos ); 2171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowWindow( trackbar->buddy, SW_SHOW ); 2172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowWindow( trackbar->hwnd, SW_SHOW ); 2173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify = on_notify; 2175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->notify2 = on_notify2; 2176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->userdata = userdata; 2177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->data = val; 2178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Resize the window to reflect the toolbar resizing*/ 2180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateWindowPos(window); 2181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler result = 1; 2183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 2185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result; 2187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2189793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int 2190793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvCreateTrackbar( const char* trackbar_name, const char* window_name, 2191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int* val, int count, CvTrackbarCallback on_notify ) 2192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return icvCreateTrackbar( trackbar_name, window_name, val, count, 2194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler on_notify, 0, 0 ); 2195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2197793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int 2198793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvCreateTrackbar2( const char* trackbar_name, const char* window_name, 2199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int* val, int count, CvTrackbarCallback2 on_notify2, 2200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* userdata ) 2201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return icvCreateTrackbar( trackbar_name, window_name, val, count, 2203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 0, on_notify2, userdata ); 2204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2206793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void 2207793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param ) 2208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvSetMouseCallback" ); 2210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 2212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = 0; 2214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window_name ) 2216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL window name" ); 2217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(window_name); 2219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( !window ) 2220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXIT; 2221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse = on_mouse; 2223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window->on_mouse_param = param; 2224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 2226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2229793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name ) 2230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int pos = -1; 2232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvGetTrackbarPos" ); 2234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 2236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 2238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = 0; 2239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar_name == 0 || window_name == 0 ) 2241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" ); 2242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( window_name ); 2244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window ) 2245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar = icvFindTrackbarByName( window, trackbar_name ); 2246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar ) 2248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos = trackbar->pos; 2249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 2251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return pos; 2253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2256793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos ) 2257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvSetTrackbarPos" ); 2259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 2261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 2263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = 0; 2264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar_name == 0 || window_name == 0 ) 2266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" ); 2267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( window_name ); 2269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window ) 2270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar = icvFindTrackbarByName( window, trackbar_name ); 2271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( trackbar ) 2273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( pos < 0 ) 2275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos = 0; 2276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( pos > trackbar->maxval ) 2278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos = trackbar->maxval; 2279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage( trackbar->hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos ); 2281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler icvUpdateTrackbar( trackbar, pos ); 2282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 2285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2288793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) 2289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvSetTrackbarMax" ); 2291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 2293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (maxval >= 0) 2295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window = 0; 2297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvTrackbar* trackbar = 0; 2298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (trackbar_name == 0 || window_name == 0) 2299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name"); 2301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName(window_name); 2304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (window) 2305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar = icvFindTrackbarByName(window, trackbar_name); 2307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (trackbar) 2308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 2309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // The position will be min(pos, maxval). 2310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler trackbar->maxval = maxval; 2311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SendMessage(trackbar->hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, (LPARAM)maxval); 2312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 2315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 2317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2320793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void* cvGetWindowHandle( const char* window_name ) 2321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void* hwnd = 0; 2323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvGetWindowHandle" ); 2325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 2327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 2329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window_name == 0 ) 2331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL window name" ); 2332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvFindWindowByName( window_name ); 2334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window ) 2335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hwnd = (void*)window->hwnd; 2336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 2338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return hwnd; 2340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2343793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL const char* cvGetWindowName( void* window_handle ) 2344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const char* window_name = ""; 2346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_FUNCNAME( "cvGetWindowName" ); 2348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __BEGIN__; 2350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CvWindow* window; 2352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window_handle == 0 ) 2354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CV_ERROR( CV_StsNullPtr, "NULL window" ); 2355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window = icvWindowByHWND( (HWND)window_handle ); 2357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if( window ) 2358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler window_name = window->name; 2359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler __END__; 2361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return window_name; 2363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2366793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void 2367793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvSetPreprocessFuncWin32_(const void* callback) 2368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hg_on_preprocess = (CvWin32WindowCallback)callback; 2370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2372793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void 2373793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvSetPostprocessFuncWin32_(const void* callback) 2374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 2375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler hg_on_postprocess = (CvWin32WindowCallback)callback; 2376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 2377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif //WIN32 2379